一、背景
当符号表过多时,友盟只能一个一个上传,很费时费力。找到了命令行批量上传符号表的方式。第一次使用,安装环境会比较麻烦,但也属于一劳永逸类的工作。本方法也可稍作修改后,用于Jenkins,打包上传后,自动上传符号表。
二、使用命令行上传dSYM操作步骤
注:安装以下环境和插件无需科学上网,网速快点就行。
1. 安装Python环境 (上传dSYM需要Python环境)
- 如何确定是否安装过python环境?
# 命令行输入python或python3 (任选其一)
$ python
$ python3
如果显示zsh: command not found: python
表示没有安装
- 安装Python(已安装可跳过)
- 去python官网下载 https://www.python.org/downloads/
- 双击安装
- 控制台输入python3,如显示上图表示安装成功
2. 安装pip命令 (安装Python插件需要pip)
2.1 去官网下载 https://pypi.org/project/pip/
下载
2.2 下载完成后解压,命令行cd进入解压的文件夹内
# 进入文件夹
$ cd /Users/march/Downloads/pip-22.3.1
# 用python命令安装 pip
$ python3 setup.py install
3. 安装requests插件
# 控制台输入
$ pip install requests
4. 安装alibabacloud_umeng_apm20220214插件
# 控制台输入
$ pip install alibabacloud_umeng_apm20220214
# 如果显示 *** Read timed out. 就是网不好,多执行几次这个命令就好了
如果前面alibabacloud-xxx都拉下来了,但是有进度条的这个一直停在0.0,看看是不是连了VPN,请断开(如果可以再切换个网络)后再次尝试。
下载异常示例
5. 找到APP对应的access_key_id
、access_key_secret
、data_source_id
-
data_source_id查找路径data_source_id
查找路径:友盟 -> 选对应的项目 -> 设置 -> 应用信息 -> APPKEY
-
access_key_id和access_key_secret查找路径图1access_key_id
和access_key_secret
查找路径:友盟 -> 选对应的项目 -> 设置 -> 符号表管理 -> API上传说明 按钮 -> 查看OpenApi的使用方法 按钮 -> 获取身份认证信息 按钮 ->apiKey
即access_key_id
,apiSecurity
即access_key_secret
↓
access_key_id和access_key_secret查找路径图2 ↓
access_key_id和access_key_secret在红框处
图中红框处apiKey
即access_key_id
,apiSecurity
即access_key_secret
。
6. 准备好上传符号表所需文件
6.1 准备好要上传的符号表 待上传的符号表示例6.2 准备上传符号表所需命令文件 (共 3 个)
-
第一个:创建.sh文件,命名为
self_upload_dsyms.sh
,代码如下,⚠️处的函数内需要根据实际情况修改。
# 版本号
VERSION=$1
# Build号
BUILD_VERSION=$2
#上传友盟的版本号 版本号-Build号
UM_VERSION="'${VERSION}'-'${BUILD_VERSION}'"
# 上传DSYMS文件到友盟(⚠️这里根据实际dSYM个数进行增删)
upload_dsyms_to_um() {
# 第一个是工程主Target的符号表,以app.dSYM结尾
python3 um_upload_dsym_info.py ${UM_VERSION} "Demo.app.dSYM.zip"
#其余为导出的其他符号表,以.dSYM结尾
python3 um_upload_dsym_info.py ${UM_VERSION} "Masonry.framework.dSYM.zip"
python3 um_upload_dsym_info.py ${UM_VERSION} "AFNetworking.framework.dSYM.zip"
}
# 压缩dSYM文件(⚠️这里根据实际dSYM个数进行增删)
zip_dsyms() {
# 第一个是工程主Target的符号表,以app.dSYM结尾,注意区分
zip -r Demo.app.dSYM.zip Demo.app.dSYM
#其余为导出的其他符号表,以.dSYM结尾
zip -r Masonry.framework.dSYM.zip Masonry.framework.dSYM
zip -r AFNetworking.framework.dSYM.zip AFNetworking.framework.dSYM
}
# 压缩dsym
zip_dsyms
# 上传DSYMS文件
upload_dsyms_to_um
-
第二个:创建.sh文件,命名为
um_upload_dsym_tool.sh
,此文件无需修改
uploadAddress=$1
OSSAccessKeyId=$2
key=$3
policy=$4
signature=$5
callback=$6
fileName=$7
curl --location --request POST ${uploadAddress} \
--form signature=${signature} \
--form OSSAccessKeyId=${OSSAccessKeyId} \
--form policy=${policy} \
--form key=${key} \
--form callback=${callback} \
--form file=@"${fileName}"
-
第三个:创建.py文件,命名为
um_upload_dsym_info.py
,修改 步骤5 中找到的access_key_id
、access_key_secret
和data_source_id
(在⚠️处)
# -*- coding: utf-8 -*-
import sys
import asyncio
import json
import os
import requests
from typing import List
from alibabacloud_umeng_apm20220214.client import Client as umeng_apm20220214Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_umeng_apm20220214 import models as umeng_apm_20220214_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> umeng_apm20220214Client:
"""
使用AK&SK初始化账号Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
# ⚠️您的 AccessKey ID,
access_key_id='',
# ⚠️您的 AccessKey Secret,
access_key_secret=''
)
# 访问的域名
config.endpoint = f'apm.openapi.umeng.com'
return umeng_apm20220214Client(config)
@staticmethod
async def main_async(
args: List[str],
) -> None:
app_version = args[0]
file_name = args[1]
client = Sample.create_client('accessKeyId', 'accessKeySecret')
get_sym_upload_param_request = umeng_apm_20220214_models.GetSymUploadParamRequest(
app_version=app_version,
data_source_id='⚠️data_source_id在这里',
file_name=file_name,
file_type=3
)
headers = {}
try:
response = await client.get_sym_upload_param_with_options_async(get_sym_upload_param_request, headers, util_models.RuntimeOptions())
response_body = response.body.data
upload_address = response_body.upload_address
access_key_id = response_body.access_key_id
key = response_body.key
policy = response_body.policy
signature = response_body.signature
callback = response_body.callback
os.system('./um_upload_dsym_tool.sh '+upload_address+' '+access_key_id+' '+key+' '+policy+' '+signature+' '+callback+' '+file_name)
except Exception as error:
# 如有需要,请打印 error
UtilClient.assert_as_string(error.message)
print(error)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
result = loop.run_until_complete(Sample.main_async(sys.argv[1:]))
loop.close()
6.3 把上述三个文件放在和dSYM 同一个文件夹内
把三个文件和dSYM放在同一个目录下
7. 执行命令 上传符号表
打开控制台,执行命令
# 进入dSYMs目录下
$ cd /Users/march/Desktop/dSYMs
# 执行上传命令 传入 版本号 (例如1.0.0) 和 build号(例如1)
$ sh self_upload_dsyms.sh "1.0.0" "1"
上传成功示例
控制台输出code为200表示上传成功。可在友盟符号表列表查看。
API上传即为命令行上传的符号表
网友评论