Android 打包混肴

 1.AndroidStudio , 只需要在 build.grade 的配置文件中配置如下即可: 

  

buildTypes {
release {
// 移除无用的resource文件
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

debug {
minifyEnabled false
buildConfigField "boolean", "LOG_DEBUG", "true"
}
}

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

内容就是一些混肴的规则,如果需要加入一些自己的混淆规则 只需要在 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 其实自己加入的规则 一般都是说,某某类 不混淆等等
 
如果用到了反射需要加入 : 
[html] view plain copy
 
  1. -keepattributes Signature  
  2. -keepattributes EnclosingMethod  
 
如果想让一些bean 对象不混淆, 里 com.czy.bean 包下面的全是 Json框架生成的bean对象, 那么只需加入:
[html] view plain copy
 
  1. -keep class czy.**{*;}//不混淆所有的com.czy.bean包下的类和这些类的所有成员变量  
继承了Serializable接口的类,需要加上:
[html] view plain copy
 
  1. //不混淆Serializable接口的子类中指定的某些成员变量和方法  
  2. -keepclassmembers class * implements java.io.Serializable {  
  3.     static final long serialVersionUID;  
  4.     private static final java.io.ObjectStreamField[] serialPersistentFields;  
  5.     private void writeObject(java.io.ObjectOutputStream);  
  6.     private void readObject(java.io.ObjectInputStream);  
  7.     java.lang.Object writeReplace();  
  8.     java.lang.Object readResolve();  
  9. }  

关于第三方的库的, 一班都是看他们的官方文档
 
有用到WEBView的JS调用接口,需加入如下规则: 
[html] view plain copy
 
  1. -keepclassmembers class fqcn.of.javascript.interface.for.webview {  
  2.    public *;  
  3. }  
  4. -keep class com.xxx.xxx.** { *; }//保持WEB接口不被混淆 此处xxx.xxx是自己接口的包名  

不混淆某个类:
[html] view plain copy
 
  1. -keep class com.czy.**//不混淆所有com.czy包下的类,** 换成具体的类名则表示不混淆某个具体的类  
不混淆某个类和成员变量:
[html] view plain copy
 
  1. -keep class com.clock.**{*;}//不混淆所有com.clock包下的类和类中的所有成员变量,**可以换成具体类名,*可以换成具体的字段,可参照Serialzable的混淆  


移除一些log代码:
移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制 
[html] view plain copy
 
  1. -assumenosideeffects class android.util.Log {  
  2.     public static *** v(...);  
  3.     public static *** i(...);  
  4.     public static *** d(...);  
  5.     public static *** w(...);  
  6.     public static *** e(...);  
  7. }  

上面这些内容大多都是看的别人的, 自己记录下会更有印象:
参考了一下内容:
 
官方文档:


原文地址:https://www.cnblogs.com/yxgyiwen/p/7418819.html