Apk瘦身+Proguard混淆实战

很高兴,经过1天的时间,我们的apk从23M已经瘦到了17.9M,这里很感谢这篇博客给我带来的冲动,APK瘦身实践,这里面提到的如果都试过,肯定会有质的飞跃,我只试了几个,就带来了意想不到的收获,下面我们一起来见证这奇迹的时刻。

先上图
当minifyEnabled=false是这样的,也就是没代码混淆

对比7zip18.9M,普通的18.6M

当use7zip=false是这样的,没开启7zip压缩

18.6M
当全为true是这样的

对比7zip17.9M,普通18.6M
用微信Android资源混淆工具打包完成后是这样的
app/build/outputs/apk下面会多一个这样的文件夹AndResProguard

命令是╰─➤ ./gradlew generate,而不是./gradlew assembleRelease,如果你没用微信的那一套方法,用第二种就可以,如果你用了微信的那一套,必须用第一种口令了。
微信的那一套在这里
AndResGuard
有中文文档,遇到问题可以参考里面的issues,当然里面也有我提的,嘿嘿。
这里一些技巧,去除无用代码,无用图片啊,这里就不说了,上面推荐的文章里面说的很清楚。
这里既然说的是apk瘦身+代码混淆。apk瘦身我这里靠的就是去除无用资源,优化图片,混淆代码实现的。
最重要的还是代码混淆,我这里用了双重混淆,一种proguard-rules.pro文件进行混淆,一种微信混淆工具进行混淆,这两种上面的文章有提到。第一种主要就是把gradle中的开关打开,然后进行proguard-rules.pro的文件编写,因为这里是在As中进行的。
注意:在使用Eclipse+ADT时需要加入-libraryjars libs/…,如果你是使用Android Studio开发的项目则不需要加入libs包中的jar包,这是因为,通过Android Studio进行混淆代码时,默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“ java.io.IOException: The same input jar is specified twice” 错误。
我这里贴出来我写的一部分,结合你们自己的项目进行混淆,哪些进行混淆,哪些不能进行混淆。
1.JavaBean类即实体类不被混淆。
2.自定义控件不参与混淆。
3.枚举不被混淆。
4.第三方库中的类不进行混淆

举一个例子。

1
2
3
4
5
#baidu
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
-dontwarn vi.com.**

百度第三方库,这样写的意思是,-keep class com.baidu. { *; } 让ProGuard不要警告找不到com.baidu.这个包里面的类的相关引用
-dontwarn com.baidu. 保持com.baidu.这个包里面的所有类和所有方法不被混淆。
几乎第三方类都这样写就可以了,怎么找到它对应的包那,

展开lib下面引用的第三方就可以了,还有一些是在gradle中加的,那就到这里找就好了

然后仿照上面的书写格式就好了。当你觉得写的差不多的时候打一个包出来,然后安装看看,我昨天就是一口气弄完,最后BUILD SUCCESSFUL了,但是安装到手机上面就是崩溃,还是有些不该混淆的类给混淆了,他找不到了。
微信那一个Github的文档,还有一个demo应该能玩转了,就是如果开启7zip压缩,首先你电脑要有7zip,Mac上面安装很简单,brew install p7zip,然后把Github上面的那一段gradle复制进去,要对应好哦,

1
2
3
4
5
buildscript {
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.2'
}
}

这一段是放在Project中的gradle的,剩下的都是放在Module中gradle的。

参考资料:

代码混淆和破解apk
Android Proguard 详解
Android 项目的代码混淆,Android proguard 使用说明

版权声明:



除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

坚持原创技术分享,您的支持将鼓励我继续创作!