Как исключить классы из скомпилированного 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 исключить)
Потому что в противном случае возникает ошибка о том, что имеется несколько одинаковых классов с конфликтующей реализацией.
После долгих раздумий, я пришел к такому решению:
В проекте используется Gradle. В каждом модуле для различных уровней API(назовем их API-модулями), я создал еще один подмодуль, в который вынес этот класс. После чего я объявил API-модули зависимыми от этих модулей(API 16 - модуль зависит от своего внутреннего модуля, API 18 - от своего, и т.д.), после чего объявил эти зависимости не как 'compile', а как 'provided'. После чего все спокойно компилировалось.