--摘自《android插件化开发指南》
1.插件不支持加固,宿主可以加固,此外,插件支持签名
2.一个正常的app在混淆时要遵守的规则如下
1)四大组件和Application要在AndroidManifest中声明,所以不能混淆
2)R文件不能混淆,因为有时要通过反射获取资源
3)support的v4和v7包中的类不能混淆--系统的东西,不要随便动
4)实现了Serializable的类不能混淆,否则反序列化时会报错
5)泛型不能混淆
6)自定义View不能混淆,否则在Layout中使用自定义View时会找不到
3.如果某个方法不想混淆,可以这样
-keep class jianqiang.com.receivertest.MainActivity{
public void doSomething();
}
***插件混淆方案***
方案一:不混淆公共库MyPluginLibrary
先把Plugin1对MyPluginLibrary的依赖改为provided
provided files("lib/mypluginlibrary.jar")
然后打开混淆minifyEnabled true
然后HostApp的混淆规则文件proguard-rules.pro中,keep住整个MyPluginLibrary,让MyPluginLibrary中所有的类都不会被混淆
-keep class com.example.jianqiang.mypluginlibrary.**{*;}
方案二:混淆公共库MyPluginLibrary
第一步:首先把Plugin1拆成两个包,Plugin1的代码都放在主dex中,而其他代码都放在classes2.dex中,包括MyPluginLibrary
Plugin的gradle文件增加配置
dexOptions {
javaMaxHeapSize "4g"
preDexLibraries = false
additionalParameters += '--multi-dex'
additionalParameters += '--main-dex-list=maindexlist.txt'
additionalParameters += '--minimal-main-dex'
additionalParameters += '--set-max-idx-number=20000'
}
且在Plugin增加给文件maindexlist.txt,列出需要放在主dex中的类
python脚本执行
import os
fw = open('maindexlist.txt', 'w')
def dirlist(path):
filelist = os.listdir(path)
for filename in filelist:
filepath = os.path.join(path, filename)
if os.path.isdir(filepath):
dirlist(filepath)
elif len(filepath)>5 and filepath[-5:]=='.java':
baseStr = filepath.replace('src/main/java/','').replace('.java', '')
fw.write(baseStr+ '.class
')
for index in range(1, 11):
fw.write(baseStr+ '$' + str(index) + '.class
')
fw.close()
dirlist("src/main/java/")
上述把Plugin1项目的src/main/java目录下所有java文件包括所有内部类,后缀替换为class,然后填充到maindexlist.txt。然后打包
第二步:然后用一个空的classes2.dex文件,替换Plugin1.apk中的classes2.dex
为了避免HostApp把它不用但是Plugin用到的类删除,需要在Plugin1和宿主HostApp的proguard-rule.pro中,都增加一行代码
-dontshrink
意思是混淆过程中,及时用不到的类,也会保留
第三步:最后让Plugin1和HostApp使用相同的混淆规则。先混淆Plugin1,把Plugin1的混淆规则文件放在HostApp中
把Plugin1打包生成的build/output/mapping/release目录下的mapping.txt文件复制到HostApp的根目录下,然后在HostApp的proguard-rules.pro文件中增加
-applymapping mapping.txt
这样HostApp打包混淆时,采纳和Plugin1还有mypluginlibrary一样的混淆规则
最后使用反编译和重新打包的技术把用0字节的dex文件替换前面生成的classes2.dex
欢迎关注我的微信公众号:安卓圈