最近做了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.**
{ ; }这个包里面的类的相关引用,防止可接受警告的出现影响到程序的运行。
注:混淆基本流程就是这样,不同的第三方库大同小异,都可以采用这种方法去处理!!!
|
相关文章
- 12-04关于idea中File file = new File(path);这里的路径问题
- 12-04React配置代理解决跨域问题
- 12-04android-NFC标签和NFC卡是一回事吗?
- 12-04充电桩行业使用RFID射频IC卡模块的问题简析与解决方案
- 12-04android-如何在有根电话上获取NFCEE_ADMIN权限?
- 12-04android-读取无源RFID钥匙标签
- 12-04未解决问题
- 12-04使用echarts插件做图表常见的几个问题(六)——全国地图及其下钻
- 12-04windows下vim 块模式问题
- 12-04AndroidStudio报错Manifest merger failed : Attribute application@appComponentFactory value=(android.sup