You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android库混淆问题:编译App时未触发Library的ProGuard及AAR生成

解决Gradle 3.0+中App构建时不触发Library混淆的问题

这个问题我之前帮不少开发者排查过,Gradle Android插件3.0+引入的增量构建优化确实会带来这个困扰——为了加快构建速度,默认情况下app模块的构建不会触发依赖库的混淆任务,而是直接复用库的未混淆构建产物。不过我们完全可以通过配置强制让app构建时触发库的混淆及AAR生成,下面给你几个可行的方案:

方案1:让App依赖Library的混淆构建变体

最直接的方式是在Library中定义一个开启混淆的构建变体,然后让App明确依赖这个变体。

首先在Library的build.gradle(或build.gradle.kts)中配置混淆的构建类型:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        // 可选:专门创建一个用于测试混淆的变体,避免影响正式release
        minifiedTest {
            initWith release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

然后在App的build.gradle中修改依赖配置,指定依赖Library的混淆变体:

dependencies {
    // 依赖Library的minifiedTest变体,替换成你定义的混淆变体名称即可
    implementation project(path: ':library', configuration: 'minifiedTest')
}

这样执行./gradlew :app:assemble时,Gradle会自动触发Library的混淆任务并生成对应的AAR。

方案2:让App的构建任务显式依赖Library的混淆任务

如果不想修改依赖变体,可以直接在App的构建脚本中,让App的assemble任务依赖Library的混淆构建任务。

在App的build.gradle中添加以下配置:

// 让App的assembleRelease任务依赖Library的assembleMinifiedTest任务
tasks.named('assembleRelease').configure {
    dependsOn ':library:assembleMinifiedTest'
}

// 如果需要Debug构建也触发混淆,同理添加
tasks.named('assembleDebug').configure {
    dependsOn ':library:assembleMinifiedTest'
}

这里的assembleMinifiedTest要对应你Library中开启混淆的构建变体的assemble任务(比如如果是release变体,就是:library:assembleRelease)。执行./gradlew :app:assembleRelease时,会先完成Library的混淆构建,再继续App的构建流程。

方案3:临时禁用Library的构建缓存(不推荐)

如果只是临时测试需要,可以禁用Library的构建缓存,强制Gradle重新执行所有任务(包括混淆)。在Library的build.gradle中添加:

android {
    buildCache {
        enabled false
    }
}

注意:这个方案会显著降低构建速度,只适合临时排查问题,不建议长期使用。

额外注意事项

  • 确保Library对应的构建变体已经开启minifyEnabled true,并且配置了正确的ProGuard规则文件;
  • 如果你使用的是Android Gradle Plugin 7.0+,语法和旧版本略有差异,比如tasks.named是推荐的任务配置方式,替代旧版的tasks.findByName
  • 测试完成后,记得根据实际需求调整配置,避免不必要的混淆任务影响日常开发效率。

内容的提问来源于stack exchange,提问作者HotIceCream

火山引擎 最新活动