Android 必知必会 - InstallerPackageName 的一点补充

691 阅读2分钟

我正在参加「掘金·启航计划」

因业务需要,项目需要一些 InstallerPackageName 方面的一些知识,随便看了下,很多开发估计不知道还有这档子事情。阅读资料发现一篇文章讲的还是很全面的,但是有些细节在实践中还是需要补充下。

# 在应用开发中我们通常会在应用的打包脚本中标注多个渠道,用以统计应用在不同的应用市场中的效果。这当然是一个不错的做法,不过有的时候我们还想要知道用户是通过什么方式安装应用的,此时就需要使用 InstallerPackageName 了:
package android.content.pm;
public abstract class PackageManager {
    /**
     * Retrieve the package name of the application that installed a package. This identifies
     * which market the package came from.
     *
     * @param packageName The name of the package to query
     */
    public abstract String getInstallerPackageName(String packageName);
}

# 我们可以通过 PackageManager.getInstallerPackageName(String pack) 来获取某个应用安装时使用的安装器的名称。看起来非常的方便但是该方法并不能代替渠道号的作用。

原文链接:Android:关于InstallerPackgeName的二三事

上面的文章内容有几点要说下:

1、常见的返回值:

com.google.android.packageinstaller 设备默认安装器,这个是特殊机器的包名情况,我通过阅读各版本(2.3-7.1)的 Android 源码,发现都是 com.android.packageinstaller ,不过最终是哪个还得看手机厂商。 2、如何修改渠道号:代码修改

对于 setInstallerPackageName(String targetPackage, String installerPackageName) 而言:

  • targetPackage 、installerPackageName 都要求是本机已安装应用的包名;
  • installerPackageName:要求调用者 App 的签名和 installerPackageName 所对应的 App 的签名相同,即同为系统签名或者同一个签名文件签发的 App。

以 targetPackage 的 installerPackageName 是否为空的2种情况来说明:

  • 有一个 App(PackageName = A),其 installerPackageName 是 B,App(PackageName = C)想要修改 A 的 installerPackageName,要求 C 必须和 B 是同一个签名文件签发的。

  • 有一个 App(PackageName = X),其 installerPackageName 为空(null),App(PackageName = Z)想要修改 X 的 installerPackageName,要求 Z 传入的 installerPackageName 必须和 Z 自己是同一个签名文件签发的。

PS:如果有什么建议或者问题,可以通过下面的方式和我联系