Android - 混淆 java-library 工程
Posted GitLqr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android - 混淆 java-library 工程相关的知识,希望对你有一定的参考价值。
一、工程配置
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 官方手册:https://www.guardsquare.com/manual/setup/gradle
- Publishing an obfuscated kotlin library:https://dev.to/iurysza/publishing-an-obfuscated-kotlin-library-2kbk
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)
以上是关于Android - 混淆 java-library 工程的主要内容,如果未能解决你的问题,请参考以下文章
Android-android 怎么实现只混淆自己的代码,而不混淆第3方jar包