Aplikacja androidowa wielomodułowa a proguard/obsfukacja

0

Robię aplikację androidową, która ma 3 moduły:

  1. app (apply plugin: 'com.android.application') - cały kod w java
  2. domain (apply plugin: 'java-library' oraz apply plugin: 'kotlin') - tylko data class w kotlinie (np: data class MyResponse)
  3. networking (apply plugin: 'java-library') - kod javowy, retrofit client + interfejs retrofitowy (np: Single<List<MyResponse>> doGetData();)

Pytanie do was o obsfukację/ proguarda:
Gdzie macie plik proguard-rules.pro ?
Ja mam ten plik w module app i nie wiem czy to dobrze czy może powinienien go wynieść gdzieś wyżej lub może każdy moduł powinien mieć taki plik.

Czy aplikacje wielomodułowe powinny mieć taki jeden plik?

Mam problem ponieważ aplikacja mi się crashuje jak zrobię Signed bundle/apk (w trybie release i z całą obsfukacją). Problem chcę sam rozwiązać tylko potrzebuję nakierowania czy powinieniem mieć ten plik w module androidowym czy może też w innych modułach.

A sam problem jest taki że w module app jak apka zrobi request to sam request jest okej (loguję go sobie i dobre dane wracają), ale obiekt w response klasy MyResponse jest pusty, tzn wszystkie pola klasy MyResponse są nullem. Obstawiam problem z modułem networking

2

Od AGP 3.4.0 R8 jest używane jako domyślne narzędzie do optymalizacji i zaciemniania kodu. Sam ProGuard to dzieje przeszłości. Aczkolwiek R8 rozumie reguły ProGuarda.

Co do samego tematu, to możesz w zasadzie robić dowolnie. Najpoprawniej byłoby trzymać osobne konfiguracje dla R8 w modułach, które mają klasy wymagające dodatkowych plików konfiguracyjnych. Tutaj w sekcji Library dependecies masz opisane, gdzie takie pliki należy umieścić. Przy czym to dotyczy R8. ProGuard tego nie wyłapie.

Jeżeli dalej korzystasz z ProGuard'a, to reguły per moduł możesz opublikować dla modułów androidowych za pomocą consumerProguardFiles. R8 też to zrozumie w razie czego. Natomiast nie ma jak połączyć modułów JVM i ProGuard'a. To da się zrobić tylko z R8 za pomocą konfiguracji z poprzedniego akapitu.

Przy czym nie stoi nic na przeszkodzie, żeby skonfigurować wszystkie potrzebne reguły tylko w module aplikacji. Ma to swoje wady i zalety.

0

Dzięki, AGP mam 4.0.2 więc korzystam z R8, ten cały proces znam powierzchownie i dlatego mylę pojęcia. Poczytam dokumentację i spróbuję to odpalić, tak by każdy moduł miał swoje zasady

0

Rozwiązałem problem z crashem apki,
jak ktoś jest zielony w temacie to polecam wykorzystać apk analyzer, można podejrzeć jakie klasy są widoczne i czy mają pełne nazwy. Bezproblemowo można definiować zasady w pliku proguard-rules.pro(w module androidowym) które będą się odnosić do innych modułów(np. java-library).

Mam hipotezę że retrofit albo rxjava korzysta z refleksji i dlatego klasy domenowe muszą być nieobsfukowane

0

RxJava w ogóle nie potrzebuje reguł ani nie korzysta z refleksji (chyba że Rx 1). Retrofit korzysta z refleksji i potrzebuje reguł, ale nie dla zewnętrznych klas tylko dla interfejsów do poprawnego tworzenia proxy. Ale Retrofit sam dołącza odpowiednie reguły wraz z biblioteką.

Strzał w ciemno – korzystasz z Gsona w oparciu o refleksję i stąd konieczność reguł. Ewentualnie z jakiegoś innego parsera.

2

Jeszcze w ramach ciekawostki polecam adnotacje

import androidx.annotation.Keep;
@Keep

która powoduje że przy klasie nie musimy dopisywać żadnych reguł :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1