因此,我现在查看了 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) {
// System apps don't need to be approved.
initiateInstall();
return;
}
}
} catch (NameNotFoundException e) {
}
}
if (!isInstallingUnknownAppsAllowed()) {
//ask user to enable setting first
showDialogInner(DLG_UNKNOWN_APPS);
return;
}
initiateInstall();
所以 PackageInstaller 是一个包含在 AOSP 中的包,它了解如何处理 APK 文件的 ACTION_VIEW 意图。PackageInstaller 在允许安装应用程序之前检查两件事。
该应用程序是系统应用程序。如果应用程序是系统应用程序,它并不关心,它会告诉包管理器安装您的应用程序。这意味着,如果三星将其三星市场商店作为三星设备上的系统应用程序,那么它就自动成为受信任的来源。事实上,它会在这里跳过第 2 步。
如果未设置该系统标志。如果未设置该标志,因此您不是系统应用程序,则因此您不是受信任的来源。话虽如此,系统应用程序也可以跳过包安装程序,直接调用可以在PackageManagerService中找到的隐藏函数 installPackage 。这似乎是 GooglePlayStore 所做的,因为当我禁用 PackageInstallerActivity 上的安装功能时,我仍然可以正常安装 apk。
所以总结一下:已知来源是系统应用程序,而不仅仅是从谷歌播放下载的应用程序。Google play 完全绕过了 INSTALL_NON_MARKET_APP 标志,因为它不使用 PackageInstaller。如果您创建的应用程序不是系统应用程序,则安装 APK 的唯一方法是使用 PackageInstaller。由于您的应用程序不是系统应用程序,因此它将检查是否禁用了未知来源。