欢迎重视微信公众号:FSA全栈举动
一、工程装备
AndroidStudio 能够创建好几种 Module 工程,假如 Module 运用的是 android 插件(com.android.application
或 com.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等文章, 可能有你想要了解的技能知识点哦~