安卓已知源

13

当您安装来自未知来源的apk文件时,Android会提醒并验证您是否要安装该apk文件。此文件必须与已知来源列表进行比对。

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

编辑: 如果我的问题令人困惑,我很抱歉,请允许我澄清一下。当您从usb或电子邮件安装APK时,Android会提示您说您正在安装来自未知来源的应用。此时,您可以拒绝或接受该事实并继续。为了确定是否从未知来源安装应用程序,我假设 AOSP 中包含已知来源列表。我可能是错的,因为有评论指出它只是所有未从Google Play商店安装的应用程序。

我希望能看到此检查的执行情况。如果没有列表,该检查在AOSP中执行的位置在哪里?如果有一个已知来源列表,那么这个列表在哪里?


1
这意味着这是一个没有从Android市场下载的应用程序。除此之外,没有“已知来源”。 - thegrinner
我猜你正在寻找一个包含已知安全域名和apk文件的数据库,对吗?我不知道有没有这样的数据库,但我希望我的评论能帮助其他用户更好地理解你的问题。 - Reinherd
如果有人在给我点踩,我很想知道为什么。是因为问题不够清晰,还是因为你认为这不是一个有效的问题? - Andrew T.
已知来源为Android Play。这是唯一已知的来源。 - njzk2
2
@njzk2 经过调查,这并不完全正确。请参考我的回答。 - Andrew T.
2个回答

27
我已经查看了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 下载的应用程序。Google Play 完全绕过了 INSTALL_NON_MARKET_APP 标志,因为它不使用 PackageInstaller。如果您创建的应用程序不是系统应用程序,则安装 APK 的唯一方法是使用 PackageInstaller。由于您的应用程序不是系统应用程序,因此它将检查未知来源是否已禁用。

1
@TheTerribleSwiftTomato 谢谢。我正在处理与此过程相关的工作,所以我需要一些相当具体的东西。由于Google Play基本上是唯一安装APK的系统应用程序,因此它似乎是唯一的,但也可能还有其他应用程序。 - Andrew T.
有点晚了,但我已经开发了一个安卓应用程序。我知道有很多MDM解决方案可以允许在不更改安卓设备上的任何安全设置的情况下下载apk文件。那么,如何避免从Google商店下载apk呢?我需要创建自己的软件包安装程序吗?(如果这听起来像个愚蠢的问题,我很抱歉)。 - Kush
该应用程序可以下载和安装其他应用程序,但需要预先安装在系统中或使用系统密钥进行签名。否则,您需要对系统的某些部分进行修改才能实现这一点。 - Andrew T.

0

正如评论所建议的那样,"sources"这个词意味着“起源之地”(例如应用程序包存储库),而不是“源代码”。这与AOSP完全无关。

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

我说“通常”,因为你可以在自定义分支中定义另一个来源-尽管我个人没有遇到过这种情况(不知道这与三星应用商店的兼容性如何)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接