深入淺出Android Gradle構建系統(五:build type)

yangxi_001發表於2017-06-15
預設情況下,Android外掛自動為專案構建一個debug和一個release版本的應用。這兩個版本的不同主要體現在在非開發機上的除錯功能以及APK的簽名方式。debug版本使用一個用公開的name/password建立的key來簽名(這樣構建的時候就不需要提示輸入密碼了)。release版本在構建的時候不會進行簽名,而是稍後在做。
這個可以使用gradle中的BuildType物件來進行配置。預設情況下,2個BuildType的例項會被建立,一個debug,一個release。Android外掛允許自定義這兩個例項,當然你也可以建立其他的build type。配置由buildTypes這個DSL來完成:
[java] view plain copy
  1. android {  
  2.     buildTypes {  
  3.         debug {  
  4.             applicationIdSuffix ".debug"  
  5.         }  
  6.   
  7.   
  8.         jnidebug.initWith(buildTypes.debug)  
  9.         jnidebug {  
  10.             packageNameSuffix ".jnidebug"  
  11.             jniDebuggable true  
  12.         }  
  13.     }  
  14. }  
上面的程式碼完成了下列配置:
1.配置預設的debug Build Type
  設定debug版本的報名為<應用id>.debug,這樣就可以在裝置上同時安裝debug和release版本了。
2.建立一個新的BuildType,名字是jnidebug,同時配置它是複製自debug Build Type。
  配置jnidebug開啟debug版本的JNI元件,新增一個不同的包名字尾。


建立一個新的的Build Types非常簡單,只需要在buildTypes下面通過呼叫initWith或者使用閉包新增一個新的元素。下表是可以配置的屬性以及預設值:


 屬性明   debug版本預設值  release或其他版本 預設值
 debuggable  true  false
 jniDebuggable   false   false
 renderscriptDebuggable  false   false
 renderscriptOptimLevel  3   3
 applicationIdSuffix   null  null
 versionNameSuffix   null  null
 signingConfig   android.signingConfigs.debug  null
 zipAlignEnabled   false   true
 minifyEnabled   false   false
 proguardFile  N/A (set only)  N/A (set only)
 proguardFiles   N/A (set only)  N/A (set only)


出了這些屬性,Build Types還可以用來配置程式碼和資原始檔。針對每一個Build Type,一個新的對應的sourceSet會被建立,這個sourceSet使用一個預設的路徑src/<buildtype名字>/。這就意味著Build Type的名字不能是main或者androidTest(這是由外掛強制的),同時每個Build Type的名字必須是唯一的。


和其他的source sets一樣,Build Type中的source set路徑也是可以配置
[java] view plain copy
  1. android {  
  2.     sourceSets.jnidebug.setRoot('foo/jnidebug')  
  3. }  

另外,對每一個Build Type,一個新的assemble<BuildType名字>任務會被建立.前面我已經講過assembleDebug和assembleRelease任務了,這裡就可解釋這兩個任務的來源了.當debug和release Build Types被預先建立的時候,他們對應的assemble任務也會被一起建立.


上面的build.gradle程式碼片段還會建立一個assembleJnidebug任務,assemble任務也會新增對assembleJniDebug任務的依賴,正如它對assembleDebug和assembleRelease任務的依賴一樣。


小提示:你可以使用 gradle aJ命令來執行assembleJnidebug任務。


可能是使用場景:
僅在debug模式下使用的許可權,release模式不使用。
debug時使用不同的實現
debug模式使用不同的資源(比如當一個資源的值依賴於簽名的時候)


BuildType中的 程式碼/資原始檔 將會被按照下列方式處理:
manifest配置會被merge到app manifest中
程式碼不會被merge,會被當做另一個程式碼目錄(source folder)來使用
資原始檔會覆蓋同名的main中的資原始檔

相關文章