【发布时间】:2014-08-29 11:50:36
【问题描述】:
我的 Android 应用程序必须在运行时通过连接字符串常量来构建一个秘密字符串。我想避免内联最终字符串,因此无法从 apk 中看到它。假设我有以下两个功能:
private String getConst(int i) {
switch (i) {
case 1:
return getHardCodedConst(1);
case 2:
return getHardCodedConst(2);
case 3:
return getHardCodedConst(3);
default:
break;
}
}
private String getHardCodedConst(int i) {
final static String CONST1 = "const1";
final static String CONST2 = "const2";
final static String CONST3 = "const3";
switch (i) {
case 1:
return CONST1;
case 2:
return CONST2;
case 3:
return CONST3;
default:
break;
}
}
以下两个语句是否内联?一个比另一个好?
myString = getConst(1) + getConst(2) + getConst(3);
myString = getHardCodedConst(1) + getHardCodedConst(2) + getHardCodedConst(3);
我的代码不是那么简单,其他技巧掩盖了真正发生的事情,但这是一个重要的问题,因为如果两个语句被内联,我不知道如何避免字符串被盗。
【问题讨论】:
-
我完全不明白你这样做的目的。为什么你还有
getHardCodedConst()方法?为什么不直接返回常量?它根本没有区别,你这样做唯一得到的就是更混乱的代码。 -
为什么不直接从第一种方法返回 CONST 呢?第二个需要什么?
-
通过反汇编可以在 APK 中找到已编译的 Java 代码 - 您将需要使用另一种技术来处理您的安全性(在您使用 OAuth 2.0 对用户进行身份验证后进行某种客户端/服务器交互? )
-
那么编译器知道getConst() 中可能发生的一切吗?当其他一些事情可能发生时,它如何决定内联?它是否检查方法以查看只有 switch 语句起作用?如果我输入一个在编译时不可用的参数怎么办?我认为在其他地方使用参数集很好。不是吗?还是编译器会费心去发现我设置它的位置?
-
@P5music 是的,编译器知道一切,毕竟是编译器将您的代码转换为字节码。而且,如果您对值进行硬编码,那么在何处或如何定义变量都没有关系,而不是在您的代码中简单明了地供所有人查看。有人要做的就是对您的 APK 进行逆向工程。
标签: java android string constants inline