不要混淆 proguard 中的硬编码字符串

Posted

技术标签:

【中文标题】不要混淆 proguard 中的硬编码字符串【英文标题】:Don't obfuscate hardcoded string in proguard 【发布时间】:2014-09-03 11:53:20 【问题描述】:

我将使用 proguard 混淆我的源代码。

我的源定义了一些硬编码字符串,但我不知道如何防止 proguard 混淆我的字符串值(在下面的示例中是“tbl_people”)

public class MyDaoObject 
  public static final String TABLENAME = "tbl_people"; 
  //other database code

如果字符串被混淆,SQLite 不能使用该字符串创建表。 有很多这样的硬编码字符串。我如何配置 proguard 来做到这一点?

欢迎提出任何建议。

================================================ ===== 更新:

这是logcat:

07-13 17:55:12.310: E/androidRuntime(11148): FATAL EXCEPTION: main
07-13 17:55:12.310: E/AndroidRuntime(11148): Process: com.myapp, PID: 11148
07-13 17:55:12.310: E/AndroidRuntime(11148): java.lang.RuntimeException: Unable to create application com.myapp.AudioPhotoApplication: a.a.a.d: Could not init DAOConfig
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4470)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.ActivityThread.access$1500(ActivityThread.java:144)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.os.Handler.dispatchMessage(Handler.java:102)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.os.Looper.loop(Looper.java:136)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.ActivityThread.main(ActivityThread.java:5140)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at java.lang.reflect.Method.invokeNative(Native Method)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at java.lang.reflect.Method.invoke(Method.java:515)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at dalvik.system.NativeStart.main(Native Method)
07-13 17:55:12.310: E/AndroidRuntime(11148): Caused by: a.a.a.d: Could not init DAOConfig
07-13 17:55:12.310: E/AndroidRuntime(11148):    at a.a.a.b.a.<init>(Unknown Source)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at a.a.a.b.a(Unknown Source)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at com.myapp.database.a.<init>(Unknown Source)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at com.myapp.AudioPhotoApplication.onCreate(Unknown Source)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
07-13 17:55:12.310: E/AndroidRuntime(11148):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4467)
07-13 17:55:12.310: E/AndroidRuntime(11148):    ... 10 more
07-13 17:55:12.310: E/AndroidRuntime(11148): Caused by: java.lang.NoSuchFieldException: TABLENAME
07-13 17:55:12.310: E/AndroidRuntime(11148):    at java.lang.Class.getField(Class.java:724)
07-13 17:55:12.310: E/AndroidRuntime(11148):    ... 16 more

我认为问题来自字符串,因为当我保留处理数据库的类时,我的应用程序不再崩溃!

================================================ ===== 更新 2: 问题不是来自字符串值,而是来自字符串名称。这是我的问题: https://groups.google.com/forum/#!msg/greendao/tyqjrx2otVo/PHExbn4iZk8J

【问题讨论】:

我认为 proguard 不会混淆你类中的字符串,只有方法/字段/类名。 @greywolf82 我已经更新了我上面的问题。 Tks 寻求帮助 引起:java.lang.NoSuchFieldException:TABLENAME。看来您的课程没有同步混淆。一个被混淆了,另一个仍然有原始名称作为参考。 @Dawnkeeper tks,你说得对,我找到了我的问题 【参考方案1】:

你确定这是问题所在吗,因为 ProGuard 不会像他们的常见问题解答中所说的那样混淆字符串:

没有。根据定义,程序代码中的字符串加密必须是完全可逆的,因此它只会提高混淆级别。它增加了代码的占用空间。然而,应大众需求,ProGuard 的 Android 闭源兄弟 DexGuard 确实提供了字符串加密,以及针对静态和动态分析的更多保护技术

类似的问题(但那家伙希望字符串被混淆),proguard 的作者回答: https://***.com/a/12665420/1643188

【讨论】:

我认为这是个问题。我已经更新了上述问题的详细信息。谢谢你的回答:) tks,我发现问题不是来自字符串值,而是来自字符串名称。

以上是关于不要混淆 proguard 中的硬编码字符串的主要内容,如果未能解决你的问题,请参考以下文章

替换WordPress插件中的硬编码JavaScript字符串

替代视图中的硬编码网址

通过 findById 访问活动布局中的硬编码片段

如何在 swift 2.0 中翻译我的硬编码字符串? [复制]

更改 javascript 文件中的硬编码 ID

房间数据库中的硬编码布尔查询