Android Studio 多渠道打包、自動版本號及 gradlew 命令的基本使用

Android Studio 多渠道打包、自動版本號及 gradlew 命令的基本使用

字數1444 閱讀1983 評論4 

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就好了


1

確定後,項目會自動同步,完成後,渠道就配置好了。

當然,也可以直接在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會多了很多渠道


variant

2 打包

上面的各種variant,你需要選擇一個,然後build和run的時候只會構建運行這一個variant,全部打包的話,這裏採用命令行,我知道的as全部打包是需要簽名的,大家有知道的不需要簽名的方法麻煩告知。

gradlew build

這樣就會把所有的包打好,每種渠道的debug和release版本都會打包。


2

上面幾個包一共用了半分鐘多點。這個包的文件名帶時間版本號等信息是怎麼來的呢,當然這得益於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的要下載的哦。

gradlev
  • ./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模式包

補充


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 發佈自動版本號方案

發佈了5 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章