反编译过程
1、把.apk重命名成.zip(因为apk包和zip的算法一样)
classes.dex就是代码存放的位置,下一步我们把dex转成jar
2、dex文件转成jar文件
需要下载一个dex2jar文件 https://sourceforge.net/projects/dex2jar/
把工具解压到文件夹,为了方便省去输入路径,我们把上一步得到的classes.dex文件拷贝到dex2jar目录下
文件夹里有很多文件,我现在用的是windows使用d2j-dex2jar.bat,如果用linux可以使用d2j-dex2jar.sh
打开命令提示符窗口,并切换到这个工具的目录
3、查看代码,这里还需要一个工具(jd-gui)
下载地址http://jd.benow.ca/
根据你的系统选择下载不同的版本,下载完成后解压,然后打开(windows里叫jd-gui.exe)
然后用这个工具打开上一步转换的jar文件就可以查看源码了,着就是没有混淆过的java代码。
其实我开始看混淆的时候从网上搜的一堆东西都是这么不混淆这个不混淆那个,忽略这个忽略那个。
我根据我的简单理解和应用讲述一下如何使用
1、开启混淆功能
在app的build.gradle里面把minifyEnabled 设置成true就是开启混淆,如果你的app里没有导入过任何第三方的包这样就可以了,这时你打个release包用刚才试过的反编译方法在试一遍,看看代码是否混淆了。
看看混淆后的结果,我们的目的达到了。
当然我们开发不用到第三方库是不可能的,如果用到该怎么办。
下面我就改进行配置了,在app工程目录下的proguard-rules.pro文件里配置
比如咱们最常用的retrofit2网络请求,不用看别人怎么配置的,直接去官网去找http://square.github.io/retrofit/
把找的贴在proguard-rules.pro文件里就好了
比如 dbflow 去官网
https://github.com/agrosner/DBFlowDocs/blob/76b48d64bf3f1e5256a7003d2230a29e2fb07c7a/proguard.md
如果使用dbflow-sqlcipher加密
https://github.com/agrosner/DBFlowDocs/blob/76b48d64bf3f1e5256a7003d2230a29e2fb07c7a/SQLCipherSupport.md
建议每次添加完第三方库都打release包试一下,看看能不能打成功,安装完成程序有没有异常。
打包时还会遇到这种问题,Please correct the above warnings first.
这就是引入第三方库并没有配置PROGUARD,具体哪个库引起的还得从左边的窗口往下找
混淆还有好多操作,这里就不多讲了,想继续深入的可以自己再找找资料学习一下。
其实这个更简单,就是两个配置,配置在app的build.gradle里面
看看压缩代码和压缩资源是否管用,能给apk瘦身多少。
还是有效果的,压缩多少是和项目内的代码和资源文件数量的大小是有关系的。
最后把我项目里的proguard-rules.pro贴上吧,祝各位端午节快乐!
-dontwarn javax.annotation.**
-dontwarn com.squareup.picasso.**
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn org.conscrypt.**
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
#dbflow
-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }
#dbflow sqlcipher
-keep class net.sqlcipher.** { *; }
-dontwarn net.sqlcipher.**
#easypermissions
-keepclassmembers class * {
@pub.devrel.easypermissions.AfterPermissionGranted ;
}