zoukankan      html  css  js  c++  java
  • 插件的混淆

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

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

  • 相关阅读:
    Linux下进程间通信的六种机制详解
    Android HAL实例解析
    socket函数
    Linux 线程浅析
    Android WiFi开发教程(一)——WiFi热点的创建与关闭
    Android蓝牙开发教程(三)——蓝牙设备相互通讯
    python数据分析入门学习笔记儿
    Oracle触发器详解
    电商检索系统总结——功能篇
    Linux内核中等待队列的几种用法
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10120189.html
Copyright © 2011-2022 走看看