Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中(meta-data)變量的值

使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中(meta-data)變量的值

編輯:關於Android編程

前言

在項目中,我們有時會需要根據不同的項目環境,使用不同的項目變量,

舉例:

  • 在測試環境中需要app訪問的服務器地址是測試服務器
  • 正式發布下的app需要訪問正式服務器。

可以使用下面三種技術來滿足要求:

使用 gradle 在編譯時動態設置 Android resValue

修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值

在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:

resValue "string", "AppName", "app1"

 

意為把名為 AppName 的 string value 值改為 app1


使用 gradle 在編譯時動態設置 Android BuildConfig

在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:

buildConfigField "String", "ENDPOINT", "\"http://example.com\""

 

gradle sync 一下後,BuildConfig.ENDPOINT 就會被賦值為http://example.com就可以供Java代碼調用了。


下面介紹如何設置標簽中的變量,如何使用標簽中的變量,請參考這裡

使用 gradle 在編譯時動態設置 Android Manifest

方法一:(不推薦)

在之前版本的gradle中,大部分的思路都是在AndroidManifest中定義一個變量,然後在編譯的時候,找出那個AndroidManifest中的變量,將它替換掉。

如友盟的多渠道打包,在原來的 AndroidManifest.xml 文件中添加:

 

然後使用在build.gradle中找出UMENG_CHANNEL_VALUE這個值,並且替換掉

android.applicationVariants.all{ variant ->
    println "${variant.productFlavors[0].name}"
    variant.processManifest.doLast{
        copy{
            from("${buildDir}/manifests"){
           include "${variant.dirName}/AndroidManifest.xml"
            }
            into("${buildDir}/manifests/$variant.name")
            filter{
     String line ->line.replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
            }
            variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")
        }
   }
}

 

方法二:使用manifestPlaceholders改變< meta-data>(推薦)

而在新版本的gradle中,processManifest這個方法被移除掉了,而提供了一個新的功能manifestPlaceholders,我們可以在AndroidManifest中定義一個變量,在build.gradle中動態的替換掉,十分方便,語法也十分簡單。對比上面的功能,我們需要動態替換友盟的appkey,需要在AndroidManifest中定義一個變量

 

接著,我們在build.gradle文件中根據不同的環境,生成不同appkey的apk。

buildTypes {
        debug {
         manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
        release {
       manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
        develop {
       manifestPlaceholders = [umeng_app_key: "你替代的內容"]
        }
    }

 

注意:這裡的“你替代的內容”,不能為特殊關鍵詞,比如:TRUE,否則在Java代碼中獲取不到meta-data中的值,

錯誤示例:

manifestPlaceholders = [oem: "TRUE"]

運行gralde clean build,你就可以生成不同的appkey的apk,是不是感覺好多了。^ ^

如果你想要替換多個變量,假如你需要兩個變量要替換,需要按照下面形式進行

buildTypes { debug { manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"] } ... }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved