前言
測試是我們開發(fā)中不可缺少的一個(gè)環(huán)節(jié)躬存,我們一般都會有自己的測試環(huán)境茄唐,我們的測試apk可能會放在我們的內(nèi)網(wǎng)上息裸,也可能會放在三方測試平臺,比如fir.im沪编、蒲公英等等呼盆,但是有時(shí)會出現(xiàn)沒有合適的位置訪問安裝包,又考慮三方平臺的安全性問題漾抬,這時(shí)就尷尬了宿亡,這篇文章就是講的如何去解決這一麻煩常遂。
關(guān)于python腳本
腳本在后端開發(fā)中很常見纳令,比如發(fā)版上線、跑批量等等,但是在移動端開發(fā)中顯得沒有那么重要了平绩,但是腳本在一些方面是很方便的圈匆。Gradle的打包過程可以認(rèn)為是腳本,自動化測試也可以理解為腳本捏雌,在一些場景中我們可以吧一些重復(fù)的工作交給腳本來做跃赚。
常見的場景--打包交付測試
在平時(shí)的開發(fā)中,我們可能需要打包給測試人員性湿,傳統(tǒng)的方式是usb線運(yùn)行adb命令給每個(gè)測試打新包纬傲,這個(gè)過程除了和測試的溝通外,還得測試機(jī)一個(gè)個(gè)連接電腦肤频,顯然叹括,每個(gè)移動端開發(fā)都不希望做這些重復(fù)累贅的工作,那怎么來解決這個(gè)問題呢宵荒?很多公司可能都有這么一個(gè)測試平臺的地址汁雷,我們打包的測試包都會放在這個(gè)測試平臺上,每次新版本發(fā)布后报咳,測試人員用測試機(jī)從上面下載下來安裝測試侠讯,這是常見的解決方案。但是打包上傳流程暑刃,還得手動去做厢漩,一個(gè)好的程序猿,一定是個(gè)“懶”程序猿岩臣,所以我們來嘗試省去手動上傳的這個(gè)步驟袁翁。
利用python實(shí)現(xiàn)一句命令打包上傳測試
我們來分析上面的這個(gè)場景,首先:我們使用AndroidStudio打包測試apk婿脸;其次:打包好的apk需要放置在我們的測試平臺上粱胜;最后:測試人員在手機(jī)瀏覽器輸入apk的地址下載安裝apk。對于第一條狐树,這個(gè)我們使用gradle的task比如assembleDebug
去完成焙压,第二條,我們需要知道測試平臺的地址抑钟、賬號涯曲、相關(guān)目錄等,這里我本地起一個(gè)apache的服務(wù)來模擬這么個(gè)場景在塔,你在平時(shí)開發(fā)中也可以這么做幻件,我用的mac,起apache的命令是sudo apachectl start
蛔溃,我們把a(bǔ)pk拷貝到apache的一個(gè)固定目錄下绰沥,最后測試人員輸入這個(gè)地址就可以訪問到了篱蝇,當(dāng)然都必須在同一局域網(wǎng)內(nèi)。
按照上面的流程我們一步步來做:我們知道AndroidStudio的打包是依賴gradle的徽曲,gradle運(yùn)行不同的task去實(shí)現(xiàn)打不同的包零截,我們自定義一個(gè)task
task debugApkToWeb{
dependsOn 'assemble開發(fā)Debug'
}
這個(gè)task是包裹在android {}
中的,關(guān)于gradle的介紹可以去看網(wǎng)上的分享秃臣,這里就不展開了涧衙。
python代碼部分,比較簡單
import os
import shutil
//獲取該目錄下的文件列表
alllist = os.listdir("/Users/xxx/AndroidStudioProjects/Android/app/build/outputs/apk/")
//遍歷
for i in alllist:
//如果文件是以apk結(jié)尾繼續(xù)
if (i.endswith(".apk")):
//分割文件名和文件后綴
aa,bb = i.split(".")
//舊文件
oldname = "/Users/xxx/AndroidStudioProjects/Android/app/build/outputs/apk/"+aa+"."+bb
//新文件
newname = "/Library/WebServer/Documents/"+aa+"."+bb
//拷貝
shutil.copyfile(oldname,newname)
//打印
print aa
10行代碼完成文件拷貝奥此,不要太爽
拷貝完成弧哎,我們的任務(wù)就算是結(jié)束了,告訴測試人員新版發(fā)布完成就可以了稚虎。不要太爽啊傻铣,哈哈哈。
我們把gradle的task補(bǔ)充完整:
task debugApkToWeb(type: Exec){
dependsOn 'assembleDebug'
commandLine "./gradlew","clean"
commandLine "sudo","python","/Users/xxx/AndroidStudioProjects/Android/copyApkToApacheDocument.py"
}
使用方法祥绞,Terminal切換項(xiàng)目根目錄非洲,運(yùn)行命令:
./gradlew debugApkToWeb
后續(xù)
這里還有一個(gè)小技巧,我們的各種環(huán)境打出不同的包蜕径,為了方便識別两踏,我們可以定制不同的logo,logo上寫上不同的字就可以了兜喻。然后我們在app的build.gradle中使用
manifestPlaceholders = [app_icon: "@mipmap/ic_launcher_xxx",
app_name: "xxx"]
manifest的application中
<application
android:name=".xxx"
android:icon="${app_icon}"
android:label="${app_name}">
如果想安裝多個(gè)app梦染,flavor中的每個(gè)product可以加上
applicationIdSuffix ".xxx"
如果適配了安卓7.0,安卓app的時(shí)候可能出現(xiàn)報(bào)錯(cuò):安裝應(yīng)用出現(xiàn)重復(fù)的內(nèi)容提供者朴皆,這是因?yàn)槲覀兊膍anifest中的<provider/>
標(biāo)簽的android:authorities
相同帕识,改成當(dāng)前的包名就可以了。