BuildConfig 是 Android 的特性,不是项目特有的。它是 Android Gradle 插件在编译时自动生成的类。

BuildConfig 详解

1. 是什么?

BuildConfig 是 Android 构建系统在每个模块(module)编译时自动生成的 Java/Kotlin 类。

2. 自动生成位置

text

app/
├── build/
│   ├── generated/
│   │   └── source/
│   │       └── buildConfig/
│   │           └── debug/ 或 release/
│   │               └── com/example/app/
│   │                   └── BuildConfig.java  <- 自动生成

3. 默认包含的内容

java

// 自动生成的 BuildConfig.java
public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.example.myapp";
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "free";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0";
    
    // 这是你配置的自定义字段!
    public static final NadBrowserFactory.Factory BROWSER_FACTORY = 
        new LightBrowserFactory();
}

4. 如何自定义 BuildConfig 字段?

在你的 Gradle 配置中:

groovy

// app/build.gradle
android {
    defaultConfig {
        buildConfigField "String", "API_BASE_URL", '"https://api.example.com"'
        buildConfigField "boolean", "LOG_ENABLED", "true"
        buildConfigField "int", "TIMEOUT", "30"
    }
    
    buildTypes {
        debug {
            buildConfigField "String", "API_BASE_URL", '"https://debug-api.example.com"'
            buildConfigField "boolean", "LOG_ENABLED", "true"
        }
        release {
            buildConfigField "String", "API_BASE_URL", '"https://api.example.com"'
            buildConfigField "boolean", "LOG_ENABLED", "false"
        }
    }
    
    // 产品风味(多渠道打包)
    flavorDimensions "version"
    productFlavors {
        free {
            buildConfigField "boolean", "IS_PREMIUM", "false"
            buildConfigField "int", "MAX_FEATURES", "3"
        }
        premium {
            buildConfigField "boolean", "IS_PREMIUM", "true"  
            buildConfigField "int", "MAX_FEATURES", "10"
        }
    }
}

5. 在代码中使用

kotlin

// Kotlin 中使用
class MyActivity : Activity() {
    fun setup() {
        // 使用 BuildConfig
        val baseUrl = BuildConfig.API_BASE_URL
        val isDebug = BuildConfig.DEBUG
        val factory = BuildConfig.BROWSER_FACTORY  // 你的自定义字段
        
        if (BuildConfig.LOG_ENABLED) {
            Log.d("TAG", "Logging is enabled")
        }
    }
}

6. 为什么使用 BuildConfig?

a. 编译期确定,无运行时开销

kotlin

// 正确:编译期常量,会被优化
if (BuildConfig.DEBUG) {
    // debug 包中这段代码存在
    // release 包中这段代码会被编译器优化掉!
}
 
// 对比:运行时判断(性能差)
if (isDebugBuild()) {  // 需要运行时计算
    // 始终存在,即使 release 包
}

b. 不同构建类型不同配置

groovy

// 开发环境
buildConfigField "String", "ENV", '"development"'
buildConfigField "String", "API_URL", '"http://dev-api.com"'
 
// 测试环境  
buildConfigField "String", "ENV", '"staging"'
buildConfigField "String", "API_URL", '"http://test-api.com"'
 
// 生产环境
buildConfigField "String", "ENV", '"production"'
buildConfigField "String", "API_URL", '"https://api.com"'

c. 安全存储配置

groovy

// 安全存储敏感信息(API Key 等)
buildConfigField "String", "GOOGLE_MAPS_KEY", "\"$google_maps_api_key\""

kotlin

// 代码中直接使用,不暴露在源码中
val mapsKey = BuildConfig.GOOGLE_MAPS_KEY

7. 在你的项目中的具体应用

groovy

// 这就是你看到的配置!
switch ("${WEBVIEW_PROVIDER}") {
    case 'swan':
        // 编译时注入不同的工厂实现
        variant.buildConfigField "com.baidu.nadcore.webview.NadBrowserFactory.Factory", 
            "BROWSER_FACTORY", 
            "new com.baidu.nadcore.webview.LightBrowserFactory()"
        break
    case 'native':
        variant.buildConfigField "com.baidu.nadcore.webview.NadBrowserFactory.Factory", 
            "BROWSER_FACTORY", 
            "new com.baidu.nadcore.webview.NativeBrowserFactory()"
        break
}

编译后生成的 BuildConfig.java

java

public final class BuildConfig {
    // ... 其他字段
    
    // 根据 WEBVIEW_PROVIDER 的值,这里会是不同的工厂
    public static final NadBrowserFactory.Factory BROWSER_FACTORY = 
        new LightBrowserFactory();  // 或 NativeBrowserFactory
}

8. BuildConfig 的局限性

  • 只能存储编译期常量(字符串、整数、布尔值、类引用等)
  • 不能存储复杂的运行时对象
  • 每个模块(module)有自己的 BuildConfig
  • 修改后需要重新编译

9. 类似的 Android 特性

  • 资源文件(res/values):也可以配置不同构建类型的值
  • AndroidManifest 占位符:${applicationId}
  • Gradle 属性文件:gradle.properties

总结

BuildConfig 是 Android 官方提供的构建时配置系统,用于:

  1. 存储构建配置(如 API 地址、功能开关等)
  2. 支持不同环境的不同配置(debug/release,不同渠道)
  3. 提高性能(编译期常量优化)
  4. 增强安全性(敏感信息不暴露在源码中)
    在你的项目中,它被巧妙用于编译期依赖注入,实现不同 WebView 内核的策略选择。这是一种非常 Android 特色的设计模式。

更新: 2026-01-28 00:02:11
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/hhzf1808h1ern5mr


相关笔记