安卓开发混淆讲解

  • 自定义控件不进行混淆(默认不会混淆)
  • 枚举类不被混淆
  • 反射类不进行混淆
  • 实体类不被混淆
  • JS调用的Java方法
  • 四大组件不进行混淆(默认不会混淆)
  • JNI中调用类不进行混淆
  • Layout布局使用的View构造函数、android:onClick等
  • Parcelable的子类和Creator静态成员变量不混淆
  • 第三方开源库或者引用其他第三方的SDK包不进行混淆

AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的

 

 子模块的混淆影响不到app模块,但是APP模块的混淆会影响到子模块

aar包默认是没有混淆文件的,要想混淆需要在宿主APP里面加

但是也可以配置aar包可以包含混淆文件

aar包自带混淆文件配置 

consumerProguardFiles "consumer-rules.pro"

打出来的aar包就会包含混淆配置文件,如果没有,就需要再宿主apk里面添加混淆配置

Android混淆(ProGuard)从0到1 - 简书本文为原创,转载请注明出处:http://www.jianshu.com/p/1b76e4c10495 说在前面的 作为一个Android开发者,或多或少都知道点关于混淆的概...https://www.jianshu.com/p/1b76e4c10495

混淆规则 用法

android_混淆_详解_写bug的蚊子的博客-CSDN博客_android混淆指定类

 子模块的consumer-rules.pro被主模块用或者被宿主app用(aar的时候)
子模块的proguard-rules.pro被子模块自己用

混淆还原

安卓开发混淆讲解_第1张图片

GET代码混淆(ProGuard) - 简书由于本人能力有限,文中若有错误之处,欢迎指正。转载请注明出处:http://www.jianshu.com/p/7371952ae006 不会代码混淆的程序员不是合格的And...https://www.jianshu.com/p/7371952ae006

https://www.jianshu.com/p/7371952ae006

Android制作AAR包并混淆后加载调用 - 云+社区 - 腾讯云https://cloud.tencent.com/developer/article/1867422

GET代码混淆(ProGuard) - 简书由于本人能力有限,文中若有错误之处,欢迎指正。转载请注明出处:http://www.jianshu.com/p/7371952ae006 不会代码混淆的程序员不是合格的And...https://www.jianshu.com/p/7371952ae006

绿色记忆:ProGuard学习笔记https://blog.gmem.cc/proguard-study-note

Android多模块混淆、多module混淆、多library混淆的正确姿势_Android小码农的博客-CSDN博客_android module不混淆Android Studio本身集成了ProGuard混淆工具,我们可以通过编辑build.gradle文件来开启混淆并且对代码进行压缩,对资源进行优化等。如下图下面是代码,可以直接复制 buildTypes { release { minifyEnabled true //开启混淆 zipAlignEnabl...https://blog.csdn.net/s13383754499/article/details/81289327

多个moudle混淆配置问题:

网上很多关于子module的混淆配置是错误的,经过我的多次实践得出,主模块的混淆开关配置会直接影响到子模块,也就是说如果你的主模块开启的混淆,就算你的子模块关闭混淆开关,最终子模块还是会被混淆的。
其次
子模块混淆文件的指定是通过consumerProguardFiles这个属性来指定的,并不是proguardFiles 属性,而且我们无需配置其他的选项,只需要配置consumerProguardFiles属性就可以。该属性表示在打包的时候会自动寻找该module下我们指定的混淆文件对代码进行混淆。

Android多模块混淆的问题 - 简书Android在多模块或者组件化的时候,关于混淆的管理,一般常见的做法就是两条。 把所有的混淆规则规则都放在app模块下面,由app统一管理。这样就会有一个问题,就是到会导致...https://www.jianshu.com/p/e4133e9fd60f

安卓开发混淆讲解_第2张图片

 安卓开发混淆讲解_第3张图片

aar包自带混淆文件配置 

consumerProguardFiles "consumer-rules.pro"

打出来的aar包就会包含混淆配置文件,如果没有,就需要再宿主apk里面添加混淆配置

Android aar中增加独立的混淆配置 - 简书1、为什么要在AAR中独立配置混淆文件 我们的工程中有很多的aar,我们希望别人在使用我们的aar的时候不用像使用jar包一样还要再进行相应的混淆配置。同时为了使每个aar库...https://www.jianshu.com/p/a8614ff60647

安卓开发混淆讲解_第4张图片

2.2、gradle 中的将混淆文件打包到aar中的方法

安卓开发混淆讲解_第5张图片

安卓开发混淆讲解_第6张图片

安卓开发混淆讲解_第7张图片

 安卓开发混淆讲解_第8张图片

如果同时配置了

consumerProguardFiles(自定义) 和 proguardFiles,那么consumerProguardFiles会覆盖proguardFiles,以consumerProguardFiles 自定义的为准

如果只配置了proguardFiles

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

那么这个是把sdk\tools\proguard下面的proguard-android.txt拷贝到proguard-rules.pro作为混淆文件,如果proguard-rules.pro本身也有内容,那应该是合并本身和proguard-android.txt的内容

这种在子moudle里面都好说。一般就是配置

consumerProguardFiles "consumer-rules.pro"  或者 
consumerProguardFiles "proguard-rules.pro"

如果有的app模块要单独运行,自身也要作为aar

用以下的方 

安卓开发混淆讲解_第9张图片

哪些内容不能被混淆

Android编译混淆与堆栈还原 - 简书

Android混淆从入门到精通 - 简书

1,jni方法不可混淆,因为这个方法需要和native方法保持一致;

-keepclasseswithmembernames class * { # 保持native方法不被混淆    
    native ;
}

2,反射用到的类不混淆(否则反射可能出现问题);

3,AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的;

4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象;

5,使用第三方开源库或者引用其他第三方的SDK包时,如果有特别要求,也需要在混淆文件中加入对应的混淆规则;

6,有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样;

7,Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常;

-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆           
    public static final Android.os.Parcelable$Creator *;
}

8,使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。

-keepclassmembers enum * {  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
}

写在最后

发布一款应用除了设minifyEnabledture,你也应该设置zipAlignEnabledtrue,像Google Play强制要求开发者上传的应用必须是经过zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。


 

你可能感兴趣的:(混淆,android)