Android Studio 多渠道打包、自動版本號及 gradlew 命令的基本使用
title: Android Studio 多渠道打包、自動版本號及 gradlew 命令的基本使用
date: 2015-12-27 19:16:07
categories: Android Studio
tags: [Android Studio,gradlew]
博客: 安卓之家
微博: 追風917
CSDN: 蔣朋的家
簡書: 追風917
Android Studio 多渠道打包
Android Studio 真可謂神器,詳細請點這裏:打造安卓開發航空母艦
這裏介紹其多渠道打包:
1 建立多渠道
這裏介紹一種簡單的,直接as操作:
直接上圖咯,在項目結構你添加flavor就好了
確定後,項目會自動同步,完成後,渠道就配置好了。
當然,也可以直接在gradle腳本里操作:
android {
productFlavors {
dev {
manifestPlaceholders = [channel: "dev"]
}
official {
manifestPlaceholders = [channel: "official"]
}
xiaomi {
manifestPlaceholders = [channel: "xiaomi"]
}
wandoujia {
manifestPlaceholders = [channel: "wandoujia"]
}
"360" {
manifestPlaceholders = [channel: "360"]
}
}
}
項目同步好後,會發現Build Variant會多了很多渠道
2 打包
上面的各種variant,你需要選擇一個,然後build和run的時候只會構建運行這一個variant,全部打包的話,這裏採用命令行,我知道的as全部打包是需要簽名的,大家有知道的不需要簽名的方法麻煩告知。
gradlew build
這樣就會把所有的包打好,每種渠道的debug和release版本都會打包。
上面幾個包一共用了半分鐘多點。這個包的文件名帶時間版本號等信息是怎麼來的呢,當然這得益於gradle強大的功能,後面會講到的。
而as打包需要就是build --> Generated signed APK,這樣你選擇下就可以把所有渠道打包。
最近發現了個下一代Android打包工具,1000個渠道包只需要5秒鐘
自動版本號
昨天 2016.03.02 剛發現的好東西,更優雅的 Android 發佈自動版本號方案
這裏簡單總結下,配合 git 獲取軟件版本號和版本名
- 版本號 versionCode
使用 Git 中 commit 的數量來作爲版本號——versionCode
def cmd = 'git rev-list HEAD --first-parent --count'
def gitVersion = cmd.execute().text.trim().toInteger()
android {
defaultConfig {
versionCode gitVersion
}
}
- 版本名 versionName
使用 git describe,獲取從當期 commit 到距離它最近的 tag 的描述。默認都是 annoted tag,如果要指所有的類型的 tag 的話,就加 --tags 參數。
def cmd = 'git describe --tags'
def version = cmd.execute().text.trim()
android {
defaultConfig {
versionName version
}
}
最終的腳本詳見後文。
gradlew 命令
gradlew 是什麼東西呢,和gradle貌似不大一樣,肯定有關係。沒錯,他就是 gradle wrapper,意思是gradle的一個包裝,大家可以理解爲在這個項目本地就封裝了gradle,比如我的項目是HelloWord, 在HelloWord/gradle/wrapper/gralde-wrapper.properties文件中聲明瞭它指向的目錄和版本,比如我的內容是:
#Thu Dec 28 20:02:55 CST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
如果你項目沒有該文件的話,那麼gradlew會到~/.gradle/wrapper/dists/gradle-2.10-all下尋找,或者你新建給文件,內容複製到裏面。其實你會發現是同一個目錄咯。裏面會有個隨機數的文件夾,裏面就是gradle,只要下載成功即可用grdlew wrapper的命令代替全局的gradle命令。
常用命令如下:(linux下是./gradlew,該腳本在項目下,windows直接gradlew即可)
- ./gradlew -v 版本號,首次運行,沒有gradle的要下載的哦。
-
./gradlew clean 刪除HelloWord/app目錄下的build文件夾
-
./gradlew build 檢查依賴並編譯打包
這裏注意的是 ./gradlew build 命令把debug、release環境的包都打出來,生成的包在目錄HelloWord/app/build/outputs/apk/下。如果正式發佈只需要打release的包,該怎麼辦呢,下面介紹一個很有用的命令 assemble, 如
-
./gradlew assembleDebug 編譯並打Debug包
-
./gradlew assemblexiaomiDebug 編譯並打xiaomi的debug包,其他類似
-
./gradlew assembleRelease 編譯並打Release的包
-
./gradlew assemblexiaomiRelease 編譯並打xiaomi的Release包,其他類似
-
./gradlew installRelease Release模式打包並安裝
-
./gradlew uninstallRelease 卸載Release模式包
補充
1 gradlew build 和 gradle build 有區別嗎?
使用gradle wrapper是gradle官方推薦的build方式,而gradlew正是運行了wrapper task之後生成的(運行wrapper task是Android Studio自動做的)。使用gralde wrapper的一個好處就是每個項目可以依賴不同版本的gradle,構建的時候gradle wrapper會幫你自動下載所依賴的版本的gradle。而如果你使用gradle build的話,同時你又有多個項目使用不同版本的gradle,那就需要你手動在自己的機器上配置多個版本的gradle,稍微麻煩一些
2 自定義apk包名
gradle腳本大法好:
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
def gitVersionCode() {
def cmd = 'git rev-list HEAD --first-parent --count'
cmd.execute().text.trim().toInteger()
}
def gitVersionTag() {
def cmd = 'git describe --tags'
def version = cmd.execute().text.trim()
def pattern = "-(\\d+)-g"
def matcher = version =~ pattern
if (matcher) {
version = version.substring(0, matcher.start()) + "." + matcher[0][1]
} else {
version = version + ".0"
}
return version
}
//自定義apk安裝包名
applicationVariants.all { variant ->
variant.mergedFlavor.versionCode = gitVersionCode()
variant.mergedFlavor.versionName = gitVersionTag()
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent + "/${variant.buildType.name}",
"HelloWord-${variant.buildType.name}-v${variant.versionName}-${variant.productFlavors[0].name}-${releaseTime()}.apk".toLowerCase())
}
}
參考文章:
Android Studio系列教程五--Gradle命令詳解與導入第三方包
Android打包的那些事
更優雅的 Android 發佈自動版本號方案