1. 程式人生 > >使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中<meta-data>變量的值

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

-m lean view data- ret post 不能 flavor ...

轉載請標明出處:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客

你也能夠查看我的其它同類文章。也會讓你有一定的收貨

關於使用Gradle來控制版本號和生成不同版本號的代碼。我總結了三篇文章,網上關於這些知識,都比較零散。我在學習這些的之前。根本不知道還有這種方法。所以說不知道並不可怕,可怕的是不知道自己不知道。相信這三篇文章,會給你不少靈感

Gradle構建控制Log開關——BuildConfig\自己定義

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

Gradle編譯生成不同的版本號。動態設定應用標題 / 應用圖標 / 替換常量

前言

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

舉例:

  • 在測試環境中須要app訪問的server地址是測試server
  • 正式公布下的app須要訪問正式server。

能夠使用以下三種技術來滿足要求:

使用 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 文件裏加入:


<meta-data android:value="UMENG_CHANNEL_VALUE"   
            android:name="UMENG_CHANNEL"/>

然後使用在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中定義一個變量

<meta-data
         android:name="UMENG_APPKEY"
         android:value="${umeng_app_key}"/>

接著,我們在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,是不是感覺好多了。^ ^

假設你想要替換多個變量,假如你須要兩個變量要替換,須要依照以下形式進行

<meta-data
         android:name="UMENG_APPKEY"
         android:value="${umeng_app_key}"/>
<meta-data
          android:name="UMENG_SECRET"
    android:value="${umeng_app_secret}"/>
buildTypes {
        debug {
    manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"]
        }
        ...
    }

怎樣在Android獲取Manifest中< meta-data>元素的值


參考
http://hong1024.com/2015/02/10/%E4%BD%BF%E7%94%A8manifestPlaceholders%E6%9B%BF%E6%8D%A2%E5%8F%98%E9%87%8F/
http://write.blog.csdn.net/mdeditor#!postId=49247815

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