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:${cost}s)")
    }
}

//替换有导入目标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
    }
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值