Android - 混淆 java-library 工程
创始人
2024-03-26 02:30:53
0

一、工程配置

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.ProGuardTaskbuildscript {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 inputJaroutjars outputJar// For de-obfuscating stack traces later onprintseeds "$obfuscatedFolder/seeds.txt"printmapping "$obfuscatedFolder/mapping.txt"// dependencieslibraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8libraryjars configurations.runtimelibraryjars sourceSets.main.compileClasspathconfiguration files("proguard-rules.pro")// 不要压缩(压缩会把暂时没用到的代码抹去)dontshrink// 配置阶段触发:将之前生成的混淆jar包删除delete obfuscatedFolder// 执行阶段触发:当混淆jar包生成出来时,自动替换掉 build/libs 目录下的原始jar包doLast {delete "$inputJar"copy {from outputJarinto 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.ProGuardTaskbuildscript {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 inputJaroutjars outputJar// For de-obfuscating stack traces later onprintseeds "$obfuscatedFolder/seeds.txt"printmapping "$obfuscatedFolder/mapping.txt"// dependencieslibraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8libraryjars configurations.runtimelibraryjars sourceSets.main.compileClasspathconfiguration files("proguard-rules.pro")// 不要压缩(压缩会把暂时没用到的代码抹去)dontshrink// 配置阶段触发:将之前生成的混淆jar包删除delete obfuscatedFolder// 执行阶段触发:当混淆jar包生成出来时,自动替换掉 build/libs 目录下的原始jar包doLast {delete "$inputJar"copy {from outputJarinto inputFolder}}
}jar.finalizedBy(proguardTask)

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...