AGP8+ fullMode 完全模式混淆闪退

在这里插入图片描述

打包环境

  • AGP:8.7.2
  • Gradle:8.9

1、描述

同一个工程

✅ 在 AGP6+ 打包运行正常

✅ 在 AGP7+ 打包运行正常

❌ 在 AGP8+ 打包运行闪退(混淆包闪退、非混淆包正常)

2、混淆前

很正常的代码

public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        androidx.multidex.MultiDex.install(this);
        DNSDK.applicationAttachBaseContext(this, base);
    }
}

3、AGP8+ 混淆后

  • 这里看着还算正常
    在这里插入图片描述
  • 这就不正常了
    • 一个普通类怎么变成了 abstract
    • 一个正常的方法最后怎么就直接抛异常了 throw null 【这样运行意料之中绝对闪退】
      在这里插入图片描述
  • 再随便看其他类,很多方法都是直接抛异常,方法体都变了【天崩开局😡】

在这里插入图片描述

5、AGP8+ 非混淆

经测试

✅ 关闭混淆打包。运行正常
❌ 开启混淆打包,运行闪退(出现上文所示代码)

buildTypes {
        debug {
            isMinifyEnabled = false//关闭混淆
            isDebuggable = true
            signingConfig = signingConfigs["PrimerDebug"]
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro",
                "obs-all-proguard-rules.pro"
            )
        }
        release {
            isMinifyEnabled = true//开启混淆
            isDebuggable = false
            signingConfig = signingConfigs["PrimerRelease"]
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro",
                "obs-all-proguard-rules.pro"
            )
        }
    }

4、AGP8+ 混淆 [关闭完全模式]

看官方 R8 的文档:Google git:D8 dexer and R8 shrinker 好像也没发现什么东西

冥冥中记得 R8 有一个混淆模式:fullMode 完整模式

温故知新,问下 Al

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Al 解释的很清楚

总之,时间紧迫,先一把梭哈关闭 R8 fullMode 让项目先运行起来

gradle.properties文件下配置开关:

android.enableR8.fullMode=false

果不其然,这次运行正常

没有时间研究,也研究不懂,对新手来说升级 AGP 坑不浅啊

<think>好的,我现在需要解决用户关于Android混淆后aar方法参数变成var1的问题。首先,我得确认用户的具体情况。他们可能是在使用ProGuard或R8进行代码混淆后,发现生成的AAR文件中方法的参数名称被替换成了var1、var2这样的形式。这会影响代码的可读性,尤其是在使用反射或依赖参数名的库时,比如Retrofit或Gson。 接下来,我应该回顾混淆工具的工作原理。ProGuard和R8默认会混淆代码,包括类名、方法名和字段名,但参数名通常会被移除或替换为简单的标识符,如var1,这是因为在字节码中参数名默认不保留。Java编译器在编译时不会将参数名信息写入.class文件,除非使用了-parameters选项。而在Android中,可能默认没有开启这个选项,导致参数名丢失。 用户可能希望保留参数名,或者至少让它们不被替换成无意义的名称。这时候需要检查混淆配置,也就是proguard-rules.pro文件。可能的解决方案包括保留某些特定方法的参数名,或者全局保留参数名。但需要注意,保留所有参数名可能会影响混淆效果,增加APK大小。 另外,用户可能混淆了“混淆”和“优化”步骤。R8在优化阶段可能会进行更激进的优化,包括内联或改变参数名称。需要检查是否启用了优化,并考虑关闭某些优化选项,或者在配置中添加规则来保持参数名。 此外,如果用户使用Kotlin,需要确认是否启用了kotlinx-metadata-jvm来保留参数名,因为Kotlin默认会保留参数名,但混淆可能会覆盖这一点。可能需要额外的配置,比如使用@Keep注解或保持特定包的参数名。 最后,用户可能需要生成混淆后的代码的映射文件,以便在需要时进行反混淆,比如排查问题时。需要指导他们如何找到和使用mapping.txt文件。 总结解决步骤: 1. 检查并配置ProGuard/Rules以保留参数名。 2. 使用-keepattributes指令保留参数属性。 3. 针对特定方法或类进行保留。 4. 处理Kotlin代码的特殊情况。 5. 调整优化选项,避免参数名被优化掉。 6. 生成和利用映射文件进行反混淆。 需要验证这些步骤的正确性,确保示例配置正确无误,并提醒用户权衡保留参数名和代码混淆效果之间的利弊。</think>在 Android 开发中,当使用 ProGuard 或 R8 进行代码混淆时,方法参数名称被替换为 `var1`、`var2` 等是正常现象。以下是逐步解释和解决方案: --- ### **1. 现象原因** - **混淆工具行为** ProGuard/R8 默认会**删除所有未使用的代码并混淆类/方法/字段名称**。 **方法参数名称**在 Java 字节码中默认不保留(除非显式配置),因此会被替换为 `var1`, `var2` 等占位符。 - **字节码限制** Java 编译器(如 `javac`)在编译时默认**不会将参数名写入 `.class` 文件**(除非添加 `-parameters` 编译选项),Android 项目通常未启用此选项。 --- ### **2. 影响场景** - **反射调用**:若依赖方法参数名称(如通过反射获取参数名),会导致运行时错误。 - **序列化库**:如 Gson、Retrofit 等依赖参数名的库可能失效。 - **代码可读性**:调试时堆栈信息中的参数名为 `var1`,难以追踪问题。 --- ### **3. 解决方案** #### **(1) 保留参数名称** 在 `proguard-rules.pro` 中添加规则,保留参数名属性: ```proguard # 保留方法参数名称 -keepattributes MethodParameters ``` #### **(2) 禁用参数混淆** 对特定类或包禁用参数混淆: ```proguard # 保留指定类的方法参数名 -keepclassmembers class com.example.MyClass { public void myMethod(java.lang.String, int); } # 保留整个包的参数名 -keepclassmembers class com.example.mypackage.** { *; } ``` #### **(3) 使用 @Keep 注解** 对需要保留的方法添加 `@Keep` 注解(需依赖 AndroidX): ```java @Keep public void myMethod(String param1, int param2) { // ... } ``` #### **(4) 针对 Kotlin 的配置** Kotlin 默认会保留参数名,但需确保混淆规则不覆盖: ```proguard # 保留 Kotlin 元数据 -keepattributes RuntimeVisibleAnnotations, AnnotationDefault -keepclassmembers class **.MyKotlinClass { @kotlin.Metadata *; } ``` #### **(5) 生成映射文件** 在 `build.gradle` 中启用映射文件生成,便于反混淆: ```groovy android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 生成映射文件 consumerProguardFiles 'proguard-rules.pro' } } } ``` 混淆后可在 `build/outputs/mapping/release/mapping.txt` 中查找原始名称。 --- ### **4. 注意事项** - **性能权衡**:保留参数名会增加 APK 体积,建议仅对关键代码配置。 - **反射优化**:尽量避免依赖参数名的反射设计,改用注解或接口。 - **R8 完整模式**:若使用 R8 完整模式(`android.enableR8.fullMode=true`),需更严格配置保留规则。 --- 通过上述步骤,可有效控制参数名的混淆行为,平衡安全性与可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值