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

Android低API设备调用getInstallSourceInfo崩溃及兼容方案咨询

Android 安装源获取适配方案

问题背景

你的应用中使用以下代码获取安装源:

String market_name = context.getPackageManager().getInstallSourceInfo(context.getPackageName()).getInstallingPackageName();

这段代码在 API 级别低于30的设备上会崩溃,抛出错误:

java.lang.NoSuchMethodError: No virtual method getInstallSourceInfo

应用适配 API 23+,需要解决低版本兼容以及 Android 15 移除getInstallerPackageName()的问题。

适配方案

1. 低版本兼容:用getInstallerPackageName()替代

是的,在 API 30 以下的设备上,必须使用getInstallerPackageName()替代getInstallSourceInfo()。该方法从 API 3 就已存在,完全覆盖你的适配范围(API23+)。

你可以通过 API 版本判断实现兼容:

String marketName;
PackageManager pm = context.getPackageManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // API30+ 使用新方法
    try {
        InstallSourceInfo sourceInfo = pm.getInstallSourceInfo(context.getPackageName());
        marketName = sourceInfo.getInstallingPackageName();
    } catch (PackageManager.NameNotFoundException e) {
        // 处理包未找到的异常
        marketName = null;
    }
} else {
    // API30以下 使用旧方法
    marketName = pm.getInstallerPackageName(context.getPackageName());
}

2. Android 15 移除getInstallerPackageName()的应对

根据官方规划,getInstallerPackageName()会在 Android 15 被移除,此时需注意:

  • 当应用编译目标(targetSdkVersion)升级到 Android 15 及以上时,彻底移除对getInstallerPackageName()的调用。
  • Android 15 及以上设备统一使用getInstallSourceInfo(),同时处理可能的异常(比如应用通过ADB安装、系统应用等场景,可能无法获取到安装源)。
  • 若需兼容 Android 15 以下设备,保留上述API版本判断逻辑即可——低版本系统会自动走旧方法分支,Android 15及以上系统会走新方法分支,不会触发旧方法调用。

另外需注意:getInstallSourceInfo()返回的InstallSourceInfo还提供getInitiatingPackageName()(获取发起安装请求的包名),和getInstallingPackageName()(执行安装的包名)可能存在区别,可根据业务需求选择合适字段。

内容的提问来源于stack exchange,提问作者Alexey Starinsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:35:00