在 AndroidManifest.xml 文件中间可以通过 build.gradle 做中转,去获取 gradle.property 中的变量,主要是在使用 jenkins 自动构建的时候动态配置构建参数。
给出一个 gradle.property 文件
# Project-wide Gradle settings.
APP_NAME = 安卓应用
APP_ID = com.example
这里的字符串可以不用加引号。前面是字段名,后面的是字段对应的值。可以在 build.gradle 文件里直接使用这些字段的值。
apply plugin: 'com.android.application'
def getAppName() {
return new String(APP_NAME.getBytes("UTF-8"), "UTF-8")
}
ext {
appVersionCode = 277
appVersionName = 277
appid = APP_ID
appName = getAppName()
}
android {
flavorDimensions "default"
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.xjj.cloud.ypjczd"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName appVersionName
resValue("string", "SERVER_URL", XJJ_SN_SERVER_URL)
resValue("string", "useVpn", XJJ_USE_VPN)
}
productFlavors {
example {
applicationId appid
manifestPlaceholders = [APP_ICON: "@drawable/ic_launcher",
APP_NAME: appName]
}
}
}
上面是在 app 目录底下的 builde.gradle 文件的部分内容。
在 ext 里面定义的变量 appid 和 appName 是可以在当前的 build.gradle 中直接使用,这两个变量后面的赋值 APP_ID 和 APP_NAME 是自动从 gradle.property 中读取。这里定义了一个 getAppName 是因为直接使用 APP_NAME 会导致乱码。所以这里转换了一下。另外记得去 setting - editor - File Encodings 里面把所有的编码都改为 UTF-8 的。如下图所示:
然后为了在 AndroidManifest.xml 文件里面使用,所以我们在 build.gradle 文件里面的 manifestPlaceholders 定义了 APP_ICON 和 APP_NAME。
productFlavors {
example {
applicationId appid
manifestPlaceholders = [APP_ICON: "@drawable/ic_launcher",
APP_NAME: appName]
}
}
这样子,我们就可以在 AndroidManifest.xml 文件中通过 "${APP_ICON}" 这种方式来调用 build.gradle 中的变量。如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
package="com.xjj.demo">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="${APP_ICON}"
android:label="${APP_NAME}"
android:roundIcon="${APP_ICON}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name="com.example.MyActivity"
android:alwaysRetainTaskState="true"
android:hardwareAccelerated="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
所以 AndroidManifest.xml 就通过 build.gradle 文件来调用 gradle.property 中定义的变量了。