Pytanie Dlaczego nie można pomijać klas Java w różnych wersjach Androida?


Mam aplikację na Androida o 2 smakach: -flavor1 -flavor2

Moje drzewo katalogów to:

/src/main
/src/flavor1
/src/flavor2

main ma domyślny zestaw źródeł. Katalogi flavor1 i flavor2 mają swój własny zestaw źródeł, a gradle dostaje się automatycznie. Jeśli dodaję plik zasobów do katalogu smaku, to zastępuję go z głównego i działa dobrze.

Jeśli jednak dodaję klasę java do flavor2, aby zastąpić inną z "main" (na przykład działanie, które musi być inne w flavor2), to go nie zastępuje i mówi, że w moim projekcie jest zduplikowana klasa. Zrobiłem to tylko poprzez usunięcie klasy z głównego katalogu i dodanie jej do wszystkich folderów smaków.

Czy istnieje sposób, w jaki można zastąpić klasy java, podobnie jak pliki zasobów? dlaczego to się dzieje?


21
2017-07-30 21:00


pochodzenie


"Czy istnieje sposób, który może przesłonić klasy java, podobnie jak pliki zasobów?" - AFAIK, nie. "dlaczego to się dzieje?" - AFAIK, czyli standardowe zachowanie zestawu znaków Gradle dla kodu Java. - CommonsWare


Odpowiedzi:


Czy istnieje sposób, w jaki można zastąpić klasy java, podobnie jak pliki zasobów?

Nie. Xavier Ducrohet z zespołu narzędzi Android omówił niektóre z nich krótko tutaj.

Są sposoby na osiągnięcie tego, co chcesz - więcej na ten temat w ciągu sekundy.

dlaczego to się dzieje?

Twój kod Java musi się skompilować. Zakładając, że odwołujesz się do klasy Foo z innych klas w twoim main zestaw źródłowy, że Foo klasa musi mieć ten sam publiczny interfejs API niezależnie od tego, jaki aromat jest kompilowany. Gdybyś był w stanie całkowicie zastąpić główny Foo o specyficznym smaku Foomoże to nie być prawdą. Nie jest to oczywiście problem niemożliwy do rozwiązania za pomocą narzędzi, ale obecne narzędzie do kompilacji nie pozwala na to.

Oczywiście przy takich zasobach, jak obrazy, jest zupełnie inaczej - dopóki istnieje jakaś wersja zasobu, Android może z niej korzystać w porządku.

Możesz jednak tworzyć specyficzne dla smaku implementacje klasy, która będzie używana w twoim main zestaw źródeł. Najprostszym sposobem jest po prostu umieścić tylko Foo w każdym smaku i nie zapewnia Foo w Twoim main zestaw źródeł. W przypadku punktów bonusowych utwórz interfejs dla tych implementacji w swoim main zestaw źródeł zapewniający, że implementacje specyficzne dla danego smaku są zgodne z tym samym interfejsem i nie powodują błędów kompilacji.


27
2017-07-30 21:12



dzięki ! bardzo przydatna i kompletna odpowiedź - agustin.aliaga