App Center分发构建到Google Play 如何获取调试符号与mapping.txt
Xamarin.Forms App Center构建缺失mapping.txt与原生调试符号解决方案
核心问题原因
App Center构建Xamarin.Android项目时,默认仅收集APK/AAB安装包作为构建产物,代码收缩器生成的ReTrace映射文件、原生调试符号不会被自动纳入输出目录,因此既无法在构建结果页下载,自动分发到Google Play时也会漏传这两类文件,触发控制台警告。网上流传的旧方案大多基于早期版本的Xamarin.Android和App Center构建镜像,配置项、路径规则已经变更,无法生效。
分步配置方案
1. 项目端配置:确保Release构建正常生成两类符号文件
修改Xamarin.Android项目的csproj文件,在Release|AnyCPU对应的PropertyGroup节点下添加/校验以下配置项,确保构建时正常生成所需文件:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <!-- 开启R8代码收缩,生成混淆映射文件 --> <AndroidLinkMode>Full</AndroidLinkMode> <AndroidEnableProguard>True</AndroidEnableProguard> <AndroidR8Enabled>True</AndroidR8Enabled> <!-- 统一mapping文件输出路径,避免不同构建环境路径差异导致找不到文件 --> <ProguardOutputFolder>$(OutputPath)mapping</ProguardOutputFolder> <!-- 开启原生调试符号生成,不要直接打包进AAB避免包体积超限 --> <AndroidCreateNativeDebugSymbols>True</AndroidCreateNativeDebugSymbols> <AndroidIncludeDebugSymbolsInAppBundle>False</AndroidIncludeDebugSymbolsInAppBundle> <!-- 若开启AOT编译,追加配置生成AOT原生代码符号 --> <AndroidAotAdditionalArguments Condition=" '$(RunAotCompilation)' == 'True' ">--debug-symbols</AndroidAotAdditionalArguments> </PropertyGroup>
2. App Center构建配置:通过后置脚本收集符号到产物目录
不要硬编码构建机的绝对路径(比如日志里的/Users/runner/work/1/a/是临时路径,不同构建任务会变),直接用App Center内置的环境变量定位路径,通过post-build自动脚本把符号文件拷贝到统一收集目录:
- 在Android解决方案的根目录新建名为
appcenter-post-build.sh的脚本,写入以下内容:
#!/usr/bin/env bash set -e # 创建mapping文件存放目录 mkdir -p "$APPCENTER_OUTPUT_DIRECTORY/mapping" # 查找构建生成的mapping.txt并拷贝到输出目录 find "$APPCENTER_SOURCE_DIRECTORY" -name "mapping.txt" -path "*/Release/*" -exec cp -f {} "$APPCENTER_OUTPUT_DIRECTORY/mapping/" \; # 创建原生调试符号存放目录 mkdir -p "$APPCENTER_OUTPUT_DIRECTORY/native-symbols" # 查找所有原生调试符号文件(.so.dbg后缀)并拷贝 find "$APPCENTER_SOURCE_DIRECTORY" -path "*/Release/*/symbols/*" -name "*.so.dbg" -exec cp -f {} "$APPCENTER_OUTPUT_DIRECTORY/native-symbols/" \; # 打印输出目录结构,方便构建日志排查 echo "构建产物收集完成,输出目录内容:" ls -R "$APPCENTER_OUTPUT_DIRECTORY"
- 给脚本添加可执行权限(本地执行
chmod +x appcenter-post-build.sh)后提交到代码仓库,App Center构建时会自动识别并执行该后置脚本。
3. 验证构建结果
配置提交后触发新的App Center构建:
- 构建日志里不会再出现
Cannot find any file based on **/mapping.txt的警告 - 构建完成后进入详情页,在下载区域可以看到包含mapping和原生符号的附加压缩包,解压即可拿到需要上传到Google Play的两类文件
- 如果开启了App Center自动分发到Google Play,任务会自动识别输出目录下的mapping文件随安装包一起上传,不需要手动操作。
4. 全流程自动化配置(可选)
如果需要实现原生符号也自动上传、完全不需要手动操作,可以在post-build脚本末尾追加Google Play API上传逻辑:
- 提前在Google Play管理后台创建服务账号,开通API上传权限,把服务账号密钥配置为App Center的加密环境变量,不要硬编码在脚本里
- 调用Play Developer API将native-symbols目录下的符号文件关联到当前构建的version code上传即可,不需要再登录Google Play Console手动操作。
常见坑点说明
- 不要把调试符号直接打包进AAB文件,会导致安装包体积大幅上涨,超过Google Play的体积限制
- 不要在脚本里写死构建机的绝对路径,App Center的托管构建机路径会随镜像版本、任务ID变化,必须使用内置的
APPCENTER_SOURCE_DIRECTORY、APPCENTER_OUTPUT_DIRECTORY环境变量 - 如果使用D8/R8作为dex编译器,旧版ProGuard的路径配置项不生效,必须用上面提到的R8对应配置
内容的提问来源于stack exchange,提问作者maf-soft
相关产品推荐
相关产品推荐

