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

升级Gradle至4.0.0后开启代码压缩导致APK安装失败

解决Gradle 4.0.0开启minifyEnabled=true后INSTALL_FAILED_INVALID_APK问题

从你的描述来看,升级到Gradle 4.0.0(即Android Gradle Plugin 4.0.0)后开启混淆导致动态特性模块的APK安装失败,核心原因主要是AGP 4.0.0默认启用R8替代ProGuard,且动态特性模块的混淆规则和配置要求有变化,结合你的配置,我整理了以下针对性解决方案:

1. 移除手动指定的R8依赖,使用AGP内置兼容版本

你的项目级build.gradle中手动添加了classpath "com.android.tools:r8:1.6.84",但AGP 4.0.0已经内置了匹配的R8版本,手动指定高版本会引发兼容性冲突。修改项目级build.gradle:

buildscript {
    ext.kotlin_version = '1.3.72'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // 移除手动指定的R8依赖,使用AGP内置版本
        // classpath "com.android.tools:r8:1.6.84"
        classpath "com.android.tools.build:gradle:4.0.0"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0-beta01"
    }
}

2. 为每个动态特性模块配置正确的混淆规则

动态特性模块(module1到module5)需要单独配置混淆,且不能重复定义applicationId(主模块已统一声明)。检查并调整每个动态模块的build.gradle:

动态模块build.gradle示例:

android {
    compileSdkVersion androidDependencies.compile_sdk_version
    buildToolsVersion "29.0.3"
    defaultConfig {
        // 动态模块不需要单独设置applicationId,若存在则删除
        // applicationId "com.pills.mydemoapplication.module1"
        minSdkVersion androidDependencies.min_sdk_version
        targetSdkVersion androidDependencies.target_sdk_version
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    buildFeatures{
        dataBinding = true
    }
    // 动态模块不需要配置dynamicFeatures,若存在则删除
    // dynamicFeatures = [...]
}

同时,在每个动态模块的proguard-rules.pro中添加必要的保留规则,确保模块组件和动态加载逻辑不被混淆:

# 保留动态模块的所有组件(Activity、Service等)
-keep public class com.pills.mydemoapplication.module1.** {
    public protected *;
}

# 保留Play Core动态加载相关类,避免模块加载失败
-keep class com.google.android.play.core.splitcompat.** { *; }
-keep class com.google.android.play.core.splitinstall.** { *; }

# DataBinding相关规则(若使用)
-keep class androidx.databinding.** { *; }
-keep class com.pills.mydemoapplication.databinding.** { *; }

主模块的proguard-rules.pro也需补充动态特性相关规则:

# 保留主模块与动态模块交互的入口类/接口
-keep interface com.pills.mydemoapplication.moduleapi.** { *; }

# 保留Play Core动态加载逻辑
-keep class com.google.android.play.core.splitcompat.** { *; }
-keep class com.google.android.play.core.splitinstall.** { *; }

3. 清理缓存并重新构建

执行以下命令彻底清理旧的构建缓存,避免遗留产物干扰:

./gradlew clean
./gradlew assembleDebug

4. 验证APK合法性(可选排查步骤)

如果问题仍存在,使用Android SDK的aapt工具检查每个APK的详细信息,定位具体错误:

aapt dump badging C:\Users\user\Desktop\Projects\Application\app\build\outputs\apk\debug\app-debug.apk

查看输出中的错误提示(如Manifest组件缺失、签名异常等),进一步精准定位问题。

临时回退方案(不推荐长期使用)

若以上步骤未解决问题,可暂时禁用R8退回到ProGuard,在项目根目录的gradle.properties中添加:

android.enableR8=false

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

火山引擎 最新活动