這是一篇在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目錄下:
這樣言沐,基本一個(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版本寇甸,你需要換成你自己的版本。
這兩處修改了之后,編譯速度就快多了拿霉,一個(gè)app1分鐘:
我如果去掉./gradlew clean,不清空的話吟秩,編譯速度更快,大概10秒就能編完:
恩绽淘,對(duì)于我2012年的電腦涵防,在清空的情況下,1分鐘我覺得已經(jīng)可以接受了沪铭。8個(gè)app壮池,大概10分鐘吧。
這樣杀怠,我就可以在分支N個(gè)版本的時(shí)候椰憋,打開一個(gè)腳本,能自動(dòng)打包N個(gè)app了赔退。
一切都是因?yàn)閼小?/p>