深入淺出Android Gradle構建系統(四:自定義構建過程之配置manifest)

yangxi_001發表於2017-06-15

Android Gradle外掛提供了大量的DSL來自定義構建過程,這篇blog就來講解如何在gradle中配置manifest。


DSL提供了配置以下Manifest條目的功能:
minSdkVersion
targetSdkVersion
versionCode
versionName
applicationId (更加方便有效的包名 -- [參考](http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename))
測試app的包名

Instrumentation test runner


示例:
[java] view plain copy
  1. android {  
  2.     compileSdkVersion 19  
  3.     buildToolsVersion "19.0.0"  
  4.   
  5.   
  6.     defaultConfig {  
  7.         versionCode 12  
  8.         versionName "2.0"  
  9.         minSdkVersion 16  
  10.         targetSdkVersion 16  
  11.     }  
  12. }  

android元素中的defaultConfig元素就是我們用來配置Manifest的地方。早期版本的Android外掛使用packageName來配置manifest中的packageName屬性,從0.11.0開始,使用applicationId來代替packageName。這樣可以消除應用的包名(其實就是應用的id)和java的包名之間的混淆。


更強大的是build檔案中描述的配置可以是動態的,比如可以從檔案或者自定義的邏輯中獲取版本名稱。
[java] view plain copy
  1. def computeVersionName() {  
  2.     ...  
  3. }  
  4.   
  5.   
  6. android {  
  7.     compileSdkVersion 19  
  8.     buildToolsVersion "19.0.0"  
  9.   
  10.   
  11.     defaultConfig {  
  12.         versionCode 12  
  13.         versionName computeVersionName()  
  14.         minSdkVersion 16  
  15.         targetSdkVersion 16  
  16.     }  
  17. }  

注意:不要使用作用域中的getter方法名作為函式名,比如在defaultConfig{}作用域中呼叫getVersionName()將會自動呼叫defaultConfig.getVersionName(),而不會呼叫自定義的方法。
如果某個屬性的值沒有使用DSL設定,這個屬性將會使用某些預設值,下表展示了預設值的處理過程。


 屬性名    DSL物件中的預設值   預設值
 
 Property Name  Default value in DSL object  Default value
 versionCode  -1  value from manifest if present
 versionName  null  value from manifest if present
 minSdkVersion  -1  value from manifest if present
 targetSdkVersion  -1  value from manifest if present
 applicationId  null  value from manifest if present
 testApplicationId  null  applicationId + “.test”
 testInstrumentationRunner  null  android.test.InstrumentationTestRunner
 signingConfig  null  null
 proguardFile  N/A (set only)  N/A (set only)
 proguardFiles  N/A (set only)  N/A (set only) 

如果你想在build指令碼中使用自定義的邏輯來查詢這些屬性,第二列中的值就很重要。比如,你可以編寫如下的程式碼:
[java] view plain copy
  1. if (android.defaultConfig.testInstrumentationRunner == null) {  
  2.     // assign a better default...  
  3. }  
如果屬性的值仍然是null,那麼在構建的時候,就會使用第三列的預設值,但是DSL元素中並不包含這些預設值,因此你不能在程式中查詢這些值。這樣做的目的是僅在必要的時候(構建時)才會去解析manifest內容。

相關文章