最近看一些关于混淆应用的文章,于是在自己的应用中引入了混淆文件proguard-android.txt
设置使用混淆:
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- 1
首先发现的是分享功能没法使用:
之后使用签名打包运行后使用分享就会崩溃,当把minifyEnabled zipAlignEnabled shrinkResources
设置为false
再次签名打包使用分享可以调出微博客户端,这样问题就明显了,使用混淆导致微博的jar和so文件无法引用,找到proguard-android.txt
对引用的第三方jar、类库进行保护:
## keep class 包名.* 保持包名下的所有类不被混淆
-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.**{*;}
-dontwarn com.sina.**
-keep class com.sina.**{*;}
- 1
再次使用打包,使用分享成功分享。
之后测试发现很多引用第三方jar 以及自定义的view都不能正常使用:
这样就尴尬了,混淆后各种问题,既然混淆了就不能不解决,找到自己的自定义view的包名保持不混淆:
-keep class com.packagename.widget.**{*;}
- 1
相关是项目是个人的app 所以加入了邮件发送,同样混淆后就有这样的错误:
javax.mail.NoSuchProviderException: smtp
- 1
仔细查看代码中用到类所在的jar,一个一个设置不混淆:
## 邮件发送保持不混淆
-keep class org.apache.**{*;}
-keep class org.apache.commons.mail.**{*;}
-keep class javax.mail.**{*;}
-keep class javax.activation.**{*;}
-keep class com.sun.activation.registries.**{*;}
-keep class com.sun.mail.** {*;}
-keep class myjava.awt.datatransfer.**{*;}