本文已獨家授權 郭霖 ( guolin_blog ) 公衆号釋出!
前言:解放雙手,輕按兩下桌面快捷方式生成apk包,基于Gradle、bat檔案讓開發人員告别打包煩擾!
前不久有一個Unity3D研發的小仙女在羽毛球場問我關于Android Studio打apk的一些事情,她說他們營運和測試隔三差五的就坐着她旁邊要她重複性的打包(估計是那群癡漢打着工作的幌子實際上幹着撩妹的活惹火了這位認真敬業的小姐姐),那麼有沒有省力一點的辦法快速打包?
一直以來,對于某些頻繁進行打包工作的業務部開發人員來說,打包工作不僅繁瑣備援而且費時費力。如何快速、高效的解決頻繁出包以及提高生産效率解放生産力是我們一直在思考的問題。有沒有一種辦法比如
我隻想要輕按兩下桌面快捷方式然後就打包成APK接着在儲存到自定義盤符路徑? 答案是有的。我們知道Android Studio是基于Gradle來進行快速建構項目,Gradle本質是一個基于Apache Ant和Apache Maven概念的項目自動化建構工具。 由于一些論壇上的文章是基于Android2.X版本來進行解釋說明但是筆者通過這幾天的實戰(Android Studio版本是3.0以上)發現網上的一些辦法已經用不了且新版本自然而然增加了一些之前未提及的新特性,是以本文主要是
針對Android Studio3.0版本以上以及Gradle進行一些基本的内容介紹以及如何通過組合技巧實作快速打包;以及針對某一些特定的開發場景如何通過 Java + Gradle去思考并解決問題)。
PS:文章使用到的源碼請見末尾。
首先是筆者個人開發環境:
JDK:1.8.0_71
Android Studio:3.0
PC系統:Win7
由于我們這裡是基于Gradle進行後面的操作,是以我們首先需內建下Gradle的環境變量(前提是需要配置好JDK)如何配置Gradle環境?由于Android Studio裡面内置了Gradle,這裡我就快速提供Gradle環境配置方案(當然也可以自行谷歌或者百度):
1:找到自己Android Studio目錄下的gradle檔案。這是筆者的Android Studio目錄下的gradle檔案路徑:
C:\Program Files\Android\Android Studio\gradle\gradle-4.1\bin找到這個目錄以後,按照配置JDK那樣首先将其編輯到系統變量
GRADLE_HOME:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUmMhBDNkVzYlVDOzADNmVmY2AjNlJDOmljY4MjYmVTYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
2:步驟一完成以後将
GRADLE_HOME 添加到系統變量,如下圖添加系統變量
3:上面兩個步驟執行完畢以後。我們可以測試下Gradle環境是否安裝成功。首先打開cmd指令視窗 輸入
gradle(第一次會比較慢)出現以下資訊即為成功。或者在指令視窗 輸入
gradle -version如果可以顯示版本資訊即為環境配置成功
測試環境配置
環境配置好以後,我們先回到Android Studio上面。使用Android Studio建立一個項目的時候,(将工具視圖切換成Android 也就是下面的紅色矩形)系統會為我們自動生成2個build.gradle檔案。
Android Studio生成的gradle
Android開發一般将圖上的綠色矩形描述為 項目的gradle,将黃色矩形稱為app.gradle。首先我們看下項目的gradle:
Project.gradle
首先,這裡的兩段英文注釋寫的非常好,翻譯過來就是:( Top-level build file ......)頂級建構檔案,可以在所有子項目/子產品中添加常見的配置選項;(NOTE: Do not place ......)注意:不要将你的應用程式依賴項放在這裡;它們屬于單獨的子產品建構 .gradle檔案。
我們知道Project.gradle檔案主要是全局的gradle建構腳本,這裡的jcenter()、google()代碼,表示的是引用托管倉庫的名稱;這裡的classpath主要是申明插件的版本号(這裡的版本号就是3.0.0)。總體來說項目的gradle檔案是頂層的配置檔案,部分依賴使用也會在這裡進行對應的配置。
看完了最頂層的gradle檔案在來看看app的gradle檔案,這個檔案是我們經常打交道的地方,配置簽名資訊,管道資訊,配置各種第三方庫以及依賴等等。比如這個檔案有我們最大的android { }标簽以及配置依賴的dependencies{ }标簽。dependencies标簽裡面就是應用内使用到的各種依賴比如我們的OkHttp、Glide等等;關于android{ }的配置因為内容較多,下面是在網上收集到的該标簽内的一些标簽資料:
defaultConfig{ } 預設配置,是ProductFlavor類型。它共享給其他ProductFlavor使用
sourceSets{ } 源檔案目錄設定,是AndroidSourceSet類型。
buildTypes{ } BuildType類型
signingConfigs{ } 簽名配置,SigningConfig類型
productFlavors{ } 産品風格配置,ProductFlavor類型
testOptions{ } 測試配置,TestOptions類型
aaptOptions{ } aapt配置,AaptOptions類型
lintOptions{ } lint配置,LintOptions類型
dexOptions{ } dex配置,DexOptions類型
compileOptions{ } 編譯配置,CompileOptions類型
packagingOptions{ } PackagingOptions類型
jacoco{ } JacocoExtension類型。 用于設定 jacoco版本
splits{ } Splits類型
下面就是開始Gradle檔案的常用配置:
A:占位符在使用友盟進行管道統計常用的做法是 使用占位符,比如我們可以在AndroidManifest.xml檔案使用meta-data進行資訊的配置。
占位符
然後使用的話,如下圖:
占位符使用
B:簽名簽名,是android标簽内大家經常使用到的,由于Android 7.0加入了新的簽名機制(也就是V2簽名)針對這個問題的解決方式可以參考這篇文章
Android-V1、V2簽名,是以我們可以直接在debug和release标簽中加入v1SigningEnabled true 、v2SigningEnabled true 規避使用風險
下面是加入新簽名機制以及原來大家比較熟悉的寫法:
sign - 1
這裡還給大家提供一種關于簽名資訊的寫法(拓展性比第一種較強),首先,我們在app檔案的根目錄下定義一個檔案
signing.properties,然後寫上具體的屬性值 (具體的說明如代碼截圖)
簽名配置檔案
由于Gradle是一門腳本,既然是腳本那麼它肯定内置了一些函數(注意:Gradle的函數是在app gradle檔案内置的标簽外 進行編寫)給我們操作調用。因為将簽名資訊寫到了這裡的配置檔案,是以可以通過Gradle去讀取資訊 然後進行指派,代碼如下:
讀取簽名檔案函數
有了讀取簽名檔案的函數,我們就可以進行Alias、password的指派。
簽名函數使用
C:多管道包配置Android Studio給我們提供的多管道打包方案是使用productFlavors标簽配置管道資訊,但是新版本下直接使用這個productFlavors标簽會報錯,工具要求我們在defaultConfig标簽下新增flavorDimensions,如果不使用flavorDimensions關鍵字,編譯會報錯:
新特性
D:自定義apk輸出路徑傳統的打包操作流程執行編譯以及簽名後生成的apk預設是 項目 \build\outputs\apk 這個路徑下面,那現在我想指定apk輸出的檔案位置(比如我現在想讓這個apk輸出到 c盤下面的out_apk檔案夾下)該如何操作?
自定義apk輸出路徑
其中這裡的紅色矩形是對上面簽名第二種方法的補充說明,這裡的buildTypes标簽需要寫在signingConfigs标簽後面,否則很容易編譯錯誤,這個是筆者遇到的問題;藍色矩形的代碼塊主要是首先判斷是debug還是release版本,如果是release版本就将apk輸入到這個指定盤符。
好了,說了這麼多gradle檔案的配置,下面就開始我們的打包工作。
首先是我們的傳統打簽名包:
點選Android Studio 頂部Tab ,
Build —— Generate Sign Apk然後出現下面的界面:
傳統方式
配置好基本資訊以後,點選next,勾選V1、V2等一些配置即可完成簽名打包。
第二種:在Android Studio 底部Tab的
Terminal視窗 輸入 gradle a 指令(
本質就是dos操作),來幫助我們打包
gradle a打包
以上兩種打包方式都是傳統的打包方式,那麼有沒有更簡單的操作?這種簡單的操作類似我
在PC上面點選一個快捷方式就給我生成apk包?答案在開頭已經說了是有的。
A:首先,我們在
項目根目錄下建立一個指定的檔案夾(用于編譯跑腳本用),這個檔案一般定義為
.config檔案(記住:前面有個 . ) B:然後,
在這個檔案夾内建立 build.bat檔案。可能你會問什麼是bat檔案?bat檔案是dos下的批處理檔案。批處理檔案是無格式的文本檔案,它包含一條或多條指令。當我們輕按兩下bat檔案的時候,系統就會調用cmd.exe按照該檔案中各個指令出現的順序來逐個運作它們。是以,我們隻需要在這個bat檔案裡面寫下相應的指令進行操作即可
C:既然現在我們需要在bat檔案裡面寫指令,那麼gradle裡面有那些可以執行的打包指令?下面是收集到的一些資料,指令如下:
1:編譯所有productFlavor及對應所有buildType的apk:
gradle assemble //僅僅執行項目打包所必須的任務集
gradle build //執行項目打包所必須的任務集,以及執行自動化測試,是以會較慢
如果目前Project包含多個Module,在Project根目錄執行gradle assemble會編譯所有的Module
2:編譯指定productFlavor及buildType的apk
gradle assemble[productFlavor][buildType] //如果缺失某參數,則會把該參數的所有配置都進行編譯,即如果運作gradle assembleflavor,則會編譯出flavor所有buildType的apk
例如:
gradle assemble
gradle assembleflavorRelease
gradle assembleflavorDebug
注意:gradle支援指令縮寫,上面兩個指令也可以寫成如下格式
$gradle a
$gradle ass
$gradle aR
$gradle assflavorR
$gradle aD
$gradle assflavorD
D:既然dos指令确定了,我們就可以寫bat檔案進行測試了:
E:接下來我們就可以将這個build.bat檔案,設定為桌面快捷方式,然後輕按兩下,輕按兩下以後會彈出cmd視窗進行打包然後去指定的檔案夾拿到apk即可。
以上步驟的前提是你需要配置好Gradle運作環境、熟悉Gradle的基本指令以及必要的耐心和不怕失敗的勇氣。
一些思考:既然通過這種方式可以完成快速打包,那我們也可以通過Java的Swing首先寫個視窗,然後通過點選去調用相應的bat檔案進行後續的操作,也就是一個迷你的小型打包工具(産品和營運可能會覺得,這個工具好厲害喲,那你兼項去做ios吧)。當然也有一些開發人員将這種打包方式內建在别的工具上面。
項目源碼如果覺得這篇文章對你有小小的幫助,希望看官順勢點下一顆寶貴的star,謝謝。
Ps:著作權歸作者所有,轉載請注明作者, 商業轉載請聯系作者獲得授權,非商業轉載請注明出處(開頭或結尾請添加轉載出處,添加原文url位址),文章請勿濫用、開源項目僅供學習交流、也希望大家尊重筆者的勞動成果,謝謝。