OpenAPI 上传及查询符号表

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文演示了如何使用阿里云 OpenAPI 上传及其查询符号表,提供了接口字段的解释说明、流程示例代码

准备阶段

SDK 接入

SDK 接入请参考 阿里云 OpenAPI 门户

创建 Client

   public static Client createClient() throws Exception {
       // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
       // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
       com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
               // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
               .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
               // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
               .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
       // Endpoint 请参考 https://api.aliyun.com/product/emas-appmonitor
       config.endpoint = "emas-appmonitor.cn-shanghai.aliyuncs.com";
       return new Client(config);
   }

整体流程

流程图

image.svg

完整示例代码

警告

切勿直接在生产环境中使用,请自行增加判空、数组越界及异常处理等逻辑。

重要

上传的符号表文件需要为 zip 格式,大小需限制在 1G 以内

说明

关于使用临时凭证上传OSS信息请参考:使用临时访问凭证上传文件到OSS

import com.aliyun.emas_appmonitor20190611.Client;
import com.aliyun.emas_appmonitor20190611.models.RequestUploadTokenRequest;
import com.aliyun.emas_appmonitor20190611.models.RequestUploadTokenResponseBody;
import com.aliyun.emas_appmonitor20190611.models.SubmitSymbolicRequest;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.File;

public class SymbolicUploadDemo {

    public static void main(String[] args) throws Exception {
        Long appKey = 1234L;    // 替换为对应应用的 AppKey
        String os = "iphoneos"; // 改为对应的 OS
        String appVersion = "1.0.0";  // 非必选,根据符号化类型确认是否需要填写appVersion

        // 0. 初始化 Client,参考 OpenAPI 门户: https://api.aliyun.com/api/emas-appmonitor/2019-06-11/RequestUploadToken?RegionId=cn-shanghai&tab=DEMO&lang=JAVA
        Client client = createClient();

        // 1. 获取上传凭证
        RequestUploadTokenRequest requestUploadTokenRequest = new RequestUploadTokenRequest();
        requestUploadTokenRequest.setAppKey(appKey);
        requestUploadTokenRequest.setOs(os);

        RequestUploadTokenResponseBody.RequestUploadTokenResponseBodyModel tokenInfo = client.requestUploadToken(requestUploadTokenRequest).getBody().getModel();

        // 2. 准备上传
        String fileName = "symbolic_files.zip"; // 待上传文件名称,这里以直接读取文件为例,如果需要使用其他数据流,请修改关联的OSS上传代码
        String filePath = tokenInfo.uploadDir.replaceFirst("/", "") + System.currentTimeMillis() + "-" + "symbolic_files.zip"; // 随机文件名称,可以修改为自定义随机算法,前缀必须使用  tokenInfo.uploadDir
        String fileType = "APP_DSYM"; // 符号化类型,请参考文档 https://api.aliyun.com/api/emas-appmonitor/2019-06-11/SubmitSymbolic 中的 FileType 字段解释

        // 3. 上传符号文件到 OSS
        uploadFile(tokenInfo, filePath, "/tmp/" + fileName); // localFilePath 替换为本地文件路径

        // 4. 提交上传文件到符号化解析
        SubmitSymbolicRequest submitSymbolicRequest = new SubmitSymbolicRequest();
        submitSymbolicRequest.setAppKey(appKey);
        submitSymbolicRequest.setOs(os);
        submitSymbolicRequest.setFilePath(filePath);
        submitSymbolicRequest.setFileName(fileName);
        submitSymbolicRequest.setFileType(fileType);
        submitSymbolicRequest.setAppVersion(appVersion); // 非必选,根据符号化类型确认是否需要填写appVersion

        client.submitSymbolic(submitSymbolicRequest);
    }

    /**
     * OSS 文件上传 示例代码
     * <p>
     * 使用 RequestUploadToken 的返回值,利用 STS Token上传文件到 OSS
     * 该示例使用同步调用,如果需要异步调用,请保证上传成功后再调用 SubmitSymbolic
     **/
    public static void uploadFile(RequestUploadTokenResponseBody.RequestUploadTokenResponseBodyModel tokenInfo, String filePath, String localFilePath) {
        // 创建OSS client
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(tokenInfo.accessKeyId, tokenInfo.accessKeySecret, tokenInfo.securityToken);
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create().
                endpoint(tokenInfo.endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("cn-shanghai")
                .build();
        try {
            // 上传文件到OSS
            File localFile = new File(localFilePath);
            PutObjectRequest putObjectRequest = new PutObjectRequest(tokenInfo.uploadBucket, filePath, localFile);
            ossClient.putObject(putObjectRequest);
        } finally {
            ossClient.shutdown();
        }
    }

    public static Client createClient() throws Exception {
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Endpoint 请参考 https://api.aliyun.com/product/emas-appmonitor
        config.endpoint = "emas-appmonitor.cn-shanghai.aliyuncs.com";
        return new Client(config);
    }
}