@AlexLeontev

Как исключить классы из скомпилированного dex-файла?

Добрый день.

Опишу ситуацию.
Ни для кого не секрет, что в Андроиде есть скрытые классы, недоступные из Android SDK. Некоторые из них и правда лучше не трогать, а некоторые могут быть весьма полезны.

Так вот. Допустим, имеется скрытый класс com.android.internal.HiddenClass, сигнатуры методов в котором различны в API 14, API 16 и API 18.

К этому классу можно получить доступ, играясь с Android SDK, получая доступ к скрытым классам(очень долгий и нудный процесс).

Я же хочу реализовать это по другому - в исходниках сделать классы-заглушки com.android.internal.HiddenClass, с одинаковой сигнатурой методов для разных уровней API, сделать HiddenClassWrapperVX, где X - уровень API, после чего из скомпилированного файла удалить com.android.internal.HiddenClass. Раньше я делал это вручную - компилировал JAR для модуля и убирал HiddenClass, после чего все 3 файла подключались как библиотеки.

Имеется проект, в котором имеется несколько модулей - каждый модуль соответствует уровню API. В каждом из модулей имеется упомянутый com.android.internal.HiddenClass.
Как мне скомпилировать проект так, чтобы классы com.android.internal.HiddenClass не обрабатывались javac и dx?(хотя можно и только из dx исключить)
Потому что в противном случае возникает ошибка о том, что имеется несколько одинаковых классов с конфликтующей реализацией.
  • Вопрос задан
  • 2357 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AlexLeontev Автор вопроса
После долгих раздумий, я пришел к такому решению:
В проекте используется Gradle. В каждом модуле для различных уровней API(назовем их API-модулями), я создал еще один подмодуль, в который вынес этот класс. После чего я объявил API-модули зависимыми от этих модулей(API 16 - модуль зависит от своего внутреннего модуля, API 18 - от своего, и т.д.), после чего объявил эти зависимости не как 'compile', а как 'provided'. После чего все спокойно компилировалось.

Пример можно посмотреть здесь(внимание, пока не стоит использовать эту библиотеку, она еще не полностью готова):
https://github.com/DrBreen/RemoteController
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы