我正在尝试为媒体设备自定义Android。我们从制造商处获得了固件,它基于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中的方法时,它会将要安装的应用程序的名称与whitelisted_apps.txt中的名称进行比较。如果找不到该名称,则禁止安装新应用程序。它正在发挥作用。
现在,我们希望进一步改进它,因为可以操作whitelisted_apps.txt。有些人建议使用sqlite来保存列表。我们不确定它是否是最佳解决方案。
有人建议使用证书和签名,我们认为这是一个比其他人更好的解决方案。我们将使用我们的密钥在设备上签署我们要安装的所有应用程序。当侧载* .APK文件时,PackageInstaller将获得APK的签名并与我们进行比较。如果匹配,则应用程序可以侧载。
我们遵循了这个优秀的资源:SignatureCheck.java。它正在使用硬编码的APP_SIGNATURE。我们目前有这个:
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签名硬编码为APP_SIGNATURE,以便我们进行比较?还有其他想法吗?
非常感谢。
看起来你似乎太难以部分关闭侧载。使用设备所有者完全关闭安装,只需预加载所需的应用程序。或者使它成为唯一可以安装的应用程序是您自己的下载程序,只查看您的服务器。