12

当您安装来自未知来源的 apk 文件时,Android 会抱怨并验证您是否要安装该 apk 文件。此文件必须检查到已知来源的列表。

我很想知道已知来源列表在 Android AOSP 上的位置。

编辑:如果我的问题令人困惑,我深表歉意,但请允许我澄清一下。当您从 USB 或电子邮件安装 APK 时,Android 会提示您说您正在安装来自未知来源的应用程序。在这一点上,您可以否认或接受这一事实并继续前进。为了确定某个应用程序是否是从未知来源安装的,我假设AOSP 中包含一个已知来源列表。我可能错了,正如一条评论指出的那样,只是所有应用程序都没有从 google play 商店安装。

我想看看这个检查是在哪里完成的。如果没有列表,则在 AOSP 中进行此检查,或者如果有列表,则此已知来源列表在哪里。

4

2 回答 2

26

因此,我现在查看了 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 在允许安装应用程序之前检查两件事。

  1. 该应用程序是系统应用程序。如果应用程序是系统应用程序,它并不关心,它会告诉包管理器安装您的应用程序。这意味着,如果三星将其三星市场商店作为三星设备上的系统应用程序,那么它就自动成为受信任的来源。事实上,它会在这里跳过第 2 步。

  2. 如果未设置该系统标志。如果未设置该标志,因此您不是系统应用程序,则因此您不是受信任的来源。话虽如此,系统应用程序也可以跳过包安装程序,直接调用可以在PackageManagerService中找到的隐藏函数 installPackage 。这似乎是 GooglePlayStore 所做的,因为当我禁用 PackageInstallerActivity 上的安装功能时,我仍然可以正常安装 apk。

所以总结一下:已知来源是系统应用程序,而不仅仅是从谷歌播放下载的应用程序。Google play 完全绕过了 INSTALL_NON_MARKET_APP 标志,因为它不使用 PackageInstaller。如果您创建的应用程序不是系统应用程序,则安装 APK 的唯一方法是使用 PackageInstaller。由于您的应用程序不是系统应用程序,因此它将检查是否禁用了未知来源。

于 2013-09-09T17:10:47.743 回答
0

正如评论已经建议的那样,“来源”一词的意思是“原产地”(如应用程序包存储库),而不是“源代码”。这与 AOSP 完全无关。

通常,这意味着“从 Google Play 下载的应用程序”(以及之前的 Android Market)。

我说“通常”,因为您可以想象在自定义 fork 中定义另一个来源 - 虽然没有亲自遇到过这种情况(不知道这与三星的应用商店有何关系)。

于 2013-09-09T13:40:15.247 回答