Android 马甲包 google市场混淆技术方案

Posted 汤米粥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 马甲包 google市场混淆技术方案相关的知识,希望对你有一定的参考价值。

  1. 指定 混淆字典

在app的gralde里配置混淆字典

-obfuscationdictionary dict.txt#外部字典

-classobfuscationdictionary dict.txt #类字典

-packageobfuscationdictionary dict.txt #包字典

dict.txt 文件内容类似这样的:

zguqnx

mvdmuyh

wmws

jwomtp

nhmhn

zvlogo

pomcwh

bhdnzul

osxbj

gojb

ctvkrg

srmar

sgkarnqi

byghdn

tvebtxw

uxdhno

qmjac

pgxasjnc

ezfb

tuoe

pzdo

写了一个task

/**
 * 生成字典Task
 */
task geneDictTask 
    doFirst
        def dictPath = rootDir.getAbsolutePath()+'/app/dict.txt'
        def random = new Random()
        def lowercase = "abcdefghijklmnopqrstuvwxyz"
        def wordList = new HashSet()
        for (int i=0;i<10000;i++)
            def word = new StringBuilder()
            def wordLength = random.nextInt(5)+4
            for (int j=0;j<wordLength;j++)
                word.append(lowercase.charAt(random.nextInt(lowercase.length())))
            
            wordList.add(word.toString())
        
        def f = new File(dictPath)
        f.getParentFile().mkdirs()
        f.withWriter("UTF-8") 
            it.write(wordList.join(System.lineSeparator()))
        
    

//

  1. xmlClassGuard

xmlClassGuard

/*

* 是否查找约束布局的constraint_referenced_ids属性的值,并添加到AabResGuard的白名单中,

* true的话,要求你在XmlClassGuard前依赖AabResGuard插件,默认false

*/

// findConstraintReferencedIds = true

//用于增量混淆的 mapping 文件

mappingFile = file("xml-class-mapping.txt")

//更改manifest文件的package属性,即包名

packageChange = ["com.DOTLESS.gala": "com.DOTLESS.gala"]

//移动目录

moveDir = ["com.DOTLESS.gala": "com.DOTLESS.gala"]

  1. 批量修改文件名

ext 
    //需要批量重命名的Been路径
    renameBeenPath = "src/main/java/com/DOTLESS/gala/bean"
    //Been对象名字以什么字符串结尾, 默认Been, 例如设为Beax, 则所有Been都会以Beax结尾, 如GoodsBeax.kt
    beenNameSuffix = "Bear"
    //Been名字的前缀, 例如KoGoodsBeen
    beenPrefix = "Ko"
    //Been对象 Been的前面加的字符串 KoGoodsFishBeen
    beenMidfix = "Fish"
    //特殊的Been比配
//    specialBeensMatcher = ["**/*Been.kt",  "**/*Been.java"]


task renameBeenProcesser 
    doLast 
        FileTree beenTree = fileTree(renameBeenPath) 
            include '**/*.java'
            include '**/*.kt'
//            include specialBeensMatcher
        
        def start = System.currentTimeMillis()
        println(">>>>>> renameBeenProcesser start")
        beenTree.each  File beenFile ->
            //println(beenFile.path + " Processing...")
            def sname = beenFile.name
            def fileEx = sname.substring(sname.lastIndexOf("."))
            sname = sname.replace(fileEx, "")
            def tName = ""
//            if (sname.endsWith("Been")) 
//                tName = beenPrefix + sname.replace("Been", beenMidfix + beenNameSuffix)
//             else if (sname.endsWith("Bean")) 
//                tName = beenPrefix + sname.replace("Bean", beenMidfix + beenNameSuffix)
//             else 
                tName = beenPrefix + sname + beenMidfix + beenNameSuffix
//            
            beenFile.renameTo(beenFile.parentFile.path + File.separator + tName + fileEx)
            //生成一个文件树,替换import后面的路径
            FileTree processTree = fileTree("src") 
                include '**/*.java'
                include '**/*.kt'
                include '**/layout/*.xml'
            
            processTree.each  File f ->
                ImportBeenReplacer(f.path, sname, tName)
            
        
        def cost = (System.currentTimeMillis() - start) / 1000
        println(">>>>>> renameBeenProcesser end(cost:$costs)")
    


//替换有导入目标been的文件内容
def ImportBeenReplacer(String filePath, sourceBeenName, targetBeenName) 
    def readerString = ""
    def hasReplace = false
    def xml = filePath.endsWith(".xml")
    file(filePath).withReader('UTF-8')  reader ->
        reader.eachLine String it ->
            if (it.find(sourceBeenName)) 
                if (xml) 
                    //println("###$filePath: $sourceBeenName->$targetBeenName")
                    it = it.replaceAll("(?<![a-zA-Z0-9]+)(?<=[\\\\.]+)$sourceBeenName(?=[ \\"\\\\./>]*)(?![a-zA-Z0-9]+)", targetBeenName)
                 else 
                    it = it.replaceAll("(?<![a-zA-Z0-9]+)(?<=[ \\\\.<:\\\\s\\\\,(]+)$sourceBeenName(?=[ \\"\\\\.>\\\\?\\\\:\\\\(]*)(?![a-zA-Z0-9]+)", targetBeenName)
                
                hasReplace = true
            
            readerString <<= it
            readerString << '\\n'
        
    
    if (hasReplace) 
        if(readerString.toString().endsWith("\\n")) readerString = readerString.subSequence(0, readerString.length() - 1)
        //替换文件
        //println(filePath + " has replace been.")
        file(filePath).withWriter('UTF-8') 
            writer ->
                writer.append(readerString)
        
    



  1. androidJunkCode 添加垃圾代码

androidJunkCode 
    def config = 
        packageBase = "com.dotless.xthv"
        packageCount = 15
        activityCountPerPackage = 3
        excludeActivityJavaFile = false
        otherCountPerPackage = 15
        methodCountPerClass = 10
        resPrefix = "xthv_"
        drawableCount = 10
        stringCount = 10
    
    variantConfig 
        devDebug config  //和productFlavors里的名字一样,注意不能是大写,不然会报错
        devRelease config
        publishDebug config
        publishRelease config
    

以上是关于Android 马甲包 google市场混淆技术方案的主要内容,如果未能解决你的问题,请参考以下文章

Android发布AAR包

Android马甲包的那些事儿

IOS+Android马甲包封装上架!

Android Studio:多包名打包

回忆专用小马甲和泷泽萝拉为何钟情VR手机?

寻找iOS套壳(马甲包)上架技术