Android 在java.class中使用gradle定义的变量&使用gradle替换manifest的${xx}

本文介绍了如何在Android开发中利用Gradle在build.gradle文件中定义变量,并在Java类中调用,以及如何使用gradle的manifestPlaceholders来替换AndroidManifest.xml中的变量,实现不同环境配置的灵活切换。

参考了:http://blog.youkuaiyun.com/nwsuafer/article/details/42006157

场景:

开发时需要用到测试环境URL,而打包时需要改回正式环境URL,来回的注释总有会弄错的时候,但是如果在gradle构建时定义则不需要每次都去检查自己定义的URL是否是测试或正式,而且代码也整洁好多

 

1.在gradle文件中定义变量:

buildTypes {
    debug {
        minifyEnabled false  //混淆关闭
        signingConfig signingConfigs.release
        buildConfigField "String", "HTTP_API", "\"http://test.xxxx.com/\""
        manifestPlaceholders = [
                app_name: "@string/app_name_debug",
        ]
    }
    release {
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'prguard-rules.pro'//指定混淆规则文件
        signingConfig signingConfigs.release  //设置签名信息
        buildConfigField "String", "HTTP_API", "\"http://xxxx.com/\""
    }
}

定义后要SYNC重新刷新gradle文件,要不然会调用不到

P:上面的buildConfigField就是定义变量的关键字,buildConfigField "String", "HTTP_API", "\"http://xxxx.com/\""的意思是定义一个String类型的变量名为HTTP_API的且值为"http://xxxx.com\"的变量。manifestPlaceholder=[app_name: "@string/app_name_debug"]意思是把manifest文件中${app_name}占位符替换为@string/app_name_debug的值

2.在java.class文件中的调用

public final class HttpApi {

   public final static String HTTP_API = BuildConfig.HTTP_API;

// public final static String HTTP_API = "http://test.xxxx.com/";//测试环境地址

// public final static String HTTP_API = "http://xxxx.com";//正式环境地址

}

直接使用BuildConfig.HTTP_API就可以调用到gradle中定义的buildConfigField变量了

---------------------------------------------------------------------------------------------------------------------------------------------------------------

gradle中使用manifestPlaceholders替换app_name、app_id,app_icon

1.先在manifest.xml中定义占位符

<application
    android:allowBackup="true"
    android:exported="true"
    android:icon="${icon}"
    android:label="${app_name}"
    android:theme="@style/Theme.sty"
    tools:replace="icon, label,theme">
</application>

2.在各个渠道配置中使用这个manifestPlaceholders进行区别不同渠道APP,如:

productFlavors {
    360{
        applicationId "com.xxx.xxx"
        manifestPlaceholders = [app_name:"xxxx" ,icon: "@drawable/icon"]
        //在java代码中具体的使用方式为:context.getResources().getString(R.string.strKey);
        resValue("string" , "strKey","xx")
    }
}

也可以在buildTypes的debug或release中定义,但是会覆盖productFlavors中360中定义的变量

&lt;think&gt; 我们已经在之前的回答中详细讨论了多渠道打包的优化策略。现在,用户明确询问如何使用build.gradle.kts实现多渠道打包,因此需要提供一个基础的多渠道打包配置方法。 根据用户提供的引用[1]和[2],我们知道: 1. build.gradle文件Android Studio用于构建项目的配置文件使用Groovy或Kotlin DSL(build.gradle.kts)编写。 2. 最新版本的Android Studio推荐使用Gradle 8.2及以上版本。 因此,我们将在Kotlin DSL(build.gradle.kts)中配置多渠道打包。 基本步骤: 1. 在`android`块中定义`flavorDimensions`(维度),至少需要一个维度。 2. 在`productFlavors`中创建多个渠道,每个渠道指定一个维度。 3. 可以通过`manifestPlaceholders`或`buildConfigField`为每个渠道设置不同的值。 注意:在Kotlin DSL中,语法与Groovy有所不同。 示例代码: 假设我们有两个渠道:huawei和xiaomi,并且我们想为每个渠道设置一个渠道名(CHANNEL)的变量,该变量可以在代码中使用(通过BuildConfig或资源文件)。 方法一:通过`buildConfigField`将渠道名放入BuildConfig类 方法二:通过`manifestPlaceholders`将渠道名放入AndroidManifest.xml(如果需要在Manifest使用) 以下示例将同时展示两种方法。 另外,我们还可以为不同渠道配置不同的依赖,但这里先不展开。 由于用户要求的是实现多渠道打包的方法,我们先给出基本配置。 &lt;/think&gt;### 使用 Android Studio 的 build.gradle.kts 实现多渠道打包 以下是完整的 Kotlin DSL 配置方法(基于最新 Android Studio 和 Gradle 8.2+): #### 1. 基础配置(app/build.gradle.kts) ```kotlin plugins { id(&quot;com.android.application&quot;) kotlin(&quot;android&quot;) } android { namespace = &quot;com.example.app&quot; compileSdk = 34 defaultConfig { applicationId = &quot;com.example.app&quot; minSdk = 24 targetSdk = 34 versionCode = 1 versionName = &quot;1.0&quot; } // 定义渠道维度 flavorDimensions += &quot;channel&quot; // 配置多渠道 productFlavors { create(&quot;huawei&quot;) { dimension = &quot;channel&quot; // 渠道专属配置 manifestPlaceholders[&quot;CHANNEL_NAME&quot;] = &quot;Huawei&quot; buildConfigField(&quot;String&quot;, &quot;API_KEY&quot;, &quot;\&quot;HW_KEY_123\&quot;&quot;) } create(&quot;xiaomi&quot;) { dimension = &quot;channel&quot; manifestPlaceholders[&quot;CHANNEL_NAME&quot;] = &quot;Xiaomi&quot; buildConfigField(&quot;String&quot;, &quot;API_KEY&quot;, &quot;\&quot;XM_KEY_456\&quot;&quot;) } create(&quot;googleplay&quot;) { dimension = &quot;channel&quot; manifestPlaceholders[&quot;CHANNEL_NAME&quot;] = &quot;GooglePlay&quot; buildConfigField(&quot;String&quot;, &quot;API_KEY&quot;, &quot;\&quot;GP_KEY_789\&quot;&quot;) } } buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile(&quot;proguard-android-optimize.txt&quot;), &quot;proguard-rules.pro&quot; ) } } } dependencies { implementation(&quot;androidx.core:core-ktx:1.12.0&quot;) // 按渠道动态依赖 &quot;huaweiImplementation&quot;(&quot;com.huawei.hms:push:6.11.0.300&quot;) &quot;googleplayImplementation&quot;(&quot;com.google.firebase:firebase-messaging:23.4.0&quot;) } ``` #### 2. 在代码中获取渠道信息 ```kotlin // 获取 BuildConfig 中的值 val apiKey = BuildConfig.API_KEY // 获取 AndroidManifest 中的渠道名 val channelName = try { packageManager.getApplicationInfo( packageName, PackageManager.GET_META_DATA ).metaData.getString(&quot;CHANNEL_NAME&quot;) } catch (e: Exception) { &quot;default&quot; } ``` #### 3. 修改 AndroidManifest.xml ```xml &lt;application&gt; &lt;!-- 使用渠道占位符 --&gt; &lt;meta-data android:name=&quot;CHANNEL_NAME&quot; android:value=&quot;${CHANNEL_NAME}&quot; /&gt; &lt;/application&gt; ``` #### 4. 构建命令 ```bash # 构建特定渠道 ./gradlew assembleHuaweiRelease # 构建所有渠道 ./gradlew assembleRelease # 安装特定渠道 ./gradlew installHuaweiDebug ``` #### 5. 高级配置(可选) ```kotlin // 渠道专属资源目录 sourceSets { getByName(&quot;huawei&quot;) { res.srcDirs(&quot;src/huawei/res&quot;) } } // 动态过滤渠道 val targetFlavors = project.properties[&quot;channels&quot;]?.toString()?.split(&quot;,&quot;) ?: emptyList() if (targetFlavors.isNotEmpty()) { productFlavors.forEach { if (it.name !in targetFlavors) { it.isEnable = false // 禁用非目标渠道 } } } // 使用./gradlew assemble -Pchannels=huawei,xiaomi ``` #### 6. 优化建议(gradle.properties) ```properties # 启用构建缓存 org.gradle.caching=true org.gradle.configuration-cache=true # 并行构建 org.gradle.parallel=true # 资源优化 android.enableResourceOptimization=true ``` ### 实现原理 1. **维度管理**:`flavorDimensions` 定义维度,每个渠道需指定维度[^1] 2. **差异化配置**: - `manifestPlaceholders` 动态修改清单文件 - `buildConfigField` 生成渠道专属常量 - 渠道前缀依赖(如 `huaweiImplementation`) 3. **资源合并**:自动合并 `src/&lt;flavorName&gt;/res` 目录资源[^2] ### 验证方法 1. 生成 APK 后检查 `BuildConfig.java`: ```java public final class BuildConfig { // 渠道专属字段 public static final String API_KEY = &quot;HW_KEY_123&quot;; } ``` 2. 检查 APK 中的 `AndroidManifest.xml`: ```xml &lt;meta-data android:name=&quot;CHANNEL_NAME&quot; android:value=&quot;Huawei&quot; /&gt; ``` 通过此配置,可生成不同渠道的定制化 APK,适合应用商店分发和 A/B 测试场景[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值