//**为了防止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%是因为你混淆了不该混淆的类

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. Android(安卓)Studio 3.1.1 打Jar包出现AGPBI异常解决
  7. Android实现翻页特效
  8. Android(安卓)GPS定位步骤
  9. Android(安卓)调试工具集

随机推荐

  1. android ndk中使用gprof
  2. 关于android窗口的特效
  3. android baseadapter的getview调用两次
  4. ArcGIS for Android示例解析之GP服务调用
  5. Android:Intent用法总结
  6. Android(安卓)Activity之间跳转总结
  7. [置顶] Android(安卓)Studio(AS)-->常用
  8. Android(安卓)ViewPager 的使用
  9. [置顶] Android之异常处理:CrashHandler–
  10. Android(安卓)Monkey Test