混淆注意事项
从SDK2.3开始在android-sdk-windows\tools\下面多了一个proguard文件夹,proguard是一个java代码混淆的工具,不过代码混淆不能混淆xml的布局文件,混淆的是JAVA文件。
1、在eclipse中,android 2.3开始支持这个功能;
2、另一种是使用脚本如ant等 。
混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。
1、默认混淆文件 :proguard.cfg文件, google默认不混淆 Activity 、Service ... 类的 子类, 所有 activity 的子类 名称是被保留的。让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了
混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。
2、android sdk目录在带有空格的目录名称的子目录下无法混淆 去掉空格就好了
3、依赖包混淆带来的麻烦,最好全部保留不混淆。例如
-keep class com.badlogic.** { *; }
-keep class * implements com.badlogic.gdx.utils.Json*
-keep class com.google.** { *; }
4. jni反调java方法
这些类或方法同样可能会被proguard认为没有调用过而被除掉, 或都被改名. 这些方法最好统一写在一个类中, 然后这个类不作优化, 或是找出所有jni调用过的类与方法, 在proguard.cfg中配置, 不对它们作优化
5. 其它反射调用的java类与方法
使用反射时一定要注意proguard可能会认为那些方法未被调用过, 会在代码优化过程中将它们改名或除去. 在使用反射的地方一定要在proguard.cfg中配置, 不优化反射调用过的类和方法。
比较常见的是写在视图xml中的onClick响应出错. 因为写在xml中的onClick是通过反射调用的, proguard认为它们没有在代码中被调用过, 所以将它们从代码中除掉或改名了.
解决方法:在proguard.cfg中添加以下代码, 就可以防止被配在视图xml中的onClick方法被proguard优化掉。
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
我们公司目前的批量打包脚本注意事项:
7 如果是引用第三方jar包,应注意查看jar包里是否有assets资源文件夹,如果有,应用将assets文件夹中的资源copy到项目中的assets文件夹下,这样混淆后才不会出错。在proguard优化过后会产生一些文件
dump.txt – 描述.apk文件中所有类文件间的内部结构
8 客户端利用友盟的分享功能做第三方分享,但客户端混淆打包后,分享功能会报一些resource找不到的问题。这是因为友盟分享功能会用反射的方法去找自己需要的资源文件。被混淆后当然报错。
-keep class **.R$* {
*;
}
mapping.txt – 列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。
对应公司里产生的.map文件
seeds.txt – 列出了未被混淆的类和成员
usage.txt – 列出了从.apk中删除的代码