Android 代码混淆

本文详细介绍了Android代码混淆的配置细节,包括设置代码混淆压缩比、处理类命名、混淆第三方库、优化算法的选择以及如何处理注解和外部库。通过-keepattributes *Annotation*保留注解信息,避免因混淆导致的问题。对于引用的外部jar包,如android.support.v4,使用-dontwarn和-keep避免混淆可能导致的错误,尤其是当这些库包含自定义视图时,混淆可能导致运行时崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 代码混淆

optimizationpasses 5 是什么意思?
optimizationpasses 表示proguard对你的代码进行迭代优化的次数,首先要明白optimization 会对代码进行各种优化,每次优化后的代码还可以再次优化,所以就产生了 优化次数的问题,这里面的 passes 应该翻译成 ‘次数’ 而不是 ‘通道’。楼上默认写 5 ,应该是做Android的,关于Android里面为什么写 5 ,因为作者本来写 99 ,但是每次迭代时间都很长团队成员天天抱怨,就改成 5 了,迭代会在最后一次无法优化的时候停止,也就是虽然你写着 99 ,但是可能就优化了 几次,一般情况下迭代10次左右的时候代码已经不能再次优化了。

  •    -optimizationpasses 5 //代码混淆压缩比 默认为5 一般不需要改 
  •    -dontusemixedcaseclassnames //混淆后的类名为小写  如public class a     
  •    -dontskipnonpubliclibraryclasses //混淆第三方库  加上此句后 可再后面配置某些库不混淆
  •    -dontpreverify // 混淆前认证,可去掉加快混淆速度
  •    -verbose //混淆的log 帮助排错
  •    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  //代码混淆采用的算法,一般不改变,用谷歌推荐算即可
  •   -keepattributes *Annotation* 假如项目中有用到注解 应用加入
  •   引用外部的jar包 如果不是自己写的 最好不混淆它们,因为外部jar包有可能已经混淆过,根据实际情况来 不混淆某些外部jar保持外部jar包不变的方法
  • -dontwarn android.support.v4.** //执行下面一行代码如果有警告也不用中止,因为此jar不是我们自己写的,有警告也不处理,故dontwarn
  • -keep class android.support.v4.** //项目中用到此jar包,在打包时必须不混淆,否则用ViewPager时必crash,原因很简单,ViewPager是一个自定义view,在布局中用类的全名来定义此布局,混淆后类名和包名改变,xml布局无法再通过类名打到此自定义view。
#两个特定的类不能被混淆和删除
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#所有包含JNI调用的类以及其内部的成员都不能被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}
#扩展自android.view.View类的任何public类的setter和getter方法都不能被混淆和删除
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}
#扩展自android.app.Activity类的任何类中访问属性是public,返回值是void,参数是android.view.View类型的所有函数都不能被混淆或删除
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}
#任何枚举类中的values和valueOf静态方法都不能被混淆和删除
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
#实现了android.os.Parcelable接口类的任何类,以及其内部定义的Creator内部类类型的public final静态成员变量,都不能被混淆和删除
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#所有自动生成的R类中的public静态成员变量
-keepclassmembers class **.R$* {
    public static <fields>;
}
优快云上还有一个大牛总结的比较完善:
http://blog.youkuaiyun.com/catoop/article/details/47208833

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值