FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

    • Android - 混淆 java-library 工程
      • 一、工程配置
        • 1、依赖混淆库
        • 2、自定义混淆 Task
        • 3、关联混淆 Task
      • 二、完整代码
  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

  • 移动端
  • Android混淆
GitLqr
2022-12-07
目录

Android - 混淆 java-library 工程

欢迎关注微信公众号:[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 官方手册:https://www.guardsquare.com/manual/setup/gradle (opens new window)
  • Publishing an obfuscated kotlin library:https://dev.to/iurysza/publishing-an-obfuscated-kotlin-library-2kbk (opens new window)

# 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)
#混淆#java-library#proguard
Android - OkHttp 访问 https 的怪问题
Android - 利用 jitpack 免费发布闭源 aar

← Android - OkHttp 访问 https 的怪问题 Android - 利用 jitpack 免费发布闭源 aar→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×