2017-09-18 62 views
6

Przyjmijmy, mam strukturę:Proguard, zachować wszystkie odwołuje zajęcia

import some.other.Clazz; 

public class A { 

    Clazz clazz; 
    B b; 

    public class B { 
     C c; 
     //... 
    } 

    public static class C { 
     //... 
    } 
} 

jest jakiś fajną PROGUARD trik, który pozwoliłby mi rekurencyjniekeep wszystkich klas, które są używane przez moją klasą A? A więc także wszystkie klasy, do których odwołuje się wewnętrznie: B,i Clazz?

+0

Czy możesz wyjaśnić, dlaczego potrzebujesz takiej "podstępnej sztuczki"? Jaki jest twój przypadek użycia? – larsgrefer

+0

@larsgrefer Oczywiście, tworzę narzędzie, które sprawdza, czy klasa, którą muszę zachować w proguardzie, ma prawidłową regułę proguard. Byłoby mi łatwiej zweryfikować obecność pojedynczej reguły dla klasy "A", niż ręcznie wymyślić wszystkie przywoływane klasy i zweryfikować obecność reguł dla wszystkich z nich. –

+0

Czy to jest pytanie na Androida? –

Odpowiedz

2

Nie sądzę, że można to zrobić tylko z proguardem i naprawdę wątpię, że istnieje proste rozwiązanie (wtyczka, z której można korzystać) z mvn \ gradle \ sbt \ cokolwiek dla tego.

Jeśli masz problemy z uruchamianiem kodu lub poleceń powłoki podczas kompilacji, mogę polecić Ci kilka elementów, ale ponieważ ich połączenie naprawdę zależy od tego, jak budujesz swój projekt, mogę tylko podać podstawowe sugestie, jak je przykleić. razem.


Ogólna idea jest:

(1) Zastosowanie jdeps (część i dystrybuowane z JDK), aby pobrać zależnościami (w tym przechodni) z zestawionych .class plików zainteresowania.

W twoim przypadku wpisywanie rekurencyjnych zależnościami some.class (ograniczone do root_package) powinno być coś takiego:

jdeps -v -R -e "root_package.*" some.class 

(2) grab jdeps wyjścia i przekształcenie go w PROGUARD config (lista klas -keep) .

(3) W twoim głównym pliku konfiguracyjnym include plik konfiguracyjny wygenerowany w (2).


Krok (2) wymaga większości nóg i można do niego podejść inaczej.

Moja sugestia polega na używaniu dowolnych funkcji skryptowania, które twój system budowania musi uruchomić jdeps i transformacji wyjścia.

Maven, na przykład, ma plugin that allows groovy scripts to be executed podczas kompilacji.

Jeśli jesteś bardziej wygodne uruchamianie skryptów powłoki można wykonać następujące czynności:

  1. rura jdeps wyjścia do czegoś podobnego:

    grep -Po classname_regex

    ... aby zachować tylko nazwy klas chcesz zachować (możesz użyć asercji o zerowej długości do zbudowania classname_regex).

  2. wyjście rura grep w coś podobnego:

    awk '{print "-keep class " $0}

    ... dostać PROGUARD config i zapisywać dane wyjściowe do pliku.

+1

Nie jest doskonały, ale mógłbym pracować z 'jdeps' (którego istnienia nie znałem wcześniej). Dzięki –