本文已獨(dú)家授權(quán) 郭霖 ( guolin_blog?) 公眾號(hào)發(fā)布涵但!
前言:
解放雙手叨吮,雙擊桌面快捷方式生成apk包形纺,基于Gradle薇缅、bat文件讓開發(fā)人員告別打包煩擾危彩!
前不久有一個(gè)Unity3D研發(fā)的小仙女在羽毛球場(chǎng)問我關(guān)于Android Studio打apk的一些事情攒磨,她說他們運(yùn)營(yíng)和測(cè)試隔三差五的就坐著她旁邊要她重復(fù)性的打包(估計(jì)是那群癡漢打著工作的幌子實(shí)際上干著撩妹的活惹火了這位認(rèn)真敬業(yè)的小姐姐),那么有沒有省力一點(diǎn)的辦法快速打包汤徽?
一直以來娩缰,對(duì)于某些頻繁進(jìn)行打包工作的業(yè)務(wù)部開發(fā)人員來說,打包工作不僅繁瑣冗余而且費(fèi)時(shí)費(fèi)力谒府。如何快速拼坎、高效的解決頻繁出包以及提高生產(chǎn)效率解放生產(chǎn)力是我們一直在思考的問題。有沒有一種辦法比如我只想要雙擊桌面快捷方式然后就打包成APK?接著在保存到自定義盤符路徑狱掂???答案是有的演痒。我們知道Android Studio是基于Gradle來進(jìn)行快速構(gòu)建項(xiàng)目亲轨,Gradle本質(zhì)是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建工具趋惨。 由于一些論壇上的文章是基于Android2.X版本來進(jìn)行解釋說明但是筆者通過這幾天的實(shí)戰(zhàn)(Android Studio版本是3.0以上)發(fā)現(xiàn)網(wǎng)上的一些辦法已經(jīng)用不了且新版本自然而然增加了一些之前未提及的新特性,所以本文主要是針對(duì)Android Studio3.0版本以上以及Gradle進(jìn)行一些基本的內(nèi)容介紹以及如何通過組合技巧實(shí)現(xiàn)快速打包惦蚊;以及針對(duì)某一些特定的開發(fā)場(chǎng)景如何通過 Java + Gradle去思考并解決問題)器虾。
PS:文章使用到的源碼請(qǐng)見末尾。
首先是筆者個(gè)人開發(fā)環(huán)境:
? ? JDK:1.8.0_71
? ? Android Studio:3.0
? ? PC系統(tǒng):Win7
由于我們這里是基于Gradle進(jìn)行后面的操作蹦锋,所以我們首先需集成下Gradle的環(huán)境變量(前提是需要配置好JDK)如何配置Gradle環(huán)境兆沙?由于Android Studio里面內(nèi)置了Gradle,這里我就快速提供Gradle環(huán)境配置方案(當(dāng)然也可以自行谷歌或者百度):
1:找到自己Android Studio目錄下的gradle文件莉掂。這是筆者的Android Studio目錄下的gradle文件路徑:? C:\Program Files\Android\Android Studio\gradle\gradle-4.1\bin? 找到這個(gè)目錄以后葛圃,按照配置JDK那樣首先將其編輯到系統(tǒng)變量 GRADLE_HOME:
2:步驟一完成以后將 GRADLE_HOME 添加到系統(tǒng)變量,如下圖
3:上面兩個(gè)步驟執(zhí)行完畢以后憎妙。我們可以測(cè)試下Gradle環(huán)境是否安裝成功库正。首先打開cmd命令窗口? 輸入 gradle (第一次會(huì)比較慢)出現(xiàn)以下信息即為成功±逋伲或者在命令窗口 輸入 gradle -version 如果可以顯示版本信息即為環(huán)境配置成功
環(huán)境配置好以后褥符,我們先回到Android Studio上面。使用Android Studio新建一個(gè)項(xiàng)目的時(shí)候抚垃,(將工具視圖切換成Android 也就是下面的紅色矩形)系統(tǒng)會(huì)為我們自動(dòng)生成2個(gè)build.gradle文件喷楣。
Android開發(fā)一般將圖上的綠色矩形描述為 項(xiàng)目的gradle,將黃色矩形稱為app.gradle鹤树。首先我們看下項(xiàng)目的gradle:
首先铣焊,這里的兩段英文注釋寫的非常好,翻譯過來就是:( Top-level build file ......)頂級(jí)構(gòu)建文件罕伯,可以在所有子項(xiàng)目/模塊中添加常見的配置選項(xiàng)粗截;(NOTE: Do not place ......)注意:不要將你的應(yīng)用程序依賴項(xiàng)放在這里;它們屬于單獨(dú)的模塊構(gòu)建 .gradle文件捣炬。
我們知道Project.gradle文件主要是全局的gradle構(gòu)建腳本熊昌,這里的jcenter()绽榛、google()代碼,表示的是引用托管倉庫的名稱婿屹;這里的classpath主要是申明插件的版本號(hào)(這里的版本號(hào)就是3.0.0)灭美。總體來說項(xiàng)目的gradle文件是頂層的配置文件昂利,部分依賴使用也會(huì)在這里進(jìn)行對(duì)應(yīng)的配置届腐。
看完了最頂層的gradle文件在來看看app的gradle文件,這個(gè)文件是我們經(jīng)常打交道的地方蜂奸,配置簽名信息枝冀,渠道信息,配置各種第三方庫以及依賴等等灼擂。比如這個(gè)文件有我們最大的android { }標(biāo)簽以及配置依賴的dependencies{ }標(biāo)簽硫痰。dependencies標(biāo)簽里面就是應(yīng)用內(nèi)使用到的各種依賴比如我們的OkHttp、Glide等等祖屏;關(guān)于android{ }的配置因?yàn)閮?nèi)容較多助赞,下面是在網(wǎng)上收集到的該標(biāo)簽內(nèi)的一些標(biāo)簽資料:
? ? ? ? ? ? ? defaultConfig{ } 默認(rèn)配置,是ProductFlavor類型袁勺。它共享給其他ProductFlavor使用
sourceSets{ } 源文件目錄設(shè)置雹食,是AndroidSourceSet類型。
buildTypes{ } BuildType類型
signingConfigs{ } 簽名配置期丰,SigningConfig類型
productFlavors{ } 產(chǎn)品風(fēng)格配置群叶,ProductFlavor類型
testOptions{ } 測(cè)試配置,TestOptions類型
aaptOptions{ } aapt配置钝荡,AaptOptions類型
lintOptions{ } lint配置街立,LintOptions類型
dexOptions{ } dex配置,DexOptions類型
compileOptions{ } 編譯配置化撕,CompileOptions類型
packagingOptions{ } PackagingOptions類型
jacoco{ } JacocoExtension類型几晤。 用于設(shè)定 jacoco版本
splits{ } Splits類型
下面就是開始Gradle文件的常用配置:
A:占位符
在使用友盟進(jìn)行渠道統(tǒng)計(jì)常用的做法是 使用占位符,比如我們可以在AndroidManifest.xml文件使用meta-data進(jìn)行信息的配置植阴。
然后使用的話蟹瘾,如下圖:
B:簽名
簽名,是android標(biāo)簽內(nèi)大家經(jīng)常使用到的掠手,由于Android 7.0加入了新的簽名機(jī)制(也就是V2簽名)針對(duì)這個(gè)問題的解決方式可以參考這篇文章 Android-V1憾朴、V2簽名,因此我們可以直接在debug和release標(biāo)簽中加入v1SigningEnabled true 喷鸽、v2SigningEnabled true 規(guī)避使用風(fēng)險(xiǎn)
下面是加入新簽名機(jī)制以及原來大家比較熟悉的寫法:
這里還給大家提供一種關(guān)于簽名信息的寫法(拓展性比第一種較強(qiáng))众雷,首先,我們?cè)赼pp文件的根目錄下定義一個(gè)文件 signing.properties ,然后寫上具體的屬性值 (具體的說明如代碼截圖)
由于Gradle是一門腳本砾省,既然是腳本那么它肯定內(nèi)置了一些函數(shù)(注意:Gradle的函數(shù)是在app gradle文件內(nèi)置的標(biāo)簽外 進(jìn)行編寫)給我們操作調(diào)用鸡岗。因?yàn)閷⒑灻畔懙搅诉@里的配置文件,所以可以通過Gradle去讀取信息 然后進(jìn)行賦值编兄,代碼如下:
有了讀取簽名文件的函數(shù)轩性,我們就可以進(jìn)行Alias、password的賦值狠鸳。
C:多渠道包配置
Android Studio給我們提供的多渠道打包方案是使用productFlavors標(biāo)簽配置渠道信息揣苏,但是新版本下直接使用這個(gè)productFlavors標(biāo)簽會(huì)報(bào)錯(cuò),工具要求我們?cè)赿efaultConfig標(biāo)簽下新增flavorDimensions件舵,如果不使用flavorDimensions關(guān)鍵字卸察,編譯會(huì)報(bào)錯(cuò):
D:自定義apk輸出路徑
傳統(tǒng)的打包操作流程執(zhí)行編譯以及簽名后生成的apk默認(rèn)是 項(xiàng)目 \build\outputs\apk 這個(gè)路徑下面,那現(xiàn)在我想指定apk輸出的文件位置(比如我現(xiàn)在想讓這個(gè)apk輸出到 c盤下面的out_apk文件夾下)該如何操作铅祸?
其中這里的紅色矩形是對(duì)上面簽名第二種方法的補(bǔ)充說明坑质,這里的buildTypes標(biāo)簽需要寫在signingConfigs標(biāo)簽后面,否則很容易編譯錯(cuò)誤个少,這個(gè)是筆者遇到的問題洪乍;藍(lán)色矩形的代碼塊主要是首先判斷是debug還是release版本眯杏,如果是release版本就將apk輸入到這個(gè)指定盤符夜焦。
好了,說了這么多gradle文件的配置岂贩,下面就開始我們的打包工作茫经。
首先是我們的傳統(tǒng)打簽名包:
點(diǎn)擊Android Studio 頂部Tab , Build ?—— Generate Sign Apk 然后出現(xiàn)下面的界面:
配置好基本信息以后萎津,點(diǎn)擊next卸伞,勾選V1、V2等一些配置即可完成簽名打包锉屈。
第二種:在Android Studio 底部Tab的 Terminal窗口 輸入 gradle a 命令(本質(zhì)就是dos操作)荤傲,來幫助我們打包
以上兩種打包方式都是傳統(tǒng)的打包方式,那么有沒有更簡(jiǎn)單的操作颈渊?這種簡(jiǎn)單的操作類似我 在PC上面點(diǎn)擊一個(gè)快捷方式就給我生成apk包遂黍?答案在開頭已經(jīng)說了是有的。
A:首先俊嗽,我們?cè)?b>項(xiàng)目根目錄下創(chuàng)建一個(gè)指定的文件夾(用于編譯跑腳本用)雾家,這個(gè)文件一般定義為 .config文件(記住:前面有個(gè) . )
B:然后绍豁,在這個(gè)文件夾內(nèi)創(chuàng)建 build.bat文件芯咧。可能你會(huì)問什么是bat文件?bat文件是dos下的批處理文件。批處理文件是無格式的文本文件敬飒,它包含一條或多條命令邪铲。當(dāng)我們雙擊bat文件的時(shí)候,系統(tǒng)就會(huì)調(diào)用cmd.exe按照該文件中各個(gè)命令出現(xiàn)的順序來逐個(gè)運(yùn)行它們无拗。所以霜浴,我們只需要在這個(gè)bat文件里面寫下相應(yīng)的命令進(jìn)行操作即可
C:既然現(xiàn)在我們需要在bat文件里面寫命令,那么gradle里面有那些可以執(zhí)行的打包命令蓝纲?下面是收集到的一些資料阴孟,命令如下:
1:編譯所有productFlavor及對(duì)應(yīng)所有buildType的apk:
gradle assemble? //僅僅執(zhí)行項(xiàng)目打包所必須的任務(wù)集
gradle build? ? ? ? ? //執(zhí)行項(xiàng)目打包所必須的任務(wù)集,以及執(zhí)行自動(dòng)化測(cè)試,所以會(huì)較慢
如果當(dāng)前Project包含多個(gè)Module,在Project根目錄執(zhí)行g(shù)radle assemble會(huì)編譯所有的Module
2:編譯指定productFlavor及buildType的apk
gradle assemble[productFlavor][buildType]? //如果缺失某參數(shù),則會(huì)把該參數(shù)的所有配置都進(jìn)行編譯,即如果運(yùn)行g(shù)radle assembleflavor,則會(huì)編譯出flavor所有buildType的apk
例如:
gradle assemble
gradle assembleflavorRelease
gradle assembleflavorDebug
注意:gradle支持命令縮寫,上面兩個(gè)命令也可以寫成如下格式
$gradle a
$gradle ass
$gradle aR
$gradle assflavorR
$gradle aD
? ? ? ? ? ? ? $gradle assflavorD
D:既然dos命令確定了税迷,我們就可以寫bat文件進(jìn)行測(cè)試了:
E:接下來我們就可以將這個(gè)build.bat文件永丝,設(shè)置為桌面快捷方式,然后雙擊箭养,雙擊以后會(huì)彈出cmd窗口進(jìn)行打包然后去指定的文件夾拿到apk即可慕嚷。
以上步驟的前提是你需要配置好Gradle運(yùn)行環(huán)境、熟悉Gradle的基本命令以及必要的耐心和不怕失敗的勇氣毕泌。
一些思考:
既然通過這種方式可以完成快速打包喝检,那我們也可以通過Java的Swing首先寫個(gè)窗口,然后通過點(diǎn)擊去調(diào)用相應(yīng)的bat文件進(jìn)行后續(xù)的操作撼泛,也就是一個(gè)迷你的小型打包工具(產(chǎn)品和運(yùn)營(yíng)可能會(huì)覺得挠说,這個(gè)工具好厲害喲,那你兼項(xiàng)去做ios吧)愿题。當(dāng)然也有一些開發(fā)人員將這種打包方式集成在別的工具上面损俭。
如果這篇文章對(duì)您有開發(fā)or學(xué)習(xí)上的些許幫助,希望各位看官留下寶貴的star潘酗,謝謝杆兵。
Ps:著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明作者, 商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處(開頭或結(jié)尾請(qǐng)?zhí)砑愚D(zhuǎn)載出處仔夺,添加原文url地址),文章請(qǐng)勿濫用琐脏、開源項(xiàng)目?jī)H供學(xué)習(xí)交流、也希望大家尊重筆者的勞動(dòng)成果,謝謝缸兔。