欢迎重视微信公众号:FSA全栈举动

一、工程装备

AndroidStudio 能够创建好几种 Module 工程,假如 Module 运用的是 android 插件(com.android.applicationcom.android.library),那么经过在 buildTypes 中将 minifyEnabled 设为 true 即可开启混杂,但假如 Module 运用的是 java 插件(java-library),那就需求凭借额定的东西了,因为 java-library 默许没有供给混杂装备域。

1、依靠混杂库

想要混杂 java-library 工程,需求在 build.gradle 文件中手动依靠一个第三方库 proguard-gradle

import proguard.gradle.ProGuardTask
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "com.guardsquare:proguard-gradle:7.1.0"
    }
}

2、自定义混杂 Task

依靠混杂库之后,还要自定义混杂使命,装备一些混杂选项,这儿阐明几个要点装备项:

  • injars:要混杂的 jar 包(能够是文件或目录)
  • outjars:混杂后的 jar 包输出方位(能够是文件或目录)
  • printmapping:混杂后的代码与源码之间的映射关系日志
  • configuration:混杂规则文件(一般就是 proguard-rules.pro
  • dontshrink:不要开启紧缩(默许混杂时会紧缩代码,将没被引用到的代码抹去,这会导致某些类文件丢掉字段,比如 java bean)
task("proguardTask", type: ProGuardTask, dependsOn: jar) {
    description = "Obfuscates source files"
    def artifactName = "[you library name].jar" // 根据实际情况修改!!!
    def inputFolder = "$buildDir/libs"
    def obfuscatedFolder = "$buildDir/obfuscated"
    def inputJar = "$inputFolder/$artifactName"
    def outputJar = "$obfuscatedFolder/$artifactName"
    injars inputJar
    outjars outputJar
    // For de-obfuscating stack traces later on
    printseeds "$obfuscatedFolder/seeds.txt"
    printmapping "$obfuscatedFolder/mapping.txt"
    // dependencies
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8
    libraryjars configurations.runtime
    libraryjars sourceSets.main.compileClasspath
    configuration files("proguard-rules.pro")
    // 不要紧缩(紧缩会把暂时没用到的代码抹去)
    dontshrink
    // 装备阶段触发:将之前生成的混杂jar包删除
    delete obfuscatedFolder
    // 履行阶段触发:当混杂jar包生成出来时,主动替换掉 build/libs 目录下的原始jar包
    doLast {
        delete "$inputJar"
        copy {
            from outputJar
            into inputFolder
        }
    }
}

proguard-gradle 这个库还有许多装备项,需求你感兴趣,能够到官网查阅手册了解:

  • ProGuard 官方手册:www.guardsquare.com/manual/setu…
  • Publishing an obfuscated kotlin library:dev.to/iurysza/pub…

3、关联混杂 Task

注意了,上面在声明混杂使命 proguardTask 时指定了一个依靠使命 dependsOn: jar,意思是当履行 proguardTask 使命时,需求先履行 jar 使命而已。反过来就不一定了,履行 jar 使命并不会履行 proguardTask 使命(此时 jar 使命不对 proguardTask 担任)。但是一般情况下,咱们希望 jar 使命履行之后,顺便把 proguardTask 使命一并履行,这时就能够运用 finalizedBy() 方法对其进行关联:

jar.finalizedBy(proguardTask)

至此,只需 java-library 工程一触发 jar 使命(Mark 或 Build),proguardTask 使命也会一并履行了。

二、完好代码

以下是 java-library 工程 build.gradle 文件中的悉数代码:

apply plugin: 'java-library'
dependencies {
    ...
}
import proguard.gradle.ProGuardTask
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "com.guardsquare:proguard-gradle:7.1.0"
    }
}
task("proguardTask", type: ProGuardTask, dependsOn: jar) {
    description = "Obfuscates source files"
    def artifactName = "[you library name].jar" // 根据实际情况修改!!!
    def inputFolder = "$buildDir/libs"
    def obfuscatedFolder = "$buildDir/obfuscated"
    def inputJar = "$inputFolder/$artifactName"
    def outputJar = "$obfuscatedFolder/$artifactName"
    injars inputJar
    outjars outputJar
    // For de-obfuscating stack traces later on
    printseeds "$obfuscatedFolder/seeds.txt"
    printmapping "$obfuscatedFolder/mapping.txt"
    // dependencies
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8
    libraryjars configurations.runtime
    libraryjars sourceSets.main.compileClasspath
    configuration files("proguard-rules.pro")
    // 不要紧缩(紧缩会把暂时没用到的代码抹去)
    dontshrink
    // 装备阶段触发:将之前生成的混杂jar包删除
    delete obfuscatedFolder
    // 履行阶段触发:当混杂jar包生成出来时,主动替换掉 build/libs 目录下的原始jar包
    doLast {
        delete "$inputJar"
        copy {
            from outputJar
            into inputFolder
        }
    }
}
jar.finalizedBy(proguardTask)

假如文章对您有所协助, 请不惜点击重视一下我的微信公众号:FSA全栈举动, 这将是对我最大的鼓励. 公众号不只有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

Android - 混淆 java-library 工程