一切都是因?yàn)閼小狝ndroid Studio自動(dòng)打包

這是一篇在Mac上Android Studio自動(dòng)打包腳本的產(chǎn)生以及優(yōu)化的文章并级。

其實(shí)自動(dòng)打包的腳本大家已經(jīng)寫的很多了,我這里只是一個(gè)總結(jié)吗冤,有需要的同學(xué)又厉,可以參考一下。

起初我們項(xiàng)目有2個(gè)app(android欣孤,iOS各一個(gè))馋没,測試版本加上線上版本,一共是4個(gè)app降传。打包app的時(shí)候,需要替換工程里的某些資源文件(例如服務(wù)器基地址勾怒,h5包等)婆排。手工拷貝我打包過一次就再不想有第二次了,耗時(shí)太長笔链,并且容易出錯(cuò)段只。所以當(dāng)時(shí)寫了一個(gè)簡單的自動(dòng)打包腳本:

1.腳本這么寫:

1.1定義需要區(qū)分的類型:

buildtype=Sample-hd-ol
hosttype=ol

1.2.獲取當(dāng)前工作路徑:

為什么要獲取當(dāng)前工作路徑,而不是寫死工程路徑鉴扫,是為了分支之后赞枕,我只需要找到編譯腳本所在的位置,而不需要修改工程路徑坪创。
例如我現(xiàn)在腳本所在位置是Sample/Shell目錄下炕婶,工程代碼路徑在Sample/SampleHD下,那么獲取當(dāng)前路徑這么寫:

#工作路徑
current_dir=$(pwd)
echo $current_dir
cd $current_dir
cd ..
cd Sample/SampleHD
workspace_path=$(pwd)
#打印一下代碼路徑
echo $workspace_path

1.3.拷貝項(xiàng)目所需要的資源:

例如莱预,我需要拷貝一個(gè)某個(gè)資源文件到工程:

#resource在工程里的路徑
#拷貝resource路徑
resource_path=/Users/Compass/Package/WebApp/${buildtype}/resource.zip
resource_workpath=${workspace_path}/app/src/main/assets/resource.zip

#拷貝resource到工程路徑柠掂,強(qiáng)制替換
cp ${resource_path} ${resource_workpath}

1.4.編譯之后,將app輸出到指定目錄:

#需要輸出的app的路徑
app_path=/Users/Compass/Package/app/$(date +%Y%m%d)

#以下為自動(dòng)編譯過程
#編譯config名稱
configname=samplerelease

#編譯路徑
build_path=./app/build/outputs/apk/app-${hosttype}-${configname}.apk

#apk名稱
apk_name=${buildtype}.apk

# 進(jìn)入要工作的文件夾
cd ${workspace_path}

# 清空
./gradlew clean

# 編譯
./gradlew assemble${hosttype}${configname}

# 按照日期創(chuàng)建
mkdir ${app_path}

# 將編譯出的結(jié)果拷貝到指定文件夾下
mv ${build_path} ${app_path}/${apk_name}

是不是很簡單依沮?這樣就完成了涯贞,但是,你會(huì)發(fā)現(xiàn)編譯不通過危喉,因?yàn)間raldle還沒有配置宋渔,配置如下:

2.工程里這么配置:

2.1.工程里(gradle.properties),配置秘鑰:

RELEASE_STORE_FILE=/Users/Compass/android/Key/wrkey.jks
RELEASE_STORE_PASSWORD=password
RELEASE_KEY_ALIAS=alias
RELEASE_KEY_PASSWORD=password

2.2. 在Module app的build.gradle里添加配置:

 signingConfigs {
        release{
            storeFile file (RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }
 buildTypes {
        samplerelease {
            debuggable false
            jniDebuggable false
            signingConfig signingConfigs.release
            minifyEnabled false
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

上面的samplerelease辜限,就是腳本里對(duì)應(yīng)的:

./gradlew assemble${hosttype}${configname}

這句里的configname;其中hosttype是Flavors皇拣,如果不需要?jiǎng)討B(tài)配置某些參數(shù),可以不需要加列粪。
添加Flavors,編譯的時(shí)候审磁,可根據(jù)ol,nt切換HOST_URL_VALUE谈飒,這個(gè)值在

productFlavors {
        ol {
            manifestPlaceholders = [HOST_URL_VALUE: "https://www.xxx.xxx"]
        }
        nt {
            manifestPlaceholders = [HOST_URL_VALUE: "http://172.xxx.xxx.xxx"]
        }
    }

HOST_URL_VALUE需要在AndroidManifest.xml里添加:

 <meta-data
            android:name="HOST_URL"
            android:value="${HOST_URL_VALUE}" />

在你的代碼里,這么寫就可以動(dòng)態(tài)獲取到在gradle里配置的值了:

  public static String getHost(Context context) {
        String hostURL = getAppMetaData(context, "HOST_URL");
        if (hostURL != null) {
            return hostURL;
        }

        return DEFUALT_HOST;
    }

這樣态蒂,gradle里也配置好了杭措,腳本也寫好了,打開控制臺(tái)钾恢,運(yùn)行一下手素,試試看:

cd /Users/Compass/Work/Sample/Shell
./sample_hd_ol.sh

是不是發(fā)現(xiàn)有這個(gè)問題:

-bash: ./sample_hd_ol.sh: Permission denied

這是權(quán)限問題,輸入下面命令就可以了:

 chmod 777 sample_hd_ol.sh

再次執(zhí)行腳本瘩蚪,看看結(jié)果泉懦。
如果成功了,在輸出目錄下疹瘦,就能看到打包好的apk了崩哩,比如,我這里是/Users/Compass/Package/app/20170811目錄下:

image.png

這樣言沐,基本一個(gè)自動(dòng)打包腳本就寫好了邓嘹。如果你有多個(gè)apk打包,可以寫多個(gè)腳本文件批處理险胰。

當(dāng)我們的項(xiàng)目汹押,從2個(gè)app,發(fā)展到現(xiàn)在需要編譯8個(gè)app的時(shí)候起便,出現(xiàn)了新的問題:

太慢了棚贾,竟然需要35分鐘!

平均一個(gè)app需要編譯4分鐘榆综。找了一下原因妙痹,是因?yàn)槲覀児こ汤镆昧撕芏喙矌欤幾g器編譯的時(shí)候都在線獲取版本奖年;以及每次Build都有一個(gè)新起一個(gè)JVM等原因细诸。

參考這位同學(xué)的文章《加快gradle的編譯速度總結(jié)-親身經(jīng)歷》:
http://www.reibang.com/p/200d55b4d40a

3.優(yōu)化:

3.1開啟守護(hù)進(jìn)程

將工程的gradle.propertis復(fù)制出來,里面貼如下內(nèi)容陋守,然后此目錄下,全局可以使用震贵,例如我的:/Users/Compass/.gradle/

  // 開啟線程守護(hù),第一次編譯時(shí)開線程水评,之后就不會(huì)再開了
  org.gradle.daemon=true 
  // 配置編譯時(shí)的虛擬機(jī)大小
  org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8  
  // 開啟并行編譯
  org.gradle.parallel=true 
  // 啟用新的孵化模式
  org.gradle.configureondemand=true  

加了這個(gè)配置之后猩系,原先編譯里的這個(gè)提示:

To honour the JVM settings for this build a new JVM will be forked. 
Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html.

就變成了:

Parallel execution with configuration on demand is an incubating feature.

3.2 Gradle離線配置

我將gradle包放入/Users/Compass/.gradle/下,指定Gradle home即可中燥。這個(gè)目錄也可以使用Android studio的安裝目錄:
/Applications/Android\ Studio.app/Contents/gradle/gradle-2.14.1
這里的gradle-2.14.1是我as里的gradle版本寇甸,你需要換成你自己的版本。


image.png

這兩處修改了之后,編譯速度就快多了拿霉,一個(gè)app1分鐘:

image.png

我如果去掉./gradlew clean,不清空的話吟秩,編譯速度更快,大概10秒就能編完:

image.png

恩绽淘,對(duì)于我2012年的電腦涵防,在清空的情況下,1分鐘我覺得已經(jīng)可以接受了沪铭。8個(gè)app壮池,大概10分鐘吧。

這樣杀怠,我就可以在分支N個(gè)版本的時(shí)候椰憋,打開一個(gè)腳本,能自動(dòng)打包N個(gè)app了赔退。

一切都是因?yàn)閼小?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橙依,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子离钝,更是在濱河造成了極大的恐慌票编,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵渴,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲤竹,警方通過查閱死者的電腦和手機(jī)浪读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛藻,“玉大人碘橘,你說我怎么就攤上這事≈。” “怎么了痘拆?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氮墨。 經(jīng)常有香客問我纺蛆,道長,這世上最難降的妖魔是什么规揪? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任桥氏,我火速辦了婚禮,結(jié)果婚禮上猛铅,老公的妹妹穿的比我還像新娘字支。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布堕伪。 她就那樣靜靜地躺著揖庄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欠雌。 梳的紋絲不亂的頭發(fā)上蹄梢,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音桨昙,去河邊找鬼检号。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛙酪,可吹牛的內(nèi)容都是我干的齐苛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桂塞,長吁一口氣:“原來是場噩夢啊……” “哼凹蜂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁危,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤玛痊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狂打,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擂煞,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年趴乡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了对省。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晾捏,死狀恐怖蒿涎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惦辛,我是刑警寧澤劳秋,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胖齐,受9級(jí)特大地震影響玻淑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜市怎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一岁忘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧区匠,春花似錦干像、人聲如沸帅腌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速客。三九已至,卻和暖如春五鲫,著一層夾襖步出監(jiān)牢的瞬間溺职,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工位喂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浪耘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓塑崖,卻偏偏與公主長得像七冲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子规婆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理澜躺,服務(wù)發(fā)現(xiàn),斷路器抒蚜,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 參考 中文官網(wǎng)構(gòu)建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,353評(píng)論 0 16
  • 姓名:劉小瓊 公司:寧波大發(fā)化纖有限公司 寧波盛和塾《六項(xiàng)精進(jìn)》第235期學(xué)員 【日精進(jìn)打卡第45天】 知~學(xué)習(xí) ...
    劉小瓊123閱讀 140評(píng)論 0 0