从SDK2.3开始在android-sdk-windows\tools\下面多了一个proguard文件夹,proguard是一个java代码混淆的工具,不过代码混淆不能混淆xml的布局文件,混淆的是JAVA文件。java
1、在eclipse中,android 2.3开始支持这个功能;android
2、另外一种是使用脚本如ant等 。windows
混淆器经过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。app
1、默认混淆文件 :proguard.cfg文件, google默认不混淆 Activity 、Service ... 类的 子类, 全部 activity 的子类 名称是被保留的。让proguard.cfg起做用的作法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就能够了eclipse
混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,并保留了全部的Native变量名及类名,全部类中部分以设定了固定参数格式的构造函数,枚举等等。ide
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中删除的代码