如何避免Android Studio开发测试的ANR/崩溃报告上报至Google Play后台?
哈哈,这个坑我以前踩过!自己测试的崩溃/ANR记录混进Google Play正式报告里,看着特别闹心,给你分享几个亲测有效的解决办法和Android Studio设置调整:
一、先搞懂为什么会出现这个问题
核心原因是:你的测试设备登录了和Google Play开发者账号关联的Google账号,而且你在Android Studio里直接运行/调试的版本,包名和正式版完全一致。Google Play服务会把这个测试版本的异常,当成正式应用的问题上报到你的开发者控制台——毕竟包名是应用的唯一标识嘛。再加上你测试的代码是新版本的,自然会出现“上一正式版本不存在的代码行”这种情况。
二、避免测试记录混入正式报告的实用方法
1. 给测试版设置独立包名(最推荐)
这是一劳永逸的办法,直接在Module级别的build.gradle里,给debug构建类型添加包名后缀:
android { buildTypes { debug { // 给测试版包名加个.debug后缀,比如正式版是com.yourapp,测试版就是com.yourapp.debug applicationIdSuffix ".debug" // 其他debug配置,比如开启调试信息等 } release { // 正式版的打包配置 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
这样Google Play会把测试版和正式版当成两个完全独立的应用,测试时的异常绝对不会跑到正式报告里。
2. 禁用测试版的异常上报
如果不想改包名,可以在测试模式下直接关掉崩溃/ANR上报功能。
- 代码层面判断debug状态:
利用BuildConfig.DEBUG(AS自动生成的字段,debug模式下为true),在初始化上报工具的地方加判断:// 比如用Google Play默认的上报,或者Firebase Crashlytics这类第三方工具 if (!BuildConfig.DEBUG) { // 只在正式版初始化上报 // FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true); } else { // 测试版直接禁用 // FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false); } - 也可以在
build.gradle里自定义字段控制:
然后在代码里用debug { buildConfigField "boolean", "ENABLE_CRASH_REPORTING", "false" } release { buildConfigField "boolean", "ENABLE_CRASH_REPORTING", "true" }BuildConfig.ENABLE_CRASH_REPORTING来开关上报。
3. 调整Android Studio的运行设置
- 关闭即时运行(Instant Run):有时候即时运行会导致打包不完整,测试版本的代码状态异常。路径:
Settings -> Build, Execution, Deployment -> Instant Run,取消勾选Enable Instant Run to hot swap code/resource changes on deploy。 - 用Profile模式运行测试:这个模式的打包逻辑更接近正式版,同时能收集性能数据,而且不会把测试异常上报到Google Play的正式报告里。在AS的运行按钮下拉菜单里就能选Profile模式。
4. 用独立的测试设备/模拟器
如果你的测试手机登录了和开发者账号绑定的Google账号,很容易触发自动上报。可以换一个没登录该账号的设备,或者用Android Studio自带的模拟器测试,这样测试时的异常就不会被同步到你的Google Play控制台了。
三、清理已经混入的测试记录
如果已经有测试记录出现在报告里,也不用慌:打开Google Play Console的「ANRs & crashes」页面,用筛选器(比如按设备型号筛选你的手机)找到对应的记录,点击每条记录右上角的...,选择「Delete」就能删掉单条;也可以批量选中后删除。
内容的提问来源于stack exchange,提问作者OlivierGrenoble

