專案build.gradle的那些事(小記)
忙碌的2017.12已過,接著迎接忙碌的2018....
很久沒寫東西了,今天想跟著經驗寫最近對build.gradle的一些認為值得記錄的東西。
一、關於簽名
以前很多人都喜歡直接把簽名的資訊直接寫在gradle,但是這樣的做法不是太好,我們可以這樣做,用一個檔案專門存下簽名的配置資訊,此處姑且叫signing.properties,大致資訊如下:放在和build.gradle同一級別目錄下即可。
KEYSTORE_FILE = keystore存放路徑
KEYSTORE_PASSWORD = keystore密碼
KEY_ALIAS = key別名
KEY_PASSWORD = key密碼
接下來我們在專案的build.gradle中讀取這個檔案:
Properties props = new Properties()
props.load(new FileInputStream(file("signing.properties")))
signingConfigs {
release {
keyAlias props['KEY_ALIAS']
keyPassword props['KEY_PASSWORD']
storeFile file(props['KEYSTORE_FILE'])
storePassword props['KEYSTORE_PASSWORD']
}
}
二、生成名字特定的包.apk,如xxx+版本_日期.apk --> test1.1.0_20180108.apk,test1.1.0_20180108_debug.apk
目前我使用的兩種:
1.
//生成debug包和release包名字定義,release包:名稱+版本+日期.apk,debug包:名稱+版本+日期+debug.apk
applicationVariants.all{ variant->
variant.outputs.each { output->
def oldFile = output.outputFile
if(variant.buildType.name.equals('release')){
def releaseApkName = 'test' + defaultConfig.versionName + '-'+buildTime()+'.apk'
output.outputFile = new File(oldFile.parent, releaseApkName)
}else {
def debugApkName = 'test' + defaultConfig.versionName + '-'+buildTime()+'-debug.apk'
output.outputFile = new File(oldFile.parent, debugApkName)
}
}
}
def buildTime() {
def df = new SimpleDateFormat("yyyyMMdd")
df.setTimeZone(TimeZone.getDefault())
return df.format(new Date())
}
2.
//第二種方法 -- 生成debug包和release包名字定義,release包:名稱+版本+日期.apk,debug包:名稱+版本+日期+debug.apkapplicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
def fileName = outputFile.name.replace("app", "test" + "_v${variant.versionName}_${buildTime()}")
outputFileName = fileName
} else {
def fileName = outputFile.name.replace("app", "test_debug" + "_v${variant.versionName}_${buildTime()}")
outputFileName = fileName
} }
}
}
三、方法數超過64k的問題 現在專案都比較大,很容易出現方法數超過64k,當超過的時候As就無法執行,解決的方法是在build.gradle中加入: defaultConfig { ...............
multiDexEnabled true ...............
} 或者: compile 'com.android.support:multidex:1.0.0' 然後在你寫應用入口的XXApplication中繼承MultiDexApplication,如: public class BaseApplication extends MultiDexApplication {
/** 啟用MultiDex*/
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
} }
好啦,2018繼續前進,開發知識面要繼續拓寬!