目錄
版本管理
比如像compileSdkVersion這種的可以通過一個單獨的gradle文件來進(jìn)行管理如下柄冲,新建一個version.gradle文件吻谋,在里面定義一些配置的變量
ext{
appCompileSdkVersion = 30
appBuildToolsVersion = "30.0.3"
appMinSdkVersion = 21
appTargetSdkVersion = 30
appVersionCode = 1
appVersionName = "1.0"
}
build.gradle文件中引用并使用定義的變量
//引入version.gradle文件
apply from:"../version.gradle"
android {
compileSdkVersion appCompileSdkVersion
buildToolsVersion appBuildToolsVersion
defaultConfig {
applicationId "com.itfitness.gradletest"
minSdkVersion appMinSdkVersion
targetSdkVersion appTargetSdkVersion
versionCode appVersionCode
versionName appVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
修改生成的apk名稱
我們可以通過遍歷applicationVariants來對生成的apk文件修改名字
applicationVariants.all{variant ->
//遍歷variant的outputs,一般每個variant的outputs有debug和release兩個
variant.outputs.all {
//判斷文件是以.apk結(jié)尾的就修改文件名
if(outputFileName.endsWith(".apk")){
outputFileName = "itfitness_V" + versionName + "(" + versionCode + ").apk"
}
}
}
隱藏簽名文件信息
我們平時可能會將簽名文件的信息配置在signingConfigs中现横,這樣如果將代碼提交到遠(yuǎn)程的代碼倉庫就可能被別人看到漓拾,因此我們可以通過配置properties文件的方式將簽名信息放在自己本地的電腦上,然后通過讀取配置信息來實現(xiàn)與以前同樣的效果戒祠,代碼如下:
signingConfigs{
def signInfo = new ConfigSlurper().parse(new File("G:/signInfo.properties").toURI().toURL())
release{
storeFile file(signInfo.storeFilePath)
keyAlias signInfo.keyAlias
keyPassword signInfo.keyPassword
storePassword signInfo.storePassword
}
}
其中我的signInfo.properties在G盤
signInfo.properties文件的內(nèi)容如下
storeFilePath = "G:/testjks.jks"
keyAlias = 'testjks'
keyPassword = 'testjks'
storePassword = 'testjks'
動態(tài)配置AndroidManifest的信息
首先我們需要在module的build.gradle文件中配置一個productFlavor骇两,然后在manifestPlaceholders 屬性中配置我們自定義的信息,如下
productFlavors{
itfitness{
manifestPlaceholders = [
"MY_KEY":"Itfitness",
"APP_NAME":"Itfitness應(yīng)用"
]
}
}
然后我們就可以在AndroidManifest文件中通過${}來引用了姜盈,比如我這是加了一個meta-data并且修改了應(yīng)用名稱
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itfitness.androidgradledemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="${APP_NAME}"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AndroidGradleDemo">
<meta-data android:name="MY_KEY" android:value="${MY_KEY}"/>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
然后可以在代碼中獲取meta-data
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val myKey = appInfo.metaData.getString("MY_KEY")
myKey?.let {
Log.e("MetaData",myKey)
}
}
}
添加BuildConfig常量
我們可以在productFlavor中通過buildConfigField來添加BuildConfig常量脯颜,如下
productFlavors{
itfitness{
buildConfigField 'String','MYNAME','"Itfitness"'
manifestPlaceholders = [
"MY_KEY":"Itfitness",
"APP_NAME":"Itfitness應(yīng)用"
]
}
}
注意這里的三個值的意義分別是:類型、名稱贩据、常量值,這三個值生成了BuildConfig常量的時候都是純替換的闸餐,因此如果是字符串類型的值也要在單引號中加入雙引號饱亮,否則就會出錯,如下所示
另外注意如果修改了builde.gradle文件后沒有生成BuildConfig常量的話就需要Make Project一下
這里BuildConfig常量也可以在BuildType中定義如:
buildTypes {
release {
minifyEnabled false
buildConfigField 'int','M_VERSION','999'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField 'int','M_VERSION','666'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
動態(tài)添加自定義資源
我們可以在build.gradle文件中動態(tài)添加些string舍沙、color等資源近上,如下
productFlavors{
itfitness{
resValue 'color','ColorItfitness','#FF0000'
buildConfigField 'String','MYNAME','"Itfitness"'
manifestPlaceholders = [
"MY_KEY":"Itfitness",
"APP_NAME":"Itfitness應(yīng)用"
]
}
}
然后我們Make Project后就可以找到
Java編譯選項
我們可以通過配置compileOptions來指定Java的編譯選項,如下:
compileOptions {
encoding = 'utf-8' //源文件編碼
sourceCompatibility JavaVersion.VERSION_1_8 //源代碼編譯級別
targetCompatibility JavaVersion.VERSION_1_8 //字節(jié)碼生成的版本
}
Dex選項配置
有的時候我們打包會提示java.lang.OutOfMemoryError: GC overhead limit exceeded拂铡,這是因為我們打包生成apk用的是dx工具壹无,當(dāng)我們代碼太多的時候葱绒,默認(rèn)分配給dx工具的內(nèi)存就不足以打包apk了,這時我們可以通過配置dexOptions來解決這個問題斗锭,如下:
dexOptions{
javaMaxHeapSize '4g'
}
另外還有一些其他的可配置項地淀,如
incremental屬性:是一個boolean類型的屬性,用來配置是否啟用dx的增量模式岖是,默認(rèn)為false帮毁,增量模式雖然速度更快一點,但是可能會有一些限制豺撑,因此要慎用
dexOptions{
incremental true
}
jumboMode屬性:boolean類型的屬性烈疚,有時候我們的程序項目工程比較大,代碼太多聪轿,函數(shù)超過了65535個爷肝,5.0以上那就需要強制開啟jumbo模式才可以構(gòu)建成功
dexOptions{
jumboMode true
}
preDexLibraries屬性:boolean類型的屬性,用來配置是否預(yù)執(zhí)行dex Libraries庫工程陆错,開啟后會大大提高增量構(gòu)建的速度灯抛,不過可能會影響clean的構(gòu)建速度。默認(rèn)為true危号,但是如果我們需要使用dx的--multi-dex選項生成多個dex牧愁,這導(dǎo)致和庫工程有沖突的時候,需要將該屬性設(shè)為false
threadCount屬性:integer類型外莲,用來配置Android Gradle運行dx命令使用的線程數(shù)猪半,適當(dāng)?shù)木€程數(shù)量可以提高dx的效率:
dexOptions{
threadCount 2
}