在Android中仅允许选定的应用进行侧加载

在Android中仅允许选定的应用进行侧加载,android,digital-signature,android-source,Android,Digital Signature,Android Source,我正在尝试为媒体设备定制Android。我们从制造商那里得到了固件,它基于安卓7,只是做了一些小的修改 我们希望做的一件事是将设备上的应用程序安装限制为仅限于某些应用程序。我们不会在该设备上安装任何像Google Play这样的应用商店。我们将在研讨会上构建固件并将所有应用程序安装到设备上,然后交付给客户。将来,我们可能希望通过OTA或某些机制在设备上安装更多应用程序 我们不允许客户通过USB端口侧向加载其他应用程序。我们创建了一个文件(例如,whitelisted_apps.txt),其中包含

我正在尝试为媒体设备定制Android。我们从制造商那里得到了固件,它基于安卓7,只是做了一些小的修改

我们希望做的一件事是将设备上的应用程序安装限制为仅限于某些应用程序。我们不会在该设备上安装任何像Google Play这样的应用商店。我们将在研讨会上构建固件并将所有应用程序安装到设备上,然后交付给客户。将来,我们可能希望通过OTA或某些机制在设备上安装更多应用程序

我们不允许客户通过USB端口侧向加载其他应用程序。我们创建了一个文件(例如,whitelisted_apps.txt),其中包含所有已批准应用程序名称的列表,例如-

com.mycompany.android.app1
com.mycompany.android.app2
com.ourpartner.android.appx
我们调整了AOSP的PackageInstaller应用程序,以便在通过文件浏览器打开*.APK文件以及调用PackageInstallerActivity.java中的方法时,它会将要安装的应用程序的名称与白名单_apps.txt中的名称进行比较,如果找不到名称,则不允许安装新应用程序。它起作用了


现在,我们想进一步改进它,因为白名单上的_apps.txt可以被操纵。有些人建议使用sqlite来保存列表。我们不确定这是否是最好的解决办法

一些人建议使用证书和签名,我们认为这是一个比其他人更好的解决方案。我们将使用密钥对要安装在设备上的所有应用程序进行签名。当*.APK文件被侧向加载时,PackageInstaller将获得APK的签名并与我们的进行比较。如果它们匹配,应用程序可以侧载

我们遵循了这个优秀的资源:。它与硬编码的APP_签名一起工作。我们目前有:

public boolean validateAppSignature() throws NameNotFoundException {
    boolean sigMatch = false;
    String APP_SIGNATURE = "123456784658923C4192E61B16999";
    PackageInfo packageInfo3 = mPm.getPackageInfo(
            getPackageName(), PackageManager.GET_SIGNATURES);

    try {
        for (Signature signature : packageInfo3.signatures) {
            // SHA1 the signature
            String sha1 = getSHA1(signature.toByteArray());
            Log.i(TAG, "got this SHA1 of the signature ... "+sha1);
            // check if it matches hardcoded value
            sigMatch = APP_SIGNATURE.equals(sha1);
            if (sigMatch){
                return sigMatch;  
            }
        }
    } catch (Exception e) {
            e.printStackTrace();
        }

    return false;
}
只是我们不知道如何在现实世界中做到这一点。当我们使用OTA构建、安装应用程序或发布应用程序时,我们使用私钥对这些应用程序进行签名,然后在设备(PackageInstaller应用程序)上,将证书的SHA1签名硬编码为应用程序签名,以便我们可以比较?还有其他想法吗


非常感谢你

似乎您太努力了,无法部分关闭侧加载。使用设备所有者完全关闭安装,只需预加载所需的应用程序。或者让它成为唯一可以安装的应用程序,是您自己的下载程序,它只查看您的服务器。

Hi Gabe,谢谢您的建议。我们担心,如果关闭安装,可能会影响我们的OTA更新。此外,在我们向客户交付设备后,白名单上的应用程序将随着时间的推移而改变(我们可能会删除当前的应用程序并安装新的应用程序)。在任何情况下,我都会看看你建议的解决方案(我不是Android开发人员),并询问是否还有更多问题。再次感谢。这样做更有理由。您基本上需要编写自己的更新服务和fluent,并且您希望选择我们的所有安装,而不是通过该应用程序,“因为白名单上的_apps.txt可以被操纵”。除非设备被黑客入侵,否则不会发生。如果它被黑客攻击,就不能再保证有任何限制。无论如何,签名检查比静态应用程序列表要好得多。假设您的签名在20年或更长时间内保持不变,硬编码是可以的。将公共签名列为可更新文件可能更好。谢谢。白名单_apps.txt当前位于资产文件夹中。它可能必须移动到另一个位置,因为其他应用程序/服务也需要访问(读写)它,以便我们可以更新列表。所以我想我们不能保证太多。在任何情况下,我们都将探索签名方法和Gabe Sechan在下面的答案中建议的方法,并看看哪种方法最适合我们。