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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:13:13