2012-02-15 8 views
13

Dla użytkowników, którzy spędzili trochę czasu w kodzie źródłowym Androida, nie jest to informacja, że ​​identyfikatory wygenerowane w klasie android.R nie 1: 1 odzwierciedlają rzeczywiste zasoby znalezione w res/ katalogi dostarczonego pliku JAR. Wiele rysunków/stylów/układów nie jest "publicznych" i dostępnych dla aplikacji przez odniesienie android.R.xxx.Zabezpieczone identyfikatory Androida w aplikacji R.java

Moje pytanie brzmi: czy ktokolwiek zna mechanizm, dzięki któremu Android jest w stanie wygenerować klasę R.java, która różni się od rzeczywistego wykresu zasobów? Po drugie, czy jest to mechanizm (wykorzystujący reguły kompilacji itp.), Który jako programiści moglibyśmy wykorzystać do częściowej ochrony identyfikatorów, które upubliczniono w aplikacjach używanych jako biblioteki?

Z góry dziękuję!

Odpowiedz

1

Zasób pakietów Androida używa programu aapt i generuje plik R za pomocą tego narzędzia podczas procesu kompilacji. W tym kroku pliki XML są kompilowane do pliku binarnego, a inne zasoby są po prostu pakowane w takim stanie, w jakim są. Możesz otworzyć plik .apk jako archiwum zip i uzyskać dostęp do wszystkich plików zasobów bez zmian. Projekty biblioteczne po prostu zawierają pliki źródłowe i zasoby, które są dodawane do projektu w czasie kompilacji, więc będą istnieć w jakiś sposób w pliku .apk. Prawdopodobnie układy nie mają wartości 1: 1, ponieważ kod XML jest już skompilowany dla projektu biblioteki. Prawdopodobnie możesz użyć programu Aapt do usunięcia plików z projektu biblioteki z dołączenia w czasie kompilacji, ale wtedy nie będą one dostępne w twoim projekcie. Być może istnieje również sposób na zaciemnienie nazw zasobów podczas kompilacji za pomocą programów aapt i mrówka, ale to nie powstrzyma ich przed dostępem do nich.

Nie jestem pewien, dlaczego chciałbyś chcieć klasy R.java, która różni się od rzeczywistego wykresu zasobów. Albo nie włączaj tych zasobów w czasie kompilacji, albo będą one w apk. Twoje układy są skompresowane jako pliki binarne na wyjściu, więc nie jestem pewien, jak łatwo jest je dekompilować lub użyć ponownie w innym projekcie.

Co to jest końcówka tutaj? Jeśli ma to chronić twoje zasoby, będzie to trudne. Android jest wyjątkowo niepewny, jeśli ktoś ma możliwość zrootowania telefonu. Jeśli chcesz chronić swój adres IP, co zakładam, jest tutaj końcówką, spróbuję skompilować mój projekt do apk i sprawdzić, czy mogę dekompilować lub wyodrębnić krytyczne zasoby z apk. Może spróbujcie trochę zaciemnić, ale znowu, nie wiem wystarczająco dużo o skompilowanych plikach XML, aby wiedzieć, czy są one wystarczająco zaciemnione, aby nie można ich było łatwo zepsuć.

Ktoś może mnie poprawić, jeśli się mylę, ale to tylko moje 2 centy.

+0

Głównym celem pytania jest po prostu poznanie, w jaki sposób budowanie ROM z systemem Android R.Java jest w stanie wykluczyć zasoby. Ciekawe jest to, że układy są kompilowane dwuetapowo, chociaż logika ta nie działałaby dla wykluczonych elementów, więc musi być inna metoda w grze. Jeśli chodzi o drugie pytanie, bezpieczeństwo nie jest problemem tak samo jak usuwanie zanieczyszczeń, które występują w ostatecznym pliku R.java z projektami bibliotecznymi, ponieważ wszystkie identyfikatory kończą się połączeniem w jedno odniesienie do klasy "R" w głównym pakiecie , często prowadząc do nakładania się. – Devunwired

+0

@Devunwired Czy używasz narzędzia proguard lub obsfucation? Kiedy przeglądam pliki APK, wszystkie moje rysunki (takie jak obrazy .png) są po prostu umieszczone w folderze res w odpowiednim miejscu. Ponownie, jak już wspomniałem, plik R.java jest tworzony podczas fazy kompilacji, więc jeśli coś takiego, jak tego chcesz, jest możliwe, będzie to przed lub w trakcie tego kroku. – onit

+0

Dokładnie o to mi chodzi, ale rób to z android.jar zamiast z własnej aplikacji. Zauważysz, że katalog 'res /' ma o wiele więcej rysunków, niż będziesz mógł odwoływać się, wywołując w kodzie 'android.R.drawable.xxx'. – Devunwired

Powiązane problemy