2015-01-18 4 views
1

У меня проблема. У меня есть структура проекта, глядя, как это:
P
| -SubP1
| -SubP2Исключить класс из полученного файла dex

Есть две тупиковые классы android.media.IRemoteDisplay в обоих пакетах. Они отличаются в реализации, но это не вопрос - они будут заменены системными классами, когда я запустил приложение на Android.

Однако есть проблема - я не могу построить проект, потому что dexMerger терпит неудачу - он говорит, что есть два конфликтующих класса. Я могу понять, что ошибка - в конце концов, на самом деле есть две противоречащие друг другу классы :)

Но когда я пытаюсь исключить эти файлы в build.gradle так:

sourceSets { 
    main { 
     java { 
      srcDir 'src' 
      exclude '**/android/media/**' 
     } 
    } 
} 

компиляция терпит неудачу, потому что это может» t find android.media.IRemoteControlDisplay класс (и это вложенные классы).

Как я могу использовать эти классы, но исключать их из результирующего файла DEX?

Пожалуйста НЕ вопрос, если это право исключить класс из скомпилированного проекта - это то, что нужно сделать, я уже сделал это, но вручную - путем предварительной компиляции SubP1 и SubP2 в банках, а затем вручную удалить IRemoteController.class из этих кувшины файлов, а затем в том числе тех банков в P.

Я также буду доволен этим решением:
1. Построить SubP1
2. Удалить IRemoteControlDisplay.class из SubP1.jar
3 . Build SubP2
4. Удалить IRemoteControlDisplay.cla ss from SubP2.jar
5. Добавить SubP1.jar и SubP2.jar как зависимости от P
6. Build P
Если это возможно, сообщите нам об этом.

+0

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

+0

Почему вы исключаете всю папку, а не только этот конкретный класс/файл? – Jim

+0

Eugen, я знаю, что я делаю. Приложение не приведет к сбою, потому что IRemoteControlDisplay - это класс, который присутствует в системном пакете android.media.Обычно вы не можете получить к нему доступ, но мне нужно получить к нему доступ, и я сделал это, создав класс-заглушку с теми же сигнатурами методов. Таким образом, исключив его, приложение совершит вызовы для реализации системы. BTW, я уже сделал это - компилируя банки и удаляя файлы .class оттуда, а затем включаю те банки в проекте. Но теперь я хочу сохранить его более автоматическим. –

ответ

1

Наконец, я смог это сделать.

Что мне нужно было выполнения зависимость вместо компиляции времени зависимость. Итак, я создал подмодуль для SubP1 под названием SubSubP1 (например) переместил android.media.IRemoteDisplay в SubSubP1 и создал подмодуль SubSubP2 для SubP2 и сделал то же самое с классом stub. Тогда я объявил зависимость следующим за SubP1 и SubP2:

dependencies { 
    provided project(':SubP1:SubSubP1') 
} 

и

dependencies { 
    provided project(':SubP2:SubSubP2') 
} 

И что сделал трюк! Вместо компиляции классов Gradle предполагал, что они будут загружены во время выполнения.

Смежные вопросы