Python 完美打出 Android 多渠道包">Python 完美打出 Android 多渠道包

分類:IT技術 時間:2017-10-01

扯淡

已經有幾天沒更新公號,主要還是因為最近很忙。從這周開始就在閉關室做一些新的產品。不過,忙歸忙,每周還是得抽出點時間做一些有價值的輸出。

公號的大部分讀者應該都知道我是做 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, in 
  
   
1/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 時間 可以

文章來源:


ads
ads

相關文章
ads

相關文章

ad