Разрешить только выбранные приложения для боковой загрузки в Android - PullRequest
2 голосов
/ 22 марта 2019

Я пытаюсь настроить 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, чтобы мы могли сравнить? Есть другие идеи?

Большое вам спасибо.

1 Ответ

0 голосов
/ 22 марта 2019

Похоже, вы слишком стараетесь частично отключить боковую загрузку.Используйте владельца устройства, чтобы полностью отключить установку, и просто предварительно загрузите нужные приложения.Или сделайте так, чтобы единственным приложением, которое можно установить, был ваш собственный загрузчик, который смотрит только на ваш сервер.

...