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

插件的混淆_自定义view

先把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\n')
for index in range(1, 11):
fw.write(baseStr+ '$' + str(index) + '.class\n')

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

欢迎关注我的微信公众号:安卓圈

插件的混淆_ide_02