混淆注意事项

 从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”就可以了

      混淆中保留了继承自ActivityServiceApplicationBroadcastReceiverContentProvider等基本组件以及com.android.vending.licensing.ILicensingService并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。

     2android 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中删除的代码

 

 

 

 
posted @ 2013-06-28 12:01  ConquerMobileApp  阅读(1162)  评论(0编辑  收藏  举报