Android Gradle實現(xiàn)打包指定渠道后自動上傳到fir

之前寫過利用Jenkins實現(xiàn)在線的自動化打包并自動上傳至fir州藕,適用于非開發(fā)人員打出自己想要環(huán)境的包,但對于開發(fā)而言酝陈,在平時本地開發(fā)過程中床玻,有時改動個字體,改動點顏色需要重新打包沉帮,利用JenKins未免有點小題大做锈死。
打包不麻煩贫堰,主要是手動把它傳到fir這一步比較煩人,百度了一通fir自動上傳插件待牵,沒找到適合自己的其屏,看到官方有提供相關的api,所以自己用python簡單寫了個自動上傳腳本缨该,在gradle打包完成后執(zhí)行python腳本進行上傳偎行。

fir官方開發(fā)文檔地址:https://fir.im/docs/publish

fir分三個主要步驟

  • 1.獲取fir上傳憑證
  • 2.上傳APK+APP logo圖標
  • 3.獲取最新的下載地址供別人下載
  • 注:python使用的是requests網(wǎng)絡請求庫

1.獲取fir上傳憑證

image.png

代碼如下:

       # 第一步:獲取fir上傳憑證
        print("get fir upload certificate")
        icondict = {}  # 后面上傳圖標和apk需要使用的參數(shù),這里保存下來
        binarydict = {}
        try:
            req = requests.post("http://api.fir.im/apps",
                                {'type': 'android', 'bundle_id': apppackage, 'api_token': apitoken})
            resjson = req.json()
            icondict = (resjson["cert"]["icon"])
            binarydict = (resjson["cert"]["binary"])
            print("get fir upload certificate success")

        except Exception:
            print("get fir upload certificate error")
            traceback.print_exc()

2.上傳APK+logo圖標

image.png

代碼如下:

       # 第二步:上傳APK
        try:
            print("uploading apk......")
            apkfile = {'file': open(apkpath, 'rb')}
            param = {"key": binarydict["key"],
                     "token": binarydict["token"],
                     "x:name": appname,
                     "x:version": appversion,
                     "x:build": appbuild,
                     "x:changelog": apkchangelog}
            req = requests.post(url=binarydict["upload_url"], files=apkfile, data=param, verify=False)
        except Exception as e:
            print("upload apk error")
            traceback.print_exc()
        # 第三步:上傳APK logo
        try:
            apklogofile = {'file': open(apklogo, 'rb')}
            param = {"key": icondict["key"],
                     "token": icondict["token"]}
            req = requests.post(url=icondict["upload_url"], files=apklogofile, data=param, verify=False)
        except Exception:
            print("upload apk error")
            traceback.print_exc()

3.獲取最新的下載地址

image.png

代碼如下:

       # 第四步:獲取APK最新下載地址
        queryurl = 'http://api.fir.im/apps/latest/%s?api_token=%s&type=android' % (apppackage, apitoken)
        try:
            req = requests.get(queryurl)
            update_url = (req.json()["update_url"])
            print("upload apk success, update url is " + update_url)
        except Exception:
            print("upload apk error")
            traceback.print_exc()

代碼里面如下參數(shù)都是動態(tài)傳入的贰拿,配合AndroidStudio自帶的gradle使用
appname = sys.argv[1] # app名稱
apppackage = sys.argv[2] # 唯一包名蛤袒,也即是bundle_id
appversion = sys.argv[3] # app版本號
appbuild = sys.argv[4] # app build號
apitoken = sys.argv[5] # fir token
apklogo = sys.argv[6] # 等待上傳的APK logo路徑
apkpath = sys.argv[7] # 等待上傳的APK路徑
apkchangelog = sys.argv[8] # 等待上傳的APK更新日志(可能沒有填寫)

完整代碼

# encoding = utf-8
import sys
import traceback
import requests

requests.packages.urllib3.disable_warnings()


def uploadtofir():
    # 參數(shù)檢查
    paramnum = 8
    syslen = len(sys.argv)
    if syslen < paramnum:
        print("please input param")
        return
    else:
        # 基礎參數(shù)
        appname = sys.argv[1]  # app名稱
        apppackage = sys.argv[2]  # 唯一包名,也即是bundle_id
        appversion = sys.argv[3]  # app版本號
        appbuild = sys.argv[4]  # app build號
        apitoken = sys.argv[5]  # fir token
        apklogo = sys.argv[6]  # 等待上傳的APK logo路徑
        apkpath = sys.argv[7]  # 等待上傳的APK路徑
        apkchangelog = syslen == 9 and sys.argv[8] or ""  # 等待上傳的APK更新日志(可能沒有填寫)

        # 第一步:獲取fir上傳憑證
        print("get fir upload certificate")
        icondict = {}  # 后面上傳圖標和apk需要使用的參數(shù)膨更,這里保存下來
        binarydict = {}
        try:
            req = requests.post("http://api.fir.im/apps",
                                {'type': 'android', 'bundle_id': apppackage, 'api_token': apitoken})
            resjson = req.json()
            icondict = (resjson["cert"]["icon"])
            binarydict = (resjson["cert"]["binary"])
            print("get fir upload certificate success")

        except Exception:
            print("get fir upload certificate error")
            traceback.print_exc()

        # 第二步:上傳APK
        try:
            print("uploading apk......")
            apkfile = {'file': open(apkpath, 'rb')}
            param = {"key": binarydict["key"],
                     "token": binarydict["token"],
                     "x:name": appname,
                     "x:version": appversion,
                     "x:build": appbuild,
                     "x:changelog": apkchangelog}
            req = requests.post(url=binarydict["upload_url"], files=apkfile, data=param, verify=False)
        except Exception as e:
            print("upload apk error")
            traceback.print_exc()

        # 第三步:上傳APK logo
        try:
            apklogofile = {'file': open(apklogo, 'rb')}
            param = {"key": icondict["key"],
                     "token": icondict["token"]}
            req = requests.post(url=icondict["upload_url"], files=apklogofile, data=param, verify=False)
        except Exception:
            print("upload apk error")
            traceback.print_exc()

        # 第四步:獲取APK最新下載地址
        queryurl = 'http://api.fir.im/apps/latest/%s?api_token=%s&type=android' % (apppackage, apitoken)
        try:
            req = requests.get(queryurl)
            update_url = (req.json()["update_url"])
            print("upload apk success, update url is " + update_url)
        except Exception:
            print("upload apk error")
            traceback.print_exc()


if __name__ == '__main__':
    uploadtofir()

Android Gradle配置

將上面寫好的.py文件復制到項目的app目錄下(非project目錄)妙真,同時在app級別下的gradle文件中添加如下代碼(添加到android{}里面)

    //自定義一個任務,實現(xiàn)打包meisha渠道自動上傳到fir
    task assembleWithFir{
        dependsOn 'assembleXXXXRelease'//打包自己需要的渠道
        doLast{
            def appname="你的APP名稱"
            def apppackage=project.android.defaultConfig.applicationId
            def appversion=project.android.defaultConfig.versionName
            def appbuild=project.android.defaultConfig.versionCode
            def apitoken="你的fir ApiToken"
            def apklogo="你的APK LOGO"
            def apkpath="你的APK本地地址"
            def apkchangelog=""
            //調用python腳本  這個腳本需要放在app工程目錄下荚守,不要放在project目錄下
            def process="python UploadToFir.py ${appname} ${apppackage} ${appversion} ${appbuild} ${apitoken} ${apklogo} ${apkpath} ${apkchangelog}".execute()
            //打印Python腳本日志珍德,便于出錯調試
            ByteArrayOutputStream result = new ByteArrayOutputStream()
            def inputStream = process.getInputStream()
            byte[] buffer = new byte[1024]
            int length
            while ((length = inputStream.read(buffer)) != -1) {
                result.write(buffer, 0, length)
            }
            println(result.toString("utf-8"))
        }
    }

至此全部搞定,同步一下gradle后發(fā)現(xiàn)多了一個assembleWithFir命令


image.png

雙擊assembleWithFir開始打包剛才指定的渠道矗漾,之后自動上傳APK到fir菱阵,如下點擊該連接就能查看相關了


image.png

注意事項:

  • .py python文件要放在app級別的目錄下(非project)
  • 確保電腦已安裝python運行環(huán)境,requests網(wǎng)絡請求庫
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缩功,一起剝皮案震驚了整個濱河市晴及,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫡锌,老刑警劉巖虑稼,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势木,居然都是意外死亡蛛倦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門啦桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溯壶,“玉大人,你說我怎么就攤上這事甫男∏腋模” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵板驳,是天一觀的道長又跛。 經(jīng)常有香客問我,道長若治,這世上最難降的妖魔是什么慨蓝? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任感混,我火速辦了婚禮,結果婚禮上礼烈,老公的妹妹穿的比我還像新娘弧满。我一直安慰自己,他們只是感情好此熬,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布谱秽。 她就那樣靜靜地躺著,像睡著了一般摹迷。 火紅的嫁衣襯著肌膚如雪疟赊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天峡碉,我揣著相機與錄音近哟,去河邊找鬼。 笑死鲫寄,一個胖子當著我的面吹牛吉执,可吹牛的內容都是我干的。 我是一名探鬼主播地来,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戳玫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了未斑?” 一聲冷哼從身側響起咕宿,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜡秽,沒想到半個月后府阀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡芽突,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年试浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞蚌。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡田巴,死狀恐怖,靈堂內的尸體忽然破棺而出挟秤,到底是詐尸還是另有隱情壹哺,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布煞聪,位于F島的核電站斗躏,受9級特大地震影響逝慧,放射性物質發(fā)生泄漏昔脯。R本人自食惡果不足惜啄糙,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望云稚。 院中可真熱鬧隧饼,春花似錦、人聲如沸静陈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲸拥。三九已至拐格,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刑赶,已是汗流浹背捏浊。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撞叨,地道東北人金踪。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像牵敷,于是被迫代替她去往敵國和親胡岔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353