Android(安卓)混淆配置及Bug处理
16lz
2021-01-25
//**为了防止apk反编译后源码泄漏,我们需要对发布的应用进行混淆打包。**
好东西要分享:
使用proguard混淆android代码
Android混淆打包那些事儿
本项目的proguard-rules.pro文件
#==================================【基本配置】==================================# 代码混淆压缩比,在0~7之间,默认为5,一般不下需要修改-optimizationpasses 5 # 混淆时不使用大小写混合,混淆后的类名为小写# windows下的同学还是加入这个选项吧(windows大小写不敏感)-dontusemixedcaseclassnames # 指定不去忽略非公共的库的类# 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明-dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员-dontskipnonpubliclibraryclassmembers # 不做预检验,preverify是proguard的四个步骤之一# Android不需要preverify,去掉这一步可以加快混淆速度-dontpreverify # 有了verbose这句话,混淆后就会生成映射文件-verbose #apk 包内所有 class 的内部结构-dump class_files.txt #未混淆的类和成员-printseeds seeds.txt #列出从 apk 中删除的代码-printusage unused.txt #混淆前后的映射-printmapping mapping.txt # 指定混淆时采用的算法,后面的参数是一个过滤器# 这个过滤器是谷歌推荐的算法,一般不改变-optimizations !code/simplification/artithmetic,!field/*,!class/merging/* # 保护代码中的Annotation不被混淆# 这在JSON实体映射时非常重要,比如fastJson-keepattributes *Annotation* # 避免混淆泛型# 这在JSON实体映射时非常重要,比如fastJson-keepattributes Signature # 抛出异常时保留代码行号-keepattributes SourceFile,LineNumberTable #忽略警告-ignorewarning #==================================【项目配置】==================================# 保留所有的本地native方法不被混淆-keepclasseswithmembernames class * { native <methods>;}# 保留了继承自Activity、Application这些类的子类-keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;} # 如果有引用android-support-v4.jar包,可以添加下面这行-keep public class com.null.test.ui.fragment.** {*;} #如果引用了v4或者v7包-dontwarn android.support.** # 保留Activity中的方法参数是view的方法,# 从而我们在layout里面编写onClick就不会影响-keepclassmembers class * extends android.app.Activity { public void * (android.view.View);}# 枚举类不能被混淆-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}# 保留自定义控件(继承自View)不能被混淆-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(***); *** get* ();}# 保留Parcelable序列化的类不能被混淆-keep class * implements android.os.Parcelable{ public static final android.os.Parcelable$Creator *;}# 保留Serializable 序列化的类不被混淆-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}# 对R文件下的所有类及其方法,都不能被混淆-keepclassmembers class **.R$* { *;}# 对于带有回调函数onXXEvent的,不能混淆-keepclassmembers class * { void *(**On*Event);}#==================================【三方配置】==================================#高德地图-keep class com.amap.api.location.**{*;} -keep class com.amap.api.fence.**{*;} -keep class com.autonavi.aps.amapapi.model.**{*;} #arcgis地图-dontwarn com.esri.** -keep class com.esri.** {*;} -dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;} -dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;} -dontwarn jcifs.** -keep class jcifs.** {*;} #butterknife-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>;}-keepclasseswithmembernames class * { @butterknife.* <methods>;}
常见Bug:
No1:
一堆警告,编译失败,MD。。
解决方法:
添加以下代码
#忽略警告-ignorewarning
No2:
终于编译成功,点击直接闪退,MD。。
解决方法:
看下日志,打开项目目录\app\build\outputs\mapping\release文件,打开映射文件,找到错因,原来又是少声明SQLiteOpenHelper类,然后进行更改
-keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;}
No3:
成功编译并且进去应用后,当点到某个页面时突然闪退,MD。。
解决方法:
查看页面代码,因为常用的类已经声明防止混淆过了,所以看看这个页面有没有用到一些三方包,果然又少配置了,继续添加声明防止混淆
-dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;}
总结:
混淆出错80%是因为你混淆了不该混淆的类
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Android(安卓)Studio 3.1.1 打Jar包出现AGPBI异常解决
- Android实现翻页特效
- Android(安卓)GPS定位步骤
- Android(安卓)调试工具集