Android 13应用自更新崩溃:PackageInfo.packageName空指针异常
Android 13 应用自更新崩溃修复方案
问题场景
应用自更新功能在Android 13以下系统正常运行,但在Android 13中触发安装时崩溃,LogCat显示Google Play验证服务(Finsky)抛出NullPointerException,手动侧载安装APK无异常。
原崩溃代码
Intent install = new Intent(Intent.ACTION_VIEW); install.setAction(android.content.Intent.ACTION_VIEW); String sFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myapp.apk"; Uri uri; File file = new File(sFile); //For older android versions we must use older API's. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { uri = Uri.fromFile(file); } else { uri = FileProvider.getUriForFile(ctxt, "com.domain.myapp.provider", file); } install.setDataAndType(uri,"application/vnd.android.package-archive"); install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); install.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); install.putExtra(Intent.ACTION_PACKAGE_REPLACED, "com.domain.myapp"); install.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, ctxt.getApplicationInfo().packageName); ctxt.startActivity(install);
崩溃日志
10-06 19:42:20.022 19188-28017/? E/Finsky: [966] VerifyApps: Unexpected exception on background thread java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.PackageInfo.packageName' on a null object reference in method 'awpj axar.i(android.content.pm.PackageInfo)' at axar.i(PG:97) at com.google.android.finsky.verifier.impl.installtime.VerifyAppsInstallTask.ml(PG:289) at com.google.android.finsky.verifier.impl.installtime.VerifyInstallTask.ml(PG:1574) at awmz.run(PG:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at bhsr.run(PG:59) at java.lang.Thread.run(Thread.java:1012)
修复方案
崩溃根源是Google Play验证服务在处理无效Intent参数时触发空指针,需移除过时/错误参数并调整Intent配置:
- 移除无效参数
Intent.EXTRA_NOT_UNKNOWN_SOURCE:Android 8.0后已废弃,Android 13下会干扰验证逻辑Intent.ACTION_PACKAGE_REPLACED:这是广播Action,不属于启动安装Intent的合法参数
- 调整Intent Flags
- 移除
FLAG_ACTIVITY_CLEAR_TASK:该Flag用于清空任务栈,不适合启动系统安装界面,可能导致流程异常
- 移除
修改后代码
Intent install = new Intent(Intent.ACTION_VIEW); String sFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myapp.apk"; File file = new File(sFile); Uri uri; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { uri = Uri.fromFile(file); } else { uri = FileProvider.getUriForFile(ctxt, "com.domain.myapp.provider", file); } install.setDataAndType(uri, "application/vnd.android.package-archive"); // 仅保留启动新任务的必要Flag install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 保留安装来源标识,帮助系统识别合法安装 install.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, ctxt.getApplicationInfo().packageName); ctxt.startActivity(install);
额外注意事项
- Android 13需确保已申请
POST_NOTIFICATIONS权限(若下载流程有通知提示) - 确认FileProvider的
paths.xml配置正确,确保APK文件的URI可被系统安装程序访问 - 测试时需覆盖Android 13及旧版本,确保兼容逻辑正常
内容的提问来源于stack exchange,提问作者Mike Moening
相关产品推荐
相关产品推荐

