升级Android SDK/AGP后无法从设备复制基线配置文件输出
问题背景
升级以下配置后,基线配置文件生成流程出现异常:
config.target_sdk_version = 34 // 原31 config.compile_sdk_version = 34 // 原33 versions.android_gradle_plugin = '8.1.1' // 原7.3.1 versions.kotlin = '1.9.0' // 原1.8.10
执行:benchmark:connectedReleaseAndroidTest时触发两类错误:
- Netty原生库缺失:
java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_osx_aarch_64.jnilib java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_aarch_64.jnilib java.io.FileNotFoundException: META-INF/native/libnetty_tcnative.jnilib
- 权限设置失败:
Shell command failed (255): appops set androidx.test.services MANAGE_EXTERNAL_STORAGE allow No UID for androidx.test.services in user 0
基线测试能在设备上运行,但无法成功复制输出文件,日志显示尝试移动文件到外部存储的additional_test_output目录,但最终无法拉取到本地。
解决方案
1. 修复Netty原生库缺失问题
Android测试环境不需要OSX架构的Netty库,问题出在依赖引入了多余的平台库。在模块的build.gradle中调整Netty相关依赖,排除OSX架构的模块:
androidTestImplementation("io.netty:netty-tcnative-boringssl-static:2.0.61.Final") { exclude group: 'io.netty', module: 'netty-tcnative-boringssl-static-osx-x86_64' exclude group: 'io.netty', module: 'netty-tcnative-boringssl-static-osx-aarch_64' }
或者直接指定Android适配的分类器:
androidTestImplementation("io.netty:netty-tcnative-boringssl-static:2.0.61.Final:android-arm64") androidTestImplementation("io.netty:netty-tcnative-boringssl-static:2.0.61.Final:android-x86_64")
2. 解决MANAGE_EXTERNAL_STORAGE权限错误
SDK34对外部存储权限管控更严格,且androidx.test.services并非独立应用,不存在对应的UID。无需给测试服务设置该权限,改为调整基线配置文件的输出路径到应用私有目录:
- 修改
BaselineProfileGenerator中的输出路径,使用应用私有外部目录:
val outputDir = context.getExternalFilesDir(null) ?: context.filesDir val profileFile = File(outputDir, "BaselineProfileGenerator_startup-baseline-prof.txt")
- 或者在AGP的基线配置中指定私有路径,避免访问公共外部存储:
baselineProfile { outputDir = layout.buildDirectory.dir("baselineProfiles") useConnectedDevices = true }
3. 修复文件复制/拉取失败问题
使用应用私有目录后,adb拉取命令需要调整为对应路径,例如:
adb pull "/sdcard/Android/data/com.doximity.benchmark/files/BaselineProfileGenerator_startup-baseline-prof-2023-08-22-18-48-56.txt" .
同时升级androidx.benchmark依赖到适配AGP8.1和SDK34的版本(比如1.2.0及以上),确保插件能自动处理文件复制逻辑,无需手动移动文件。
内容的提问来源于stack exchange,提问作者jpetitto
相关产品推荐
相关产品推荐

