使用proguard-gradle混淆 Java Library

胡致远
2023-12-01

使用proguard-gradle混淆 Java Library

在Java Library module下的build.gradle 加以下关键信息。

import proguard.gradle.ProGuardTask

buildscript {
    dependencies {
        classpath 'net.sf.proguard:proguard-gradle:5.2.1'
    }
}

plugins{
    id 'java'
}

compileJava {
    //options.failOnError = false;
    options.encoding = "UTF-8"
    options.listFiles = true
    options.warnings=false
    targetCompatibility='1.8'
    sourceCompatibility='1.8'
}

task proguardTask(type: ProGuardTask, dependsOn: compileJava) {
    //这里需要具备Gradle Task 知识点
    //让proguardTask 依赖 `compileJava`任务执行
    tasks.jar.dependsOn proguardTask

    println "proguarding"

    // 配置ProGuardTask
    printmapping "$buildDir/mapping.txt"
    //配置混淆文件规则
    configuration 'proguard-rules.pro'
    //引入依赖库
    libraryjars files(configurations.compile.findAll {}.collect())
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
	
	//参与混淆的类
    injars sourceSets.main.output
    //混淆后的文件(Class 或其它)输出目录
    String outDir = "$buildDir/proguard-classes"
    outjars outDir
    	
    //compileJava任务处理后的class文件输出目录
    File classesDir = sourceSets.main.output.classesDirs.getFiles()[0]
    println("classDir:$classesDir")

    // 清除上次的生成物
    delete outDir

    // 在本task的execute阶段,将混淆后的class文件替换正常class文件
    doLast {
        println "copying product:$classesDir"

        // 删除原有的class文件
        delete "$classesDir"
        // 将混淆class文件复制过去
        copy {
            from outDir
            into classesDir
        }
    }
}

参考

[1] https://www.jianshu.com/p/9652cf3cd982

 类似资料: