扯淡
已經有幾天沒更新公號,主要還是因為最近很忙。從這周開始就在閉關室做一些新的產品。不過,忙歸忙,每周還是得抽出點時間做一些有價值的輸出。
公號的大部分讀者應該都知道我是做 android 開發的,python 只是我的業余時間來學習的。因此,這次我將結合 Android 和 Python 做一些分享。
我們在平時 Android 開發中會遇到很多繁瑣的操作,需要重復無數次,例如打渠道包,這就是一個很繁瑣且花時間的事。雖然,我們可以在 Android Studio 中配置 productFlavors,來替換我們在 manifest 中配置的渠道值 :
然後打包的時候全選所有渠道。像這樣:
開始執行之後,我們的 AS 基本就可以單線程執行這麽一個任務了,然後我們端起茶杯喝了一杯又一杯,終於半個小時過去了所有渠道包才陸陸續續打完。然後一看時間,媽的,飯點到了,關電腦吃飯。
就這樣,我們一天的工作時間就浪費在了打渠道包上。
吃完飯之後又回到工位,我們是不是應該想想怎麽可以讓這些操作自動化,在打包的同時我們還可以愉快的寫 “Bug” 呢?
答案是肯定的。
用 Python 多渠道打包
Python 界有句話是這麽說的:
“當一件事情要做兩次以上,那麽你該為它寫個自動化腳本”
- 馬超
所以,針對 Android 的渠道包我們完全可以用 Python 來幫我們完成。每次需要打渠道包的時候,你就只需要 python xxxxx.py 一下,就愉快的開始幫你打包,解放了 Android Studio 讓我們可以有更多的時間來寫出更美好的代碼。
那麽這個腳本到底是什麽?
其實早在兩年前都有人做了這件事,而且很 open 的將代碼開源在了 Github 上。我們姑且就叫它 buildapks , 項目地址:
https://github.com/Bilibili/apk-channelization
但自從兩年前開源之後,就再沒發現他們更新過。其次,這個代碼兼容的Gradle 還是 1.3 的版本。因此,這次我把這個代碼拉出來分析、學習之後做了一些兼容性的改動。
先看下這個腳本的啟動配置:
可以很清晰的看到,需要有一個 channel 的文件、輸出 APK 的路徑、簽名的配置和一個已經存在的 apk 。
-
原理
這裏就有人問了,為什麽打渠道包還要一個存在的 apk 呢?那麽,這時候就來說說這個批量打渠道包的原理了:
預置一個包含所有渠道值的 channels 文件,並在 AndroidManifest 中將渠道值設置為 xxxxxxxxxxxxxx,然後 build 出一個渠道為 xxxxxxxxxxx 的 apk,再通過解壓遍歷修改 xxxxxxxxxx 為 channels 中所有的渠道值,最後將解壓文件壓縮為 zip ,再通過 sdk 中的 zipalign 將 apk 文件進行對齊操作,最後簽名,搞定。
代碼都很簡單,因此我這裏不做講解。主要講下這個腳本都用到了哪些 Python 組件。
-
應用到的 Python 組件
「getopt」
這是一個專門用來處理命令行參數的組件。
getopt(sys.argv[1:], shortopts, longopts=[])
其中,shortopts 是短格式 (-) , longopts 則是長格式(--)。
在 buildapks 中,有段代碼:
getopt 返回 opts 和 args 。當執行
python buildapks.py -c=aaaaa --keyalias=mark.key firstapk.apk
時,
opts 就是一個包含元組的列表,等於:
[('-c','aaaaa'),('--keyalias','mark.key')] ;
而 args 是一個列表,包含沒有 - 和 -- 的值, 就等於:
['firstapk.apk']
「zipfile」
這是一個針對文件做各種 zip 操作時,用到的一個組件。讀寫就不說了,更高級的操作如:列出 zip 中的文件列表、打印文件信息、還有 ZipInfo 類。
在 buildapks 中應用在了對 apk 解壓和壓縮的操作中。
「shutil」
這是一種高層次的文件操作工具,它支持對文件的各種操作。若你的項目中,有操作文件的需要,那麽使用 shutil 再好不過了。
「traceback」
這是一個獲取異常詳細信息的工具。
捕獲異常大家應該會這麽寫:
try: 1/0 except Exception,e: print e
輸出結果是integer division or modulo by zero,只知道是報了這個錯,但是卻不知道在哪個文件哪個函數哪一行報的錯。
那麽我們用 traceback 試試:
import traceback try: 1/0 except Exception,e: traceback.print_exc()
輸出結果是
Traceback (most recent call last): File "test_traceback.py", line 3, in1/0 ZeroDivisionError: integer division or modulo by zero
這樣非常直觀有利於調試。
「struct」
了解 C 語言的應該都知道 strcut 是結構體的意思。
在 Python 中 struct提供用format specifier方式對數據進行打包和解包(Packing and Unpacking), 在 buildapks 中,由於數據直接是 bytearray 的,因此使用 struct 之後,我們就可以直接修改 manifest 中的渠道值。
總結
buildapks 這個自動化打包腳本,實現原理已經在上面了。不過更重要的是你需要動手去操作,同時結合這個原理你會發現這個腳本並沒有想象中那麽難。
點擊 閱讀原文 是我重構之後的開源地址。
最後提件事,不知道讀者中對 小程序 感興趣的有多少。可以點贊 + 評論,最近由於 「Github開源社區」用戶劇增, 急需多名基友來維護。
長摁‘識別二維碼’,一起進步
生活不止眼前的茍且,還有手下的代碼、
和嘴上的扯淡
——
個人博客: http://xiyoumc.0x2048.com
Github:https://www.github.com/xiyouMc
Tags: 我們 Android 渠道 Python 時間 可以
文章來源: