Я пытаюсь настроить Android для мультимедийного устройства. Мы получили прошивку от производителя и она основана на Android 7 с небольшими изменениями.
Мы хотели бы ограничить установку приложений на устройстве только определенными приложениями. Мы не будем устанавливать на устройство ни один магазин приложений, например, Google Play. Мы создадим прошивку и установим все приложения на устройства в наших мастерских и доставим клиентам. В будущем мы можем захотеть установить больше приложений на устройства через OTA или с помощью некоторых механизмов.
Мы хотели бы запретить клиентам загружать другие приложения через USB-порт. Мы создали файл (например, whitelisted_apps.txt), который содержит список всех утвержденных имен приложений, например -
com.mycompany.android.app1
com.mycompany.android.app2
com.ourpartner.android.appx
Мы настроили приложение PackageInstaller в AOSP, чтобы при открытии файла * .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, чтобы мы могли сравнить? Есть другие идеи?
Большое вам спасибо.