如何在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
相关产品推荐
相关产品推荐

