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);