Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java:switch语句在创建秘密字符串时可以避免内联吗?_Java_Android_String_Constants_Inline - Fatal编程技术网

Android Java:switch语句在创建秘密字符串时可以避免内联吗?

Android Java:switch语句在创建秘密字符串时可以避免内联吗?,java,android,string,constants,inline,Java,Android,String,Constants,Inline,我的Android应用程序必须在运行时通过连接字符串常量来构建一个秘密字符串。我希望避免最后一个字符串的内联,以便从apk中看不到它。假设我有以下两个功能: private String getConst(int i) { switch (i) { case 1: return getHardCodedConst(1); case 2: return getHardCodedConst(2);

我的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);
我的代码不是那么简单,其他技巧掩盖了真正发生的事情,但这是一个重要的问题,因为如果这两个语句是内联的,我不知道如何避免字符串被盗

我希望避免最后一个字符串的内联,这样就不能从中看到它 apk

但是,您并不是仅仅通过将常量移动到另一个方法来隐藏它们,您所做的只有一个效果:它会让您的代码更加混乱,毫无理由。事实上,你想做的是不可能的。不管你做什么,代码中的所有值都可以从反向工程的APK中读取,没有任何方法可以防止这种情况发生。你只能让它更难通过

以下两个语句是否内联?一个比另一个好吗 其他的

两者完全平等,没有任何区别。如果要改进此部分,请执行以下操作:

// Declare these as constant fields
private final static String CONST1 = "const1";
private final static String CONST2 = "const2";
private final static String CONST3 = "const3";

...

// Use these constant fields directly to build your String
myString = CONST1 + CONST2 + CONST3; 
或者更好的做法是:

// Declare this as constant fields
private final static String CONST1 = "const1";
private final static String CONST2 = "const2";
private final static String CONST3 = "const3";

// Since the resulting String is build from constants it is itself also a constant
// This means we can also declare it as a constant field:
private final static String MY_STRING = CONST1 + CONST2 + CONST3;
如果不需要分别使用
CONST1
CONST2
CONST3
,则只需执行以下操作:

private final static String MY_STRING = "const1const2const3";
所有这些改进只是为了保持代码干净、可维护和可读。除此之外,这完全没有什么区别。无论您如何或在何处定义这些
字符串
,程序都将以完全相同的方式运行,但按照我建议的方式执行会使代码简单易懂,顺便说一句,这应该是优秀程序员的首要任务

实现我上面的建议可能会带来微小的性能提升,因为您不需要调用任何方法,所以开销可能会减少。只有访问字段的速度非常快



仅供参考:如果您想将敏感或重要信息存储在一个安全的位置,只有一种方法:将其存储在服务器上,然后通过web服务访问。

我完全不理解您这样做的目的。为什么您甚至有一个
getHardCodedConst()
方法?为什么不直接返回常量呢?这一点都没有区别,这样做的唯一好处是代码更加混乱。为什么不直接从第一个方法返回CONST呢?第二个需要什么?编译的Java代码可以在APK中通过反汇编找到-您需要使用另一种技术来处理您的安全性(在您使用OAuth 2.0对用户进行身份验证后进行某种类型的客户机/服务器交互?),那么编译器是否知道getConst()中可能发生的所有事情?当其他事情发生时,它如何决定内联?它是否检查该方法以查看只有switch语句起作用?如果我放置一个在编译时不可用的参数会怎么样?我认为在别处使用参数集是好的。不是吗?还是编译器会费心去发现我把它放在哪里了?@P5music是的,编译器知道一切,毕竟是编译器把代码转换成字节码的。无论在何处或如何定义变量,如果您硬编码了值,那么它只是在代码中清晰地显示出来,让每个人都能看到。所有人要做的就是对APK进行反向工程。我只关心内联,我使用其他技巧,但我必须避免内联。运行时设置的参数对在switch语句中欺骗编译器有用吗?为什么要避免它?你希望避免它会发生什么?我告诉你这没什么区别。你只是无缘无故地让你的代码变得复杂。正如我在回答中所说,没有办法阻止任何人从apk读取数据。你所做的是无用的。想象一下另一种情况:当你编译你的应用程序时,不管你做什么,字节码都会被生成,如果你添加了一个无用的方法,比如
gethardcodeconst()
那么编译器无论如何都会对其进行优化。我再说一遍:你不能阻止任何人从你的apk窃取信息,你对代码所做的任何事情都不会影响其他人窃取数据的能力。如果他们想要它,那么他们可以得到它,即使你混淆了。保持敏感数据安全的唯一方法是将它们存储在应用程序之外的服务器上,并通过web服务访问这些数据。如果您真的需要进一步研究模糊处理,则会出现模糊字符串。如果你能用手来做的话,一个模糊器可以帮你做。我甚至不明白你说“内联”是什么意思。我可以再次重申:无论你做什么都不会对编译后的APK产生影响,你可以编写1000个无用的方法和500个变量,并将你的代码分成你喜欢的任意多个部分,但这只会使你的代码变得更复杂,它不会改变APK的任何内容。我再说一遍:你不能阻止任何人从你的APK读取数据,混淆只会让它变得更难。