You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AndroidPublisher为单个APK同时上传两个反混淆文件?ReTrace映射文件与Native调试符号能否同步上传?

同一编辑事务上传多个反混淆文件仅保留最后一个的问题解答

这个现象不是预期行为——Google Play Developer API完全支持为同一个APK版本同时关联Proguard mapping(mapping.txt)和Native debug symbols(native-debug-symbols.zip)两种文件,你遇到的覆盖问题大概率是调用实现中的细节疏漏导致的。

问题根源分析

你提到单独上传任意一种文件都能正常显示,但同一编辑事务中先后上传就会覆盖,核心问题可能出在两个地方:

  1. 未指定正确的文件MIME类型:你的代码中media.mimeType设为空字符串,这可能导致API无法正确识别文件类型,进而在处理时错误地覆盖已有文件。
  2. 缺少上传后的验证步骤:无法确认每一次上传请求是否都成功将文件关联到编辑事务中,可能存在隐性的上传失败但未被捕获的情况。

解决方案

针对你的代码和场景,我给出以下具体调整建议:

1. 修正文件MIME类型

为不同类型的反混淆文件指定正确的MIME类型,帮助API正确识别和存储文件:

  • 对于mapping.txt,使用text/plain
  • 对于native-debug-symbols.zip,使用application/zip

2. 优化上传函数(合并逻辑+增加验证)

可以将两个上传函数合并为一个通用函数,同时增加上传后的验证步骤,确保文件已被正确添加到编辑事务中:

import fs from 'fs';
import tl from '@actions/core'; // 假设你使用的是GitHub Actions的tl模块

/**
 * Uploads a deobfuscation file (Proguard mapping or Native symbols) for a given package
 * Assumes authorized and valid edit transaction exists
 * @param {any} edits Initialized Google Play Publisher edit instance
 * @param {string} filePath Path to the deobfuscation file
 * @param {string} packageName Android package name (e.g. com.android.etc)
 * @param {number} apkVersionCode Version code of the target APK
 * @param {'proguard' | 'nativeCode'} fileType Type of deobfuscation file
 * @returns {Promise<void>}
 */
export async function uploadDeobfuscation(
  edits: any,
  filePath: string,
  packageName: string,
  apkVersionCode: number,
  fileType: 'proguard' | 'nativeCode'
): Promise<void> {
  const mimeType = fileType === 'proguard' ? 'text/plain' : 'application/zip';
  const requestParameters = {
    deobfuscationFileType: fileType,
    packageName: packageName,
    apkVersionCode: apkVersionCode,
    media: {
      body: fs.createReadStream(filePath),
      mimeType: mimeType
    }
  };

  try {
    // 执行上传请求
    const uploadResult = (await edits.deobfuscationfiles.upload(requestParameters)).data;
    console.log(`Successfully uploaded ${fileType} file:`, uploadResult);

    // 验证文件是否已添加到当前编辑事务中
    const listResponse = (await edits.deobfuscationfiles.list({
      packageName: packageName,
      apkVersionCode: apkVersionCode,
      editId: edits.editId // 确保传递当前编辑事务的ID
    })).data;

    console.log('Current deobfuscation files in edit transaction:', listResponse.deobfuscationFiles);
  } catch (e) {
    throw new Error(tl.loc('CannotUploadDeobfuscationFile', filePath, e));
  }
}

3. 确保顺序上传并正确提交编辑事务

在同一个编辑事务中,必须等待第一个文件上传完成后再上传第二个,最后统一提交事务:

// 示例调用流程(假设已完成API初始化和编辑事务创建)
async function publishWithDeobfuscationFiles() {
  // 1. 初始化API和创建编辑事务(你的现有逻辑)
  const edits = await initializeAndroidPublisherEdit();

  // 2. 上传APK(你的现有逻辑)
  await uploadApk(edits, './app-release.apk', 'com.example.app', 123);

  // 3. 顺序上传两种反混淆文件
  await uploadDeobfuscation(edits, './mapping.txt', 'com.example.app', 123, 'proguard');
  await uploadDeobfuscation(edits, './native-debug-symbols.zip', 'com.example.app', 123, 'nativeCode');

  // 4. 提交编辑事务(你的现有逻辑)
  await edits.commit({ packageName: 'com.example.app' });
}

4. 控制台显示验证

提交编辑事务后,Google Play控制台可能存在短暂的缓存延迟。如果在「App bundle explorer → Downloads → Assets」中看不到两个文件,可以切换到「Release management → Artifact library」,找到对应的APK版本,查看其关联的反混淆文件,这里的显示通常更及时准确。

补充说明

你提到用.NET客户端库也复现了同样的问题,说明问题并非特定于Node.js的googleapis包,而是通用的调用细节问题。同样可以按照上述思路调整.NET代码:指定正确的MIME类型,确保顺序上传,上传后验证文件列表,最后提交事务。

内容的提问来源于stack exchange,提问作者max-zaytsev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:34:07