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

如何让BUILD_BRAND环境变量在使用Android.mk的Android项目中全局可用

解决Android.mk项目中BUILD_BRAND变量全局可用的方案

Android应用运行时的进程环境和编译时的终端环境完全隔离,所以直接调用System.getEnv()无法获取编译阶段的环境变量,必须通过编译环节将变量注入到应用代码中,以下是几种可行的实现方案:

方案一:生成Java常量类(推荐)

在Android.mk中直接生成包含BUILD_BRAND的常量类,让代码可以直接引用:

  1. 在模块的Android.mk中添加以下代码,自动生成BuildConfig.java文件:
# 读取环境变量,为空时设置默认值
LOCAL_BUILD_BRAND := $(BUILD_BRAND)
ifeq ($(LOCAL_BUILD_BRAND),)
LOCAL_BUILD_BRAND := "default"
endif

# 指定生成的Java文件路径和包名
LOCAL_GENERATED_SOURCES += $(local-generated-sources-dir)/com/your/package/BuildConfig.java
$(local-generated-sources-dir)/com/your/package/BuildConfig.java: PRIVATE_BUILD_BRAND := $(LOCAL_BUILD_BRAND)
$(local-generated-sources-dir)/com/your/package/BuildConfig.java:
	@mkdir -p $(dir $@)
	@echo "package com.your.package;" > $@
	@echo "public final class BuildConfig {" >> $@
	@echo "    public static final String BUILD_BRAND = \"$(PRIVATE_BUILD_BRAND)\";" >> $@
	@echo "}" >> $@
  1. 将com/your/package替换为项目实际包名,编译完成后,即可在任意Java代码中直接通过BuildConfig.BUILD_BRAND获取变量值。

方案二:通过AndroidManifest.xml的meta-data传递

把BUILD_BRAND写入Manifest的meta-data节点,运行时读取该值:

  1. 在AndroidManifest.xml中添加占位符:
<application ...>
    <meta-data
        android:name="BUILD_BRAND"
        android:value="${BUILD_BRAND_VALUE}" />
</application>
  1. 在Android.mk中替换Manifest里的占位符:
LOCAL_BUILD_BRAND := $(BUILD_BRAND)
ifeq ($(LOCAL_BUILD_BRAND),)
LOCAL_BUILD_BRAND := "default"
endif

# 配置AAPT替换参数
LOCAL_MANIFEST_FILE := $(LOCAL_PATH)/AndroidManifest.xml
LOCAL_AAPT_FLAGS += --define BUILD_BRAND_VALUE=$(LOCAL_BUILD_BRAND)
  1. 在Activity中读取meta-data:
try {
    ApplicationInfo appInfo = getPackageManager().getApplicationInfo(
            getPackageName(), PackageManager.GET_META_DATA);
    String buildBrand = appInfo.metaData.getString("BUILD_BRAND");
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

方案三:通过JNI传递给Java层(适合C/C++层也需使用该变量的场景)

  1. 在Android.mk中给C/C++代码传递宏定义:
LOCAL_BUILD_BRAND := $(BUILD_BRAND)
ifeq ($(LOCAL_BUILD_BRAND),)
LOCAL_BUILD_BRAND := "default"
endif

LOCAL_CFLAGS += -DBUILD_BRAND="$(LOCAL_BUILD_BRAND)"
  1. 在JNI代码中暴露方法给Java层:
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_your_package_MainActivity_getBuildBrand(JNIEnv *env, jobject thiz) {
    return (*env)->NewStringUTF(env, BUILD_BRAND);
}
  1. 在Java层声明native方法并调用:
public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("your-native-lib");
    }

    public native String getBuildBrand();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String buildBrand = getBuildBrand();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:10:35