基于AOSP构建:Android.mk能否设置minifyEnabled=true及替代方案?
首先明确一点:Android.mk本身并不支持直接设置minifyEnabled=true或shrinkResources=true——这两个是Android Gradle Plugin(AGP)专属的配置项,而AOSP基于Make的构建系统有自己的一套混淆与资源优化逻辑。不过我们完全可以通过AOSP提供的原生配置来实现等价效果,下面分两部分说明:
一、代码混淆(对应minifyEnabled=true)
AOSP支持使用ProGuard或R8进行代码混淆与优化,你需要在Android.mk中通过以下配置来开启:
开启混淆功能
使用LOCAL_PROGUARD_ENABLED指定混淆模式,常用值包括:full:同时开启混淆、优化与代码压缩obfuscation:仅开启混淆optimization:仅开启代码优化
指定混淆规则文件
通过LOCAL_PROGUARD_FLAG_FILES指向你的自定义混淆规则文件(比如proguard-rules.pro),也可以添加系统默认的Android混淆规则。
示例配置:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := YourTargetModule LOCAL_SRC_FILES := $(call all-java-files-under, src) # 开启完整的混淆与优化 LOCAL_PROGUARD_ENABLED := full # 指定自定义混淆规则 LOCAL_PROGUARD_FLAG_FILES := proguard-rules.pro # 引入AOSP自带的Android基础混淆规则(类似AGP的proguard-android.txt) LOCAL_PROGUARD_FLAGS += -include $(SRC_DIR)/frameworks/base/tools/proguard/proguard-android.txt # 如果需要使用R8替代ProGuard(部分AOSP版本默认支持) LOCAL_USE_R8 := true include $(BUILD_PACKAGE)
二、资源缩减(对应shrinkResources=true)
AOSP的资源缩减依赖代码混淆生成的资源使用记录(usage.txt),需要和代码混淆配合使用,配置方式如下:
启用资源缩减器
在Android.mk中添加LOCAL_RESOURCE_SHRINKER := true,这会让构建工具自动移除未被代码引用的资源。配合混淆生成使用记录
必须确保代码混淆已开启(即LOCAL_PROGUARD_ENABLED不为空),这样资源缩减器才能拿到混淆阶段生成的资源使用信息,精准判断哪些资源可以被移除。
示例配置(在上述混淆配置基础上添加):
# 启用资源缩减功能 LOCAL_RESOURCE_SHRINKER := true
注意事项
- 和AGP的
shrinkResources一样,如果你的代码通过反射引用资源,需要在res/raw/keep.xml中手动指定要保留的资源,避免被误删。 - 资源缩减仅对
BUILD_PACKAGE类型的模块生效,如果你构建的是库模块(BUILD_STATIC_JAVA_LIBRARY或BUILD_SHARED_JAVA_LIBRARY),该配置不会生效。
总结
虽然Android.mk没有直接对应AGP的minifyEnabled和shrinkResources配置,但通过LOCAL_PROGUARD_ENABLED+LOCAL_PROGUARD_FLAG_FILES实现代码混淆,配合LOCAL_RESOURCE_SHRINKER实现资源缩减,完全可以达到和原Gradle配置相同的资源缩减效果。
内容的提问来源于stack exchange,提问作者Midhun PM

