我已经查看了AOSP源代码,以了解未知来源检查是如何进行的。它比已知来源=Android Play更复杂。
首先为了背景,未知来源检查和消息由
INSTALL_NON_MARKET_APP生成。这个标志出现在几个地方,但主要出现在
PackageInstallerActivity中。实际上,这是AOSP中唯一出现并被有效使用的地方。让我们在这里看看:
String callerPackage = getCallingPackage();
if (callerPackage != null && intent.getBooleanExtra(
Intent.EXTRA_NOT_UNKNOWN_SOURCE, false)) {
try {
mSourceInfo = mPm.getApplicationInfo(callerPackage, 0);
if (mSourceInfo != null) {
if ((mSourceInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
initiateInstall();
return;
}
}
} catch (NameNotFoundException e) {
}
}
if (!isInstallingUnknownAppsAllowed()) {
showDialogInner(DLG_UNKNOWN_APPS);
return;
}
initiateInstall();
PackageInstaller是AOSP中包含的一个软件包,它可以处理APK文件的ACTION_VIEW意图。在允许应用程序安装之前,PackageInstaller会检查两个方面:
1. 应用程序是否为系统应用程序。如果应用程序是系统应用程序,则不需要考虑,它会告诉包管理器安装您的应用程序。这意味着,如果三星将其三星市场商店作为三星设备上的系统应用程序,则它自动成为可信来源。实际上,它将跳过此处的第2步。
2. 如果未设置该系统标志,则认为该应用程序不是受信任的来源。也就是说,系统应用程序也可以跳过软件包安装程序,直接调用
PackageManagerService中的隐藏函数installPackage。这似乎是GooglePlayStore所做的,因为当我禁用PackageInstallerActivity上的安装功能时,我仍然可以正常安装apk。
总结一下:已知来源是系统应用,而不仅仅是从 Google Play 下载的应用程序。Google Play 完全绕过了 INSTALL_NON_MARKET_APP 标志,因为它不使用 PackageInstaller。如果您创建的应用程序不是系统应用程序,则安装 APK 的唯一方法是使用 PackageInstaller。由于您的应用程序不是系统应用程序,因此它将检查未知来源是否已禁用。