Android: как разделить код между проектами, подписанными с тем же сертификатом

В Android документации о подписании кода мы можем прочитать: "Подписывая несколько приложений с тем же сертификатом и используя проверки разрешений на основе подписи, ваш приложения могут совместно использовать код и данные безопасным образом."

Как именно такое совместное использование кода может быть сделано? Можно ли выпустить основное приложение и несколько сменных плагинов, а затем открыть их во время выполнения? Что выглядит исходный код и каковы преимущества перед "стандартными" намерениями вызовов от/к различным пакетам APK?

Ответы

Ответ 1

Используйте Context.createPackageContext(), чтобы создать пакет для другого .apk, который вас интересует. Если он подписан с тем же сертификатом, что и ваш, и вы используете один и тот же общий идентификатор пользователя, тогда вы можете использовать флаг для загрузки своего кода в ваш процесс, позволяя вам получить ClassLoader из контекста и создать экземпляр любых классов, которые вы хотите.

В противном случае, если они не подписаны одинаково и явно используют один и тот же общий использованный идентификатор, вы можете загружать только свои ресурсы.

Обратите внимание, что вы не можете изменить общий идентификатор пользователя для приложения (что-то еще или перемещаться между наличием и не иметь общий идентификатор пользователя), как только это приложение будет на рынке.

Ответ 2

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

Context friendContext = this.createPackageContext("packageName", Context.CONTEXT_INCLUDE_CODE);
Class friendClass = friendContext.getClassLoader().loadClass("packageName.className");
Class noparams[] = {}; //say the function (functionName) required no inputs
friendClass.getMethod("functionName", noparams).invoke(friendClass.newInstance(), null);