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

时间:2014-07-13 10:31:27

标签: android string proguard greendao

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

我的源码定义了一些硬编码字符串,我不知道如何防止proguard混淆我的String值(在下面的例子中是“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

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

类似的问题(但这个人希望字符串被混淆),proguard的作者回答说: https://stackoverflow.com/a/12665420/1643188