Android-解放雙手之Gradle自動(dòng)化打包實(shí)戰(zhàn)(原創(chuàng))

本文已獨(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

GRADLE_HOME

2:步驟一完成以后將 GRADLE_HOME 添加到系統(tǒng)變量,如下圖

添加系統(tǒng)變量

3:上面兩個(gè)步驟執(zhí)行完畢以后憎妙。我們可以測(cè)試下Gradle環(huán)境是否安裝成功库正。首先打開cmd命令窗口? 輸入 gradle (第一次會(huì)比較慢)出現(xiàn)以下信息即為成功±逋伲或者在命令窗口 輸入 gradle -version 如果可以顯示版本信息即為環(huán)境配置成功

測(cè)試環(huán)境配置

環(huán)境配置好以后褥符,我們先回到Android Studio上面。使用Android Studio新建一個(gè)項(xiàng)目的時(shí)候抚垃,(將工具視圖切換成Android 也就是下面的紅色矩形)系統(tǒng)會(huì)為我們自動(dòng)生成2個(gè)build.gradle文件喷楣。

Android Studio生成的gradle

Android開發(fā)一般將圖上的綠色矩形描述為 項(xiàng)目的gradle,將黃色矩形稱為app.gradle鹤树。首先我們看下項(xiàng)目的gradle:

Project.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ī)制以及原來大家比較熟悉的寫法:

sign - 1

這里還給大家提供一種關(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ù)

有了讀取簽名文件的函數(shù)轩性,我們就可以進(jìn)行Alias、password的賦值狠鸳。

簽名函數(shù)使用

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文件夾下)該如何操作铅祸?

自定義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)下面的界面:

傳統(tǒng)方式

配置好基本信息以后萎津,點(diǎn)擊next卸伞,勾選V1、V2等一些配置即可完成簽名打包锉屈。

第二種:在Android Studio 底部Tab的 Terminal窗口 輸入 gradle a 命令本質(zhì)就是dos操作)荤傲,來幫助我們打包

gradle a打包

以上兩種打包方式都是傳統(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ā)人員將這種打包方式集成在別的工具上面损俭。

項(xiàng)目源碼

如果這篇文章對(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)成果,謝謝缸兔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末日裙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灶体,更是在濱河造成了極大的恐慌阅签,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝎抽,死亡現(xiàn)場(chǎng)離奇詭異政钟,居然都是意外死亡路克,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門养交,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精算,“玉大人,你說我怎么就攤上這事碎连』矣穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鱼辙,是天一觀的道長(zhǎng)廉嚼。 經(jīng)常有香客問我,道長(zhǎng)倒戏,這世上最難降的妖魔是什么怠噪? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杜跷,結(jié)果婚禮上傍念,老公的妹妹穿的比我還像新娘。我一直安慰自己葛闷,他們只是感情好憋槐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淑趾,像睡著了一般阳仔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上治笨,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天驳概,我揣著相機(jī)與錄音赤嚼,去河邊找鬼旷赖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛更卒,可吹牛的內(nèi)容都是我干的等孵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹂空,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俯萌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起上枕,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤咐熙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辨萍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棋恼,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爪飘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义起。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖师崎,靈堂內(nèi)的尸體忽然破棺而出默终,到底是詐尸還是另有隱情,我是刑警寧澤犁罩,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布齐蔽,位于F島的核電站,受9級(jí)特大地震影響床估,放射性物質(zhì)發(fā)生泄漏肴熏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一顷窒、第九天 我趴在偏房一處隱蔽的房頂上張望蛙吏。 院中可真熱鬧,春花似錦鞋吉、人聲如沸鸦做。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泼诱。三九已至,卻和暖如春赊锚,著一層夾襖步出監(jiān)牢的瞬間治筒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工舷蒲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耸袜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓牲平,卻偏偏與公主長(zhǎng)得像堤框,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纵柿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容