You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AOSP编译时为Android.mk配置带-assumenosideeffects的ProGuard

解决AOSP编译中ProGuard -assumenosideeffects 不生效的问题

看起来你遇到的核心问题是AOSP构建系统与Android Studio Gradle构建在代码优化处理上的差异,尤其是Jack编译器的限制导致规则失效。下面是针对性的解决方案:

1. 禁用Jack编译器(关键修复)

Jack在AOSP中早已被废弃,它对ProGuard的-assumenosideeffects这类优化选项支持有限,这正是你的配置在Android Studio正常、但AOSP中失效的主要原因。

修改你的Android.mk,移除或明确禁用LOCAL_JACK_ENABLED:

# 移除这一行,或者设置为false
# LOCAL_JACK_ENABLED := incremental
LOCAL_JACK_ENABLED := false

2. 正确配置ProGuard启用选项

-assumenosideeffects属于优化类规则,必须确保构建系统开启了优化功能。将原来的custom替换为明确包含优化的选项:

LOCAL_PROGUARD_ENABLED := optimization obfuscation

如果不需要代码混淆,仅保留optimization即可。

3. 完善ProGuard配置文件

你的现有规则基础没问题,补充以下配置可确保在AOSP环境中优化正常生效:

# 开启优化并设置优化次数
-optimizationpasses 5
-allowaccessmodification
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*

# 移除指定Log方法
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

# 保留必要属性,避免混淆后出现运行时异常
-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
-dontwarn android.support.**

4. 验证配置是否生效

编译完成后,你可以通过反编译APK确认Log语句是否被移除:

  • 使用jadx打开生成的APK,搜索Log.d或Log.v,若找不到相关调用则说明配置生效。
  • 或用dex2jar将classes.dex转为jar,再用JD-GUI查看代码,检查是否还存在Log调用。

额外注意事项

  • 若你的AOSP版本是Android 10及以上,默认会使用R8代替ProGuard,上述ProGuard配置对R8完全适用,无需额外修改。
  • LOCAL_DEX_PREOPT := false在调试阶段没问题,正式构建时可根据需求开启,不会影响ProGuard的优化逻辑。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:01:00