插件的混淆

--摘自《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\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

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

posted @ 2018-12-14 16:34  嘉禾世兴  阅读(526)  评论(0编辑  收藏  举报