欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android gradle打包并自動上傳的方法

 更新時(shí)間:2017年09月20日 10:06:35   作者:戰(zhàn)五渣_lei  
本篇文章主要介紹了Android gradle打包并自動上傳的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

簡介

這篇文章主要介紹Android用gradle打包,并且調(diào)用python腳本將打包好的apk上傳到fir.im供相關(guān)人員下載,對于學(xué)習(xí)gradle 打包和python 幾個(gè)常用網(wǎng)絡(luò)庫有一定幫助

關(guān)鍵字 :Android Gradle Python fir.im

1 開發(fā)前準(zhǔn)備

開發(fā)前需要下載 AndroidStudio ,gradle(3.3版本),python3.6,Curl,pycurl

準(zhǔn)備fir.im賬號一個(gè),有賬號對應(yīng)的apitoken,具體fir.im的細(xì)節(jié)可查看文檔fir.im

開發(fā)環(huán)境為macOS,windows推薦把pycurl部分全部替換為requests,即上傳apk部分代碼換為上傳圖標(biāo)的那種方式,詳細(xì)見代碼

2 Gradle 腳本編寫

我們腳本需要做的事情就是在APK打包完成以后,把a(bǔ)pk的路徑傳遞給python腳本即可,如何保證打包好了,就用gradle的dependsOn方法,例如打debug包,我們就可以寫一個(gè)task ,這個(gè)task dependsOn ‘a(chǎn)ssembleDebug',這樣這個(gè)task調(diào)用時(shí),會先執(zhí)行assembleDebug,然后在執(zhí)行里面的代碼,即符合我們的需要
具體代碼

//這個(gè)task 需要放在 app/build.gradle文件中的android 代碼塊里
task assemblewithlog {
 dependsOn 'assembleDebug'
 doLast {
  //這個(gè)需要配置一下,app的圖標(biāo)
  def appicon = "app/src/main/res/drawable/icon.png"
  //這個(gè)需要配置一下,app的輸出到fir.im的名稱
  def outId = "yitiji_Debug"
//取 apk的版本名和apk的輸出文件目錄
  def verName = project.android.defaultConfig.versionName;

  def apkpath = applicationVariants.first().outputs.first().outputFile
 //調(diào)用python腳本 這個(gè)腳本需要放在工程目錄下
 def process = "python3 uploadfirim.py ${outId} ${verName} ${appicon} ${apkpath}".execute()
  // Wait till the process completes before continuing
  println("上傳apk中")
//將python代碼里面打印的內(nèi)容在gradle窗口中打印出來
  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代碼直到python代碼執(zhí)行結(jié)束
  int exitValue = process.waitFor()
  println "上傳結(jié)束 with value $exitValue"
 }
 }

3 python腳本的編寫

這個(gè)python腳本有點(diǎn)學(xué)習(xí)的內(nèi)容,所以使用了 urllib ,requests,pycurl三個(gè)網(wǎng)絡(luò)請求庫,實(shí)際上只用一種就好了。這里關(guān)鍵是需要了解fir.im上傳的請求格式和響應(yīng),細(xì)節(jié)可以看文檔fir.im,主要是先將apk的標(biāo)識信息和用戶的apitoken傳給fir.im,它會響應(yīng)文件上傳的地址和圖標(biāo)上傳的地址,然后將對應(yīng)的文件和信息傳入返回的地址即可,最后在通過apk的標(biāo)識信息和用戶的apitoken可以查詢到此apk在fir.im對應(yīng)的下載頁面

那么就安裝這三步來講好了

3.1 查詢上傳地址

官方文檔 如下

調(diào)用示例

curl -X "POST" "http://api.fir.im/apps" \
 -H "Content-Type: application/json" \
 -d "{\"type\":\"android\", \"bundle_id\":\"xx.x\", \"api_token\":\"aa\"}"

響應(yīng)示例

# status: 201

{
 "id": "5592ceb6537069f2a8000000",
 "type": "ios",
 "short": "yk37",
 "cert": {
 "icon": {
  "key": "xxxxx",
  "token": "xxxxxx",
  "upload_url": "http://upload.qiniu.com"
 },
 "binary": {
  "key": "xxxxx",
  "token": "xxxxxx",
  "upload_url": "http://upload.qiniu.com"
 }
 }
}

所以按照文檔寫python3 代碼如下

#encoding = utf-8
import traceback
from urllib import request
from urllib import parse
import requests
import pycurl
import json
from io import BytesIO

import time

import sys


def uploadtofirim():
 minlen = 5
#檢查參數(shù)傳遞,定義好按照 name version 圖標(biāo)路徑 apk路徑 apitoken 的順序傳遞參數(shù)
 syslen = len(sys.argv)
 if syslen < minlen:
 print("傳遞參數(shù)有誤")
 return
 if syslen > 5:
 apitoken = sys.argv[5]
 else:
#這是一個(gè)無效的token,只是為了展示用,需要替換為你自己的fir.imtoken
 apitoken = "7a15a28c75005akkkklllle051c71"
 appname = sys.argv[1]
 appversion = sys.argv[2]
 iconpath = sys.argv[3]
 apkpath = sys.argv[4]
#利用urllib 請求并獲取響應(yīng),數(shù)據(jù)格式見fir.im文檔
 data = parse.urlencode({'type': 'android', 'bundle_id': appname, 'api_token': apitoken})
 datas = data.encode('utf-8')
 req = request.Request(url='http://api.fir.im/apps', data=datas, method='POST')
 icondict = {}
 binarydict = {}
 try:
 with request.urlopen(req) as f:
  strdec = f.read().decode('utf-8')
  resjson = json.loads(strdec)
#將請求的結(jié)果存起來后面用
  icondict = (resjson["cert"]["icon"])
  binarydict = (resjson["cert"]["binary"])
 except:
 print("讀取地址失敗")
 pass

3.2 上傳圖標(biāo)和apk

之前獲取了路徑,接下來將文件傳上去,注意 python3對于https的請求有坑,如果代碼報(bào)ssl錯(cuò)誤,執(zhí)行python3 按照目錄下的Install Certificates.command文件 ,路徑參考 /Applications/Python 3.6/Certificates.command官方文檔如下,細(xì)節(jié)查閱官網(wǎng)

調(diào)用示例

curl -F "key=xxxxxx"  \
 -F "token=xxxxx"  \
 -F "file=@aa.apk"  \
 -F "x:name=aaaa"  \
 -F "x:version=a.b.c"  \
 -F "x:build=1"  \
 -F "x:release_type=Adhoc" \ #type=ios 使用
 -F "x:changelog=first" \
 https://up.qbox.me

 
響應(yīng)示例

# status: 201

{ "is_completed": true }

所以對應(yīng)的py腳本如下

#接上面的py代碼,復(fù)制時(shí)注意下格式和縮進(jìn)
 try:
 local_filename = iconpath
 c = pycurl.Curl()
 print("上傳圖片")
 files = {'file': open(local_filename, 'rb')}
 paramdata = {'key': icondict["key"],"token":icondict["token"]}
#用 requests庫上傳圖標(biāo)文件并讀取響應(yīng),verify=False是因?yàn)樯蟼鞯刂肥莌ttps,不這樣寫會報(bào)錯(cuò)
 res = requests.post(icondict["upload_url"], files=files, data=paramdata,verify=False)
 print(res.text)
 local_apkfilename = apkpath
 timenow = str('time :' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
#用 pycurl庫上傳apk文件并讀取響應(yīng)
 c.setopt(c.URL, binarydict["upload_url"])
 c.setopt(c.HTTPPOST, [
  ("file", (c.FORM_FILE, local_apkfilename)),
  ("key", binarydict["key"]),
  ("token", binarydict["token"]),
  ("x:name", appname),
  ("x:version", appversion),
  ("x:build", '1'),
  ("x:changelog", timenow)
 ])
 print("上傳apk")
 c.perform()
 c.close()
 print("上傳成功")
 except Exception as e:
 print(e)
 print("上傳文件失敗,請檢查")
 return

3.3獲得apk文件的下載頁面

apk上傳好了以后會生成下載分享頁面,可以直接通過get請求拿到
官方文檔

請求示例

 curl http://api.fir.im/apps/latest/xxx?api_token=xxx #使用 `id` 請求
 curl http://api.fir.im/apps/latest/im.fir.xxx?api_token=xxx&type=android #根據(jù)`bundle_id` 獲取更新

響應(yīng)數(shù)據(jù)

# status: 200

{
 "name": "fir.im",
 "version": "1.0",
 "changelog": "更新日志",
 "versionShort": "1.0.5",
 "build": "6",
 "installUrl": "http://download.fir.im/v2/app/install/xxxxxxxxxxxxxxxxxxxx?download_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "install_url": "http://download.fir.im/v2/app/install/xxxxxxxxxxxxxxxx?download_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxx", # 新增字段
 "update_url": "http://fir.im/fir", # 新增字段
 "binary": {
 "fsize": 6446245
 }
}

我們用的就是bundle_id,這個(gè)bundleid就是我們gradle傳進(jìn)去的名字,返回的update_url 就是分享apk的頁面

所以py代碼如下

#接上面的py代碼,復(fù)制時(shí)注意下格式和縮進(jìn)
 queryurl='http://api.fir.im/apps/latest/%s?api_token=%s&type=android'%(appname,apitoken)
 print(queryurl)
 req = request.Request(url=queryurl,method="GET")
 try:
 with request.urlopen(req) as f:
  strdec = f.read().decode('utf-8')
  resjson = json.loads(strdec)
  print("apk下載地址 " + resjson["update_url"])
 except Exception as e:
 print(e)
 traceback.print_exc()
 print("讀取地址失敗")
 pass

完整的py代碼如下

#encoding = utf-8
import traceback
from urllib import request
from urllib import parse
import requests
import pycurl
import json
from io import BytesIO

import time

import sys


def uploadtofirim():
 minlen = 5
 syslen = len(sys.argv)
 if syslen < minlen:
 print("傳遞參數(shù)有誤")
 return
 if syslen > 5:
 apitoken = sys.argv[5]
 else:
 apitoken = "7akkkkkkkkkkkk1c71"
 appname = sys.argv[1]
 appversion = sys.argv[2]
 iconpath = sys.argv[3]
 apkpath = sys.argv[4]
 data = parse.urlencode({'type': 'android', 'bundle_id': appname, 'api_token': apitoken})
 datas = data.encode('utf-8')
 req = request.Request(url='http://api.fir.im/apps', data=datas, method='POST')
 icondict = {}
 binarydict = {}
 try:
 with request.urlopen(req) as f:
  strdec = f.read().decode('utf-8')
  resjson = json.loads(strdec)
  icondict = (resjson["cert"]["icon"])
  binarydict = (resjson["cert"]["binary"])
 except:
 print("讀取地址失敗")
 pass
 try:
 local_filename = iconpath
 c = pycurl.Curl()
 print("上傳圖片")
 files = {'file': open(local_filename, 'rb')}
 paramdata = {'key': icondict["key"],"token":icondict["token"]}
 res = requests.post(icondict["upload_url"], files=files, data=paramdata,verify=False)
 print(res.text)
 local_apkfilename = apkpath
 timenow = str('time :' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 c.setopt(c.URL, binarydict["upload_url"])
 c.setopt(c.HTTPPOST, [
  ("file", (c.FORM_FILE, local_apkfilename)),
  ("key", binarydict["key"]),
  ("token", binarydict["token"]),
  ("x:name", appname),
  ("x:version", appversion),
  ("x:build", '1'),
  ("x:changelog", timenow)
 ])
 print("上傳apk")
 c.perform()
 c.close()
 print("上傳成功")
 except Exception as e:
 print(e)
 print("上傳文件失敗,請檢查")
 return
 queryurl='http://api.fir.im/apps/latest/%s?api_token=%s&type=android'%(appname,apitoken)
 print(queryurl)
 req = request.Request(url=queryurl,method="GET")
 try:
 with request.urlopen(req) as f:
  strdec = f.read().decode('utf-8')
  resjson = json.loads(strdec)
  print("apk下載地址 " + resjson["update_url"])
 except Exception as e:
 print(e)
 traceback.print_exc()
 print("讀取地址失敗")
 pass

# appid vesion icon apk apitoken
if __name__ == '__main__':
 uploadtofirim()

這樣就好了

在Android studio對應(yīng)的工程里面執(zhí)行代碼 gradle assemblewithlog

就開始打包debug并上傳到fir.im了

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Flutter控制組件顯示和隱藏三種方式詳解

    Flutter控制組件顯示和隱藏三種方式詳解

    這篇文章主要為大家介紹了Flutter控制組件顯示和隱藏三種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android利用DownloadManager實(shí)現(xiàn)文件下載

    Android利用DownloadManager實(shí)現(xiàn)文件下載

    這篇文章主要為大家詳細(xì)介紹了Android利用DownloadManager實(shí)現(xiàn)文件下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android學(xué)習(xí)教程之2D繪圖基礎(chǔ)及繪制太極圖

    Android學(xué)習(xí)教程之2D繪圖基礎(chǔ)及繪制太極圖

    這篇文章主要給大家介紹了Android中2D繪圖基礎(chǔ)的相關(guān)資料,文中介紹了繪圖的基礎(chǔ)內(nèi)容,以及通過Canvas和Paint實(shí)現(xiàn)繪制太極圖的詳細(xì)過程,對各位Android新手開發(fā)者們具有一定的參考價(jià)值,需要的朋友下面來一起看看吧。
    2017-04-04
  • Android MVP模式ListView中嵌入checkBox的使用方法

    Android MVP模式ListView中嵌入checkBox的使用方法

    這篇文章主要介紹了Android MVP模式ListView中嵌入checkBox的使用方法,如何在ListView中嵌入checkBox配合使用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android Drawable必備知識小結(jié)

    Android Drawable必備知識小結(jié)

    這篇文章主要為大家詳細(xì)了Android Drawable必備基礎(chǔ)知識 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • android 實(shí)現(xiàn)按鈕浮動在鍵盤上方的實(shí)例代碼

    android 實(shí)現(xiàn)按鈕浮動在鍵盤上方的實(shí)例代碼

    這篇文章主要介紹了android 實(shí)現(xiàn)按鈕浮動在鍵盤上方,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Android studio案例之實(shí)現(xiàn)電話撥號

    Android studio案例之實(shí)現(xiàn)電話撥號

    這篇文章主要介紹了Android studio案例之實(shí)現(xiàn)電話撥號,并有詳細(xì)的步驟和實(shí)現(xiàn)代碼,對此感興趣的同學(xué),可以參考下
    2021-04-04
  • Android設(shè)計(jì)模式之單例模式實(shí)例

    Android設(shè)計(jì)模式之單例模式實(shí)例

    這篇文章主要介紹了Android設(shè)計(jì)模式之單例模式實(shí)例,單例模式是運(yùn)用最廣泛的設(shè)計(jì)模式之一,在應(yīng)用這個(gè)模式時(shí),單例模式的類必須保證只有一個(gè)實(shí)例存在
    2023-04-04
  • android實(shí)現(xiàn)微信聯(lián)合登錄開發(fā)示例

    android實(shí)現(xiàn)微信聯(lián)合登錄開發(fā)示例

    本篇文章主要介紹了android實(shí)現(xiàn)微信聯(lián)合登錄開發(fā)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android自定義廣播接收

    Android自定義廣播接收

    這篇文章主要為大家詳細(xì)介紹了Android自定義廣播接收,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論