您的位置:首页 > 移动开发 > Android开发

Android ProGuard打包混淆代码

2016-07-04 02:38 477 查看
buildTypes {
debug {
versionNameSuffix ".dev"
}

release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}


proguardFiles getDefaultProguardFile 就是制定 混淆规则的文件, AndroidStudio默认生成了proguard-rules.pro 文件 



-libraryjars class_path 应用的依赖包,如android-support-v4
-keep [,modifier,...] class_specification 不混淆某些类
-keepclassmembers [,modifier,...] class_specification 不混淆类的成员
-keepclasseswithmembers [,modifier,...] class_specification 不混淆类及其成员
-keepnames class_specification 不混淆类及其成员名
-keepclassmembernames class_specification 不混淆类的成员名
-keepclasseswithmembernames class_specification 不混淆类及其成员名
-assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等
-dontwarn [class_filter] 不提示warnning

不混淆某个类和成员变量:

-keep class com.clock.**{*;}//不混淆所有com.clock包下的类和类中的所有成员变量,**可以换成具体类名,*可以换成具体的字段,可参照Serialzable的混淆
 

不混淆某个类:

-keep class com.czy.**//不混淆所有com.czy包下的类,** 换成具体的类名则表示不混淆某个具体的类  

有用到WEBView的JS调用接口,需加入如下规则: 

-keepclassmembers class fqcn.of.javascript.interface.for.webview {  

   public *;  

}  

-keep class com.xxx.xxx.** { *; }//保持WEB接口不被混淆 此处xxx.xxx是自己接口的包名  

如果用到了反射需要加入 :

-keepattributes Signature  

-keepattributes EnclosingMethod  

如果加入一些自己的混淆规则 只需要在 proguard-rules.pro 中文件加入自己的混淆规则即可,

其实google以及给我提供很好的打包规则, 即proguard-rules.pro 啥也不写, 我打出来的release包也是混淆好的

但是我们会遇到一些情况, 不得不 添加自己的混淆规则:
1. 代码中使用了反射,如一些ORM框架的使用 
          需要保证类名 方法不变, 不然混淆后, 就反射不了
2. 使用GSON、fastjson等JSON解析框架所生成的对象类
          生成的bean实体对象,内部大多是通过反射来生成, 不能混淆
3. 引用了第三方开源框架或继承第三方SDK,如开源的okhttp网络访问框架,百度定位SDK等
          在这些第三库的文档中 一班会给出 相应的 混淆规则, 复制过来即可
4. 有用到WEBView的JS调用接口
          没真么用过这块, 不是很熟, 网上那个看到的
5. 继承了Serializable接口的类
          在反序列画的时候, 需要正确的类名等, 在Android 中大多是实现 Parcelable来序列化的

ok 其实自己加入的规则 一般都是说,某某类 不混淆等等

-keepclassmembers class fqcn.of.javascript.interface.for.webview {  

   public *;  

}  

-keep class com.xxx.xxx.** { *; }//保持WEB接口不被混淆 此处xxx.xxx是自己接口的包名  

-keepattributes Signature  

-keepattributes EnclosingMethod  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: