Android混淆问题
最近做了2个项目,全部要混淆,刚接触,自己在网上找了还多资料,感觉各有千秋,自己总结了一下, 第一次发帖,不喜勿喷。求各种指导!!! android应用程序的混淆打包规范
1.在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:
target=android-8
proguard.config=proguard.cfg
Eclipse会通过此配置在工程目录生成proguard.cfg文件,但是这只能混淆不含第三方包的工程。
而我们的项目中大量使用了第三方包,在用自动生成的混淆文件会导致打包不成功,或者打包成功不能运行的情况,所以必须在基本代码的基础加上其他的属性将第三方库隔离开来不被混淆。
2.含有第三方库的工程混淆,首先去看引用库的官方文档,一般会给出混淆方案,因为有时第三方库中也许不只有一个jar包,第三方库本身可能也会用到其他的jar包,一个个找出来去单独混淆会很浪费时间。
3.常见第三方库混淆流程:
1.首先加入-dontwarn//不用输出警告,增大混淆的成功率
2.将对应的第三方库的包名采用同样的方法解除警告
-dontwarn com.slidingmenu.lib.app.**
-dontwarn com.actionbarsherlock.app.**
-dontwarn android.support.v4.**
-dontwarn com.slidingmenu.lib.**
-dontwarn cn.sharesdk.**
3.指明lib包的在工程中的路径,-libraryjars后面跟要编译in.jar 的其它类包,如果是多个,用多行列出
-libraryjars libs/gson-2.2.2.jar
4.引入后,对项目使用到的入口类进行指定,-keep 后跟项目的 入口类
-keep class universal-image-loader-1.8.4-with-sources.** { *; }
-keep interface universal-image-loader-1.8.4-with-sources.** { *; }
-keep class lockSDK_3.3.** { *; }
-keep interface lockSDK_3.3.** { *; }
-keep class MobileProbe.jar.** { *; }
-keep interface MobileProbe.jar.** { *; }
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
keep就是 告诉proguard不用混淆这个包里面的类
5.有一些特殊包需要注意
如果加了android.support包的话,那么要加上
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { ; }
如果加了gson包的话,那么要加上
-libraryjars libs/gson-2.2.2.jar
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { ; }
-keep class com.google.gson.examples.android.model.* { ; }
-keep class com.google.gson.* { *;}
如果项目中含有引用接口的实体的话,那么要加上
-keep public class * implements java.io.Serializable{
public protected private *;
}
如果项目中含有设值注入的实体的话,可能会在打包运行不报错, 但是运行报错,比如空指针异常,或者是反射的时候报错是不 是实体类被混淆了。导致找不到实体类 无法get或者set,那么 要加上
-keep public class mypackage.MyBean { public void setMyProperty(int); public int getMyProperty();}
4.最后,我们看一看混淆的过程
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { ; }
解释:
-libraryjars指明lib包的在工程中的路径,而-dontwarn android.support.v4.**和-keep class android.support.v4.** { ; },这两个参数用来保持第三方库中的类而不乱,将-dontwarn和-keep 结合使用,意思是保持android.support.v4.** { ; },这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到android.support.v4.** { ; }这个包里面的类的相关引用,防止可接受警告的出现影响到程序的运行。
注:混淆基本流程就是这样,不同的第三方库大同小异,都可以采用这种方法去处理!!!
|