深入浅出Android Gradle构建系统(四:自定义构建过程之配置manifest)

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内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值