Konfiguracja sprzętu i oprogramowania

Studio Android dodające nowy moduł. Android Studio instaluje APK dla każdego modułu

Moduły udostępniają kontener na kod źródłowy aplikacji, pliki zasobów i ustawienia na poziomie aplikacji, takie jak plik kompilacji na poziomie modułu i plik manifestu systemu Android. Każdy moduł można niezależnie kompilować, testować i debugować.

Android Studio wykorzystuje moduły, które ułatwiają dodawanie nowych urządzeń do projektu. Wykonując kilka prostych kroków w Android Studio, możesz utworzyć moduł zawierający kod specyficzny dla typu urządzenia, takiego jak Wear OS lub Android TV. Android Studio automatycznie tworzy katalogi modułów, takie jak katalogi źródłowe i katalogi zasobów oraz domyślny plik build.gradle odpowiedni dla typu urządzenia. Ponadto Android Studio tworzy moduły urządzeń z zalecanymi konfiguracjami kompilacji, na przykład przy użyciu biblioteki Leanback dla modułów Android TV.

Ta strona opisuje jak dodać nowy moduł dla konkretnego urządzenia.

Android Studio ułatwia również dodanie biblioteki lub modułu Google Cloud do projektu. Aby uzyskać szczegółowe informacje na temat tworzenia modułu bibliotecznego, zobacz Tworzenie modułu bibliotecznego .

Utwórz nowy moduł

Aby dodać nowy moduł do swojego projektu dla nowego urządzenia, wykonaj następujące czynności:

  1. Kliknij plik > Nowy > Nowy moduł.
  2. w Utwórz nowy moduł W wyświetlonym oknie Android Studio oferuje następujące moduły urządzeń:
    • Moduł telefonu i tabletu
    • Noś moduł systemu operacyjnego
    • Moduł Android TV
    • moduł szklany
    Wybierz moduł dla żądanego urządzenia, a następnie kliknij Następny.
  3. w Skonfiguruj swój nowy moduł formularz, wprowadź następujące dane:
    • Nazwa aplikacji: ta nazwa jest używana jako tytuł ikony programu uruchamiającego aplikację dla nowego modułu.
    • Nazwa modułu: Ten tekst jest używany jako nazwa folderu, w którym widoczny jest kod źródłowy i pliki zasobów.
    • nazwa pakietu: To jest przestrzeń nazw Java dla kodu w twoim module. Jest dodawany jako atrybut pakietu w pliku manifestu systemu Android modułu.
    • Minimalny pakiet SDK: To ustawienie wskazuje najniższą wersję platformy Android obsługiwaną przez moduł aplikacji. Ta wartość ustawia atrybut minSdkVersion w pliku build.gradle, który można później edytować.

    Następnie kliknij Następny.

  4. W zależności od wybranego modułu urządzenia, następna strona wyświetla wybór odpowiednich szablonów kodu, które można wybrać jako główne działanie. Kliknij szablon aktywności, od którego chcesz zacząć, a następnie kliknij Następny. Jeśli nie potrzebujesz aktywności, kliknij Nie dodawaj żadnej aktywności, Kliknij Skończyć i gotowe.
  5. Jeśli wybrałeś szablon aktywności, wprowadź ustawienia swojej aktywności na Dostosuj aktywność strona. Większość szablonów prosi o an nazwa aktywności, Nazwa układu, Tytuł, oraz język źródłowy, ale każdy szablon ma ustawienia specyficzne dla działania. Kliknij Skończyć. Po utworzeniu modułu aplikacji z szablonem działań możesz natychmiast uruchomić i przetestować moduł na swoim urządzeniu.

Android Studio tworzy wszystkie niezbędne pliki dla nowego modułu i synchronizuje projekt z nowymi plikami gradle modułu. Dodanie modułu dla nowego urządzenia dodaje również wszelkie wymagane zależności dla urządzenia docelowego do pliku kompilacji modułu.

Po zakończeniu synchronizacji projektu Gradle nowy moduł pojawi się w projekt okno po lewej stronie. Jeśli nie widzisz folderu nowego modułu, upewnij się, że w oknie jest wyświetlany widok Androida .

Importuj moduł

Aby zaimportować istniejący moduł do swojego projektu, wykonaj następujące czynności:

  1. Kliknij Plik > Nowy > Importuj moduł.
  2. w katalog źródłowy wpisz lub wybierz katalog modułów, które chcesz zaimportować:
    • Jeśli importujesz jeden moduł, wskaż jego katalog główny.
    • Jeśli importujesz wiele modułów z projektu, wskaż folder projektu. Dla każdego modułu w folderze pojawia się pole i wskazuje lokalizacja źródłowa oraz Nazwa modułu. Upewnij się, że Import pole jest zaznaczone dla każdego modułu, który chcesz zaimportować.
    Jeśli twoje moduły mają inne zależności, zostaną wymienione do zaimportowania pod Dodatkowe wymagane moduły.
  3. Wpisz żądane nazwy modułów w Nazwa modułu pole (pola).
  4. Kliknij Skończyć.

Następne kroki

Po dodaniu nowego modułu możesz modyfikować kod modułu i zasoby, konfigurować ustawienia budowania modułu i budować moduł. Możesz także uruchamiać i debugować moduł jak każdą inną aplikację.

  • Aby dowiedzieć się więcej o ustawieniach kompilacji dla modułu, zobacz Plik kompilacji na poziomie modułu .
  • Aby zbudować i uruchomić określony moduł, zobacz Wybierz i skompiluj inny moduł .

Będziesz także chciał dodać kod i zasoby, aby prawidłowo obsługiwać nowe urządzenie. Aby uzyskać więcej informacji na temat tworzenia modułów aplikacji dla różnych typów urządzeń, zapoznaj się z odpowiednią dokumentacją:

  • Dla modułów WearOS:
  • W przypadku modułów Android TV:
  • Dla modułów szklanych: GDK Quick Start

Podczas opracowywania nowego modułu możesz utworzyć kod niezależny od urządzenia, który jest już zduplikowany w innym module aplikacji. Zamiast utrzymywać zduplikowany kod, rozważ przeniesienie udostępnionego kodu do modułu biblioteki i dodanie biblioteki jako zależności do modułów aplikacji. Aby uzyskać więcej informacji na temat tworzenia modułu biblioteki i dodawania go jako zależności, zobacz



Android Studio: Moduł nie pojawi się w „Edytuj konfigurację” (13)

Czasami w manifeście Androida występują błędy z powodu krzyżowego obrazu w konfiguracji uruchamiania/debugowania, więc spróbuj sprawdzić, czy manifest Androida zawiera jakieś błędy w jednym przypadku.

Zaimportowałem projekt do Android Studio z kilkoma podprojektami.

Chcę rozpocząć podprojekt.

Z powodzeniem wykonałem podprojekty build.gradle jako moduł.

Aby go uruchomić, poszedłem do Uruchom> Edytuj konfiguracje> Aplikacja na Androida.

Problem. Kiedy próbuję wybrać moduł, żaden z nich nie pojawia się na liście rozwijanej.

Dlaczego to?

EDYCJA: Pokazuje się jako moduł w Groovy, ale nie w aplikacji na Androida. Jak mogę go pobrać w aplikacji na Androida?

przejdź do Androida >> Skrypty Gradle >> Build Gradle (Moduł: aplikacja)

upewnij się, że pierwsza linia tego pliku wygląda tak.

Zastosuj wtyczkę: „com.android.library”

Dla mnie naprawiono to po prostu przez ponowne uruchomienie Android Studio.. Tak jak za starych dobrych czasów Eclipse

W moim przypadku, nowicjusz, ryknąłem mój projekt, nie wiem jak, ale już nie zadziała i narzekałem na manifest, R, wszystko. Wymyśliłem trochę jak w moich ustawieniach. Gradle nie zawiera ":app" tylko dodałem to, znowu byłem w drodze.

W końcu zorientowałem się, dlaczego moduł nie wyświetla się, gdy dodaję konfigurację AndroidTests do modułu com.android.library.

Jeśli build.gradle moduł biblioteki w build.gradle aplikacji w ten sposób:

Skompiluj projekt(:twojabiblioteka")

Ponieważ moduł biblioteki jest domyślnie kompilowany w trybie wydania, nie można na nim uruchamiać testów systemu Android, więc nie pojawi się na liście modułów. Naprawiłem to z następującą modyfikacją:

Dodaj następującą konfigurację do pliku build.gradle modułu biblioteki:

OpublikujNonDefault prawda

build.gradle po zmianach możesz debugować kompilację swojej biblioteki edytując build.gradle modułu aplikacji, na przykład:

Compile project(":yourlibrary") + debugCompile project(ścieżka: ":yourlibrary", konfiguracja: "debug") + releaseCompile projekt(ścieżka: ":yourlibrary", konfiguracja: "release")

Następnie zsynchronizuj go, a znajdziesz go na liście.

Różne rozwiązania wydają się działać dla osób różniących się, ponieważ po prostu zamykam projekt i ponownie go importuję, rozwiązało problem.

Miałem podobny problem, kiedy wybrałem katalog nadrzędny mojego projektu, pozwoliłem Zamknij projekt -> Usuń projekt z Android Studio -> Importuj projekt wybierając odpowiedni plik build.gradle .

Upewnij się, że wybierasz poprawny plik build.gradle podczas importu.

Upewnij się, że build.gradle

Zastosuj wtyczkę: „com.android.application”

Po dokonaniu zmian zsynchronizuj ponownie.

Dzieje się tak głównie podczas kopiowania projektu bibliotecznego i budowania go. Rozwiązaniem byłoby dodanie

Zastosuj wtyczkę: „com.android.application”

w pliku build.gradle, zamiast

Zastosuj wtyczkę: „com.android.library”

Następnie wykonaj synchronizację gradientową

orderEntry type="biblioteka" exported="" name="appcompat-v7-19.1.0" level="projekt" />

Naprawiłem to, dodając krawędzie do ustawienia modułu. Zaginęli. > otwórz ustawienia modułu > Granice > Dodaj twarze(+ znak na górze)> Android. Po dodaniu twarzy będziesz mieć moduły.

AKTUALIZACJA:

Najnowsza wersja Gradle Aspekty zostały usunięte, teraz możesz bezpośrednio dodawać moduły. Kliknij kliknij prawym przyciskiem myszy myszy według projektu > otwórz ustawienia modułu > Dodaj moduł(u góry znaku „+”)> Aplikacja na telefon i tablet(teraz możesz stworzyć nowy moduł i dostosować go).

dodaj swój model do swoich aplikacji. plik iml, taki jak: orderEntry type="module" module-name="twoja nazwa_moudle" exported=""

W ostatnich Google I/O 2018, wśród wielu innowacji, zapowiedział również dodanie nowego formatu aplikacji.

Ten format nazywa się Pakiet aplikacji na Androida i jest ulepszonym sposobem tworzenia aplikacji. Dzięki niemu możesz łatwo zoptymalizować rozmiar aplikacji, bez konieczności wprowadzania jakichkolwiek zmian w kodzie. Pakiet aplikacji na Androida zawiera cały skompilowany kod i zasoby, a następnie odfiltrowuje to, co nie jest potrzebne na konkretnym urządzeniu.

Ważny! Na ten moment Pakiet aplikacji na Androida działa tylko w wersji zapoznawczej Android Studio. Ostatnia wersja Android Studio 3.2 Kanaryjskie dostępny .

Format pakietu aplikacji na Androida

Pakiet aplikacji na Androida to plik (z rozszerzeniem .aab), który jest przesyłany do Google. Każdy pakiet zawiera skompilowany kod i zasoby dla wszystkich modułów aplikacji i obsługiwanych konfiguracji urządzeń.

Mówiąc najprościej, pakiety to podpisane pliki ZIP, które organizują kod aplikacji i zasoby w moduły.

Z tych modułów Google Play generuje różne pliki APK udostępniane użytkownikom, takie jak: podstawowe pliki APK, dynamiczne pliki APK, konfiguracyjne pliki APK oraz (w przypadku urządzeń, które nie obsługują dzielonych plików APK) multi-APK. Katalogi w kolorze niebieskim reprezentują kod i zasoby, których Google Play używa do tworzenia konfiguracyjnego pakietu APK dla każdego modułu.

Notatka: należy utworzyć pakiet dla każdej unikalnej aplikacji lub identyfikator aplikacji. Oznacza to, że jeśli używasz wielu odmian produktów w swojej aplikacji do tworzenia różnych pakietów APK, a każda z tych gałęzi używa unikalnego identyfikatora aplikacji, musisz utworzyć osobny pakiet dla każdej gałęzi.

Kod i zasoby dla każdego modułu są zorganizowane podobnie do standardowych pakietów APK, co ma sens, ponieważ każdy z tych modułów można wygenerować jako samodzielny pakiet APK. Poniżej możesz zobaczyć więcej szczegółowy opis niektóre pliki i katalogi pakietu Android App Bundle:

  • podstawa/, cecha1/, cecha2/. Każdy z tych katalogów reprezentuje moduł aplikacji. Podstawowy moduł aplikacji jest zawsze zawarty w podstawowym katalogu pakietu. Katalogi z dodatkowymi funkcjami, z których każda ma przypisaną specjalną nazwę, znajdują się osobno.
  • pliki Bufor protokołu (.pb). Pliki te zawierają metadane, które pomagają opisać zawartość pakietu w sklepach z aplikacjami. Na przykład, Konfiguracja pakietu.pb, znajdujący się w głównym katalogu pakietu, zawiera informacje o samym pakiecie, takie jak wersja narzędzia do budowania używane do montażu. Inne pliki, takie jak regres.pb oraz natywna.pb, opisz, jak określony kod i zasoby powinny być używane w różnych konfiguracjach urządzeń. Google Play wykorzystuje te informacje do generowania pakietu APK zoptymalizowanego pod kątem urządzenia użytkownika.
  • oczywisty/. W przeciwieństwie do plików APK pakiety przechowują plik AndroidManifest.xml każdego modułu w osobnym katalogu.
  • dex/. W przeciwieństwie do pakietów APK, pakiety przechowują pliki DEX każdego modułu w osobnym katalogu.
  • źródło/. Ten katalog przechowuje pliki, które są później przenoszone do katalogu źródło dowolny plik APK zawierający moduł zawierający ten katalog. Na przykład katalog podstawa/korzeń/ pakiet może zawierać zasoby Java, które są ładowane przez aplikację za pomocą Class.getResources(). Pliki te są później przenoszone do głównego katalogu APK aplikacji i każdego multi-APK generowanego przez Google Play. Ścieżki w tym katalogu są również zachowywane, to znaczy podkatalogi są również przenoszone wraz z rootem.
    Notatka: jeśli zawartość tego katalogu jest w konflikcie z innymi plikami i katalogami w katalogu głównym APK, Konsola Play odrzuci pobieranie pakietu. Na przykład nie będzie można dołączyć katalogu root/lib/, ponieważ będzie to powodować konflikt z katalogiem lib znajdującym się już w pliku APK.
  • res/, lib/, aktywa/. Te katalogi są identyczne z katalogami używanymi w standardowym pakiecie APK. Podczas pobierania aplikacji Google Play sprawdza te katalogi i pakiety tylko pod kątem plików, które pasują do konfiguracji urządzenia docelowego.

Zbuduj pakiet aplikacji za pomocą przy użyciu Androida Studio

Tworzenie pakietu w Android Studio jest bardzo podobne do tworzenia APK. Aby złożyć, po prostu wybierz z menu Kompilacja — Kompiluj pakiety/APKi > Kompiluj pakiety a IDE utworzy pakiet dla wybranej opcji kompilacji i umieści go w katalogu //buduj/wyjścia/pakiet/.

Jeśli pakiet zostanie utworzony dla wersji debugowania aplikacji, Android Studio automatycznie podpisze pakiet za pomocą klucza podpisywania debugowania. Aby przesłać pakiet do Google Play, musi on być podpisany.

Gdy Android Studio zakończy tworzenie podpisanego pakietu, można go otworzyć i przeanalizować. Analiza pakietu pozwala sprawdzić zawartość i działa podobnie Analizator APK.

Aby utworzyć pakiet aplikacji, IDE używa tego samego narzędzia z open kod źródłowy, nazywa narzędzie pakietowe, którego Google Play używa do późniejszej konwersji pakietu na podpisane pliki APK.

Przed przesłaniem pakietu do Konsoli Google Play należy go podpisać. Aby utworzyć podpisany pakiet aplikacji, wykonaj następujące kroki:


Gdy Android Studio zakończy tworzenie podpisanego pakietu, można go znaleźć i przeanalizować, wybierając odpowiednią opcję w wyskakującym powiadomieniu. Jeśli wybrałeś wyeksportowanie klucza podpisywania, możesz szybko przejść do niego, klikając strzałkę w dół w prawym dolnym rogu toastu, aby go rozwinąć, a następnie wybierając Pokaż wyeksportowany plik klucza.

Przesyłanie pakietu aplikacji do Konsoli Google Play

Po utworzeniu pakietu można go przesłać do Google Play w celu sprawdzenia, przetestowania lub opublikowania aplikacji. Przed rozpoczęciem pracy należy spełnić następujące warunki:

  1. Zarejestruj się w programie Podpisywanie aplikacji Google Play.
  2. Jeśli aplikacja zawiera moduły funkcji dynamicznych, można ją załadować i przetestować za pośrednictwem wewnętrznego ścieżka testowa Konsola Google Play. Aby jednak opublikować aplikację, musisz zaakceptować program funkcji dynamicznych, który jest obecnie w wersji beta.
  3. Google Play obsługuje pobieranie aplikacji nie większych niż 100 MB.

Parsowanie APK za pomocą Eksploratora plików

Po załadowaniu pakietu Google Play automatycznie generuje podzielone pakiety APK i pakiety multi-APK dla wszystkich konfiguracji urządzeń obsługiwanych przez aplikację. W Konsoli Play możesz użyć App Bundle Explorer, aby wyświetlić wszystkie pakiety APK generowane przez Google Play; analizowanie danych takich jak obsługiwane urządzenia i oszczędności w rozmiarze APK; przesyłanie wygenerowanych pakietów APK do testowania.

Aktualizacja aplikacji

Po wgraniu aplikacji do Konsoli Play, aby zaktualizować aplikację, wystarczy zwiększyć kod wersji, a także utworzyć i wgrać nowy pakiet. Google Play wygeneruje następnie zaktualizowane pliki APK z nowym kodem wersji i udostępni je w razie potrzeby.

Wniosek

Korzystanie z pakietu Android App Bundle zapewnia ogromne korzyści w zakresie optymalizacji aplikacji APK. Korzystając z tej metody, zaktualizowaliśmy jedną z naszych aplikacji, Wi-Fi Password Manager, zastępując domyślny pakiet APK pakietem aplikacji. Tym samym rozmiar plików APK zmniejszył się o cały megabajt, co jest bardzo dobrym wynikiem.

Ponadto Google testuje obecnie dodatek do App Bundle, moduły funkcji dynamicznych, za pomocą których można podzielić podstawowy pakiet APK na części, które zostaną pobrane w razie potrzeby, na razie ta technologia jest w fazie beta.

Być może jedyną wadą pakietów w tej chwili jest konieczność korzystania z podglądowej wersji Android Studio, ale ten problem jest tymczasowy.

Zainstalowane wtyczki znajdują się w menu plik | ustawienia... | wtyczki. Przycisk Przeglądaj repozytoria... pozwala znaleźć wtyczkę w repozytorium. Przycisk Zainstaluj wtyczkę z dysku... umożliwia zainstalowanie wtyczki z dysku, jeśli pobrałeś ją samodzielnie.

nawiasy tęczowe

„Tęczowe nawiasy” pozwalają oznaczyć każdą parę nawiasów własnym, indywidualnym kolorem. Pomaga to wizualnie zobaczyć, gdzie znajduje się obszar kodu.

Zastępuje wszystkie paski postępu studia słodkim kotem. Jeśli jesteś poważnym programistą, po prostu musisz zainstalować . Kompatybilny z innymi środowiskami programistycznymi opartymi na IntelliJ IDEA: PhpStorm, WebStorm, PyCharm, RubyMine, AppCode, CLion, Gogland, DataGrip, Rider, MPS.

Pojawia się wszędzie. Na przykład podczas ładowania projektu.

Podczas pracy, synchronizując coś.

RoboPOJOGenerator

Wygodny generator gotowych klas Java i Kotlin POJO z JSON: GSON, FastJSON, AutoValue (GSON), Logan Square, Jackson.

pomysły adb

Wtyczka do Android Studio/Intellij IDEA do szybkich operacji na aplikacji:

  • Odinstaluj aplikację - usuń aplikację z urządzenia
  • Kill App - zabij aplikację (usuń z pamięci)
  • Uruchom aplikację - uruchom aplikację
  • Uruchom ponownie aplikację - uruchom ponownie aplikację
  • Wyczyść dane aplikacji - wyczyść dane
  • Wyczyść dane aplikacji i uruchom ponownie — wyczyść dane i uruchom ponownie

Po zainstalowaniu polecenia te można znaleźć za pomocą narzędzia | android | ADB POMYSŁ.

Możesz także wywołać okno wyszukiwania akcji za pomocą skrótu klawiaturowego Ctrl+Shift+A i z symbolami adb szybko znaleźć konkretne polecenie.

Wtyczka jest wygodna do sprawdzania kondycji aplikacji w różnych stanach. Na przykład wcześniej utworzyłeś bazę danych i postanowiłeś zobaczyć, jak aplikacja zachowuje się z pustą bazą danych. Za pomocą wtyczki możesz szybko wyczyścić dane i spojrzeć na wynik.

Kiedy mówimy o wtyczkach i aplikacjach modułowych, mamy na myśli przede wszystkim zwykłe oprogramowanie użytkownika. Jednak konstrukcja modułowa może być równie przydatna podczas tworzenia rootkitów i backdoorów. Używanie konwencjonalnych środków do aktualizacji takiego oprogramowania jest zbyt blade i nie zawsze możliwe, ale można po cichu załadować moduł z nową funkcjonalnością przez sieć - to wszystko. A jeśli umieścisz kluczową funkcjonalność w modułach i usuniesz je natychmiast po załadowaniu, możesz poważnie zepsuć życie odwracacza.

Zamiast wstępu

Klasyczna Java ma klasę o nazwie java.lang.ClassLoader . Jego zadaniem jest wczytanie kodu bajtowego określonej klasy (pliku z rozszerzeniem .class) na maszynę wirtualną podczas wykonywania aplikacji. Następnie możesz utworzyć obiekt tej klasy i wywołać jego metody za pomocą odbicia. Jest to sposób na dynamiczne ładowanie kodu, który może być użyty do pisania aplikacji z rozszerzalną funkcjonalnością lub po prostu obsługą wtyczek.

Android nie ma wirtualnego Maszyny Java i nie ma klasy ClassLoader, ale istnieje jej odpowiednik DexClassLoader, który wykonuje dokładnie tę samą funkcję, ale w odniesieniu do kodu bajtowego Dalvik (i odpowiednio plików .dex zamiast plików .class). I w przeciwieństwie do Javy na komputery stacjonarne, gdzie łatwiej jest umieścić żądany plik jar w CLASSPATH i nie zadzierać z dynamicznym ładowaniem, w Androidzie takie podejście naprawdę daje wiele korzyści, z których główną jest możliwość rozszerzenia funkcjonalności aplikacji i aktualizowane bez zauważenia przez użytkownika i bez pytania go o nic. W dowolnym momencie aplikacja może pobrać plik z klasą z serwera, pobrać, a następnie usunąć plik.

Ponadto klasy mogą być przechowywane bezpośrednio w pakiecie APK i ładowane podczas uruchamiania aplikacji. Zaletą jest to, że kod ładowanych klas zostanie oddzielony od kodu samej aplikacji i zostanie umieszczony w APK „pod niewłaściwym adresem”; narzędzia takie jak apktool, których rewerserzy uwielbiają używać, po prostu ich nie zobaczą. Z drugiej strony jest to bardziej niezawodne, ponieważ normalny rewerser szybko zorientuje się, co jest czym.

Cokolwiek to było, dynamiczne ładowanie klasy są bardzo przydatne podczas pisania aplikacji off-white, więc każdy specjalista ds. bezpieczeństwa powinien wiedzieć, jak działa ten mechanizm i jak jest używany w trojanach.

Najprostszy przykład

// Ścieżka do archiwum jar z naszą klasą String modFile = "/sdcard/myapp/module.jar"; // Ścieżka do prywatnego katalogu aplikacji String appDir = getApplicationInfo().dataDir; // Załaduj plik z dysku DexClassLoader classLoader = new DexClassLoader(modFile, appDir, null, getClass().getClassLoader()); // Załaduj klasę, utwórz obiekt i spróbuj wywołać metodę run() za pomocą odbicia try ( Class c = classLoader.loadClass("com.example.modules.simple.Module"); Method m = c.getMethod( "run", null); m.invoke(c.newInstance(), null); ) catch (Wyjątek e) ( e.printStackTrace(); )

Ogólnie wszystko jest tutaj proste: kod ładuje archiwum jar /sdcard/myapp/module.jar z naszą klasą, ładuje z niej klasę com.example.modules.simple.Module, tworzy obiekt i wywołuje run() metoda. Zwróć uwagę na trzy punkty:

  • DexClassLoader może ładować zarówno „proste” pliki .dex, jak i archiwa jar, przy czym te ostatnie są preferowane ze względu na kompresję i możliwość korzystania z podpisu cyfrowego;
  • drugim argumentem konstruktora DexClassLoader jest katalog, w którym przechowuje zoptymalizowany kod bajtowy (odex), dla uproszczenia określamy katalog prywatny samej aplikacji;
  • jako argument metody loadClass należy zawsze podać adres klasy wraz z nazwą pakietu.

Aby przetestować ten kod pod kątem działania, stwórzmy prosty moduł:

Pakiet com.example.modules.simple.Module; importuj android.util.Log; public class Module ( public void run() ( Log.d("Module", "Żyję!!!"); ) )

Nie spiesz się z tworzeniem nowy projekt w Android Studio możesz wkleić ten kod do notatnika i skompilować do archiwum jar bezpośrednio z wiersza poleceń:

Javac -classpath /path/to/sdk/platforms/android-23/android.jar Module.java /path/to/sdk/build-tools/23.0.3/dx --dex --output=module.jar Moduł. klasa

Upewnij się, że istnieją katalogi platform/android-23 i build-tools/23.0.3, w twoim przypadku ich nazwy mogą być inne.

Jeśli wszystko pójdzie gładko, powinieneś otrzymać plik module.jar. Pozostaje tylko dodać kod loadera do aplikacji, umieścić plik module.jar na karcie pamięci, zbudować i uruchomić aplikację.

Precz z refleksją

Odbicie to dobra rzecz, ale w tym przypadku tylko przeszkadza. Łatwo jest wywołać pojedynczą metodę bez argumentów, jednak jeśli chcemy, aby nasza aplikacja miała rozbudowane API modułu z wieloma metodami, które przyjmują wiele parametrów, musimy wymyślić coś wygodniejszego. Na przykład użyj wstępnie zdefiniowanego interfejsu, który zaimplementuje każdy moduł.

Stosując to podejście do powyższego przykładu, otrzymujemy następujące trzy pliki:

  1. Plik ModuleInterface.java z opisem API: pakiet com.example.modules; interfejs publiczny ModuleInterface ( public void run(); )
  2. Plik Module.java z implementacją naszego modułu: pakiet com.example.modules.simple.Module; importuj android.util.Log; public class Moduł implementuje ModuleInterface ( public void run() ( Log.d("Module", "Żyję!!!"); ) )
  3. Nowy moduł ładujący (umieść w swojej aplikacji): String modFile = "/sdcard/myapp/module.jar"; String appDir = getApplicationInfo().dataDir; DexClassLoader classLoader = new DexClassLoader(modFile, appDir, null, getClass().getClassLoader()); // Załaduj klasę i utwórz obiekt z interfejsem ModuleInterface ModuleInterface module; spróbuj (klasaclass = classLoader.loadClass("com.example.modules.simple.Module"); moduł = (Interfejs modułu) class.newInstance(); ) catch (Wyjątek e) ( e.printStackTrace(); ) module.run()

To wszystko. Teraz możemy pracować z modułem jak ze zwykłym obiektem. Co więcej, sam system odrzuca moduły (klasy) niezgodne z interfejsem na etapie ładowania, dzięki czemu nie musimy zadawać sobie pytania, czy moduł zawiera potrzebną nam metodę.

Gdy jest wiele modułów

Wymyśliliśmy jeden moduł, ale co jeśli jest ich dużo? Jak prowadzić ewidencję tych modułów i nie zgubić się wśród nich? W rzeczywistości wszystko jest proste - możesz użyć do tego hashmapy. Zmieńmy ponownie bootloader:

Nadal dostępne tylko dla członków

Opcja 1. Dołącz do społeczności „strony”, aby przeczytać wszystkie materiały na stronie

Członkostwo w społeczności w wyznaczonym okresie zapewni ci dostęp do WSZYSTKICH materiałów hakerskich, zwiększy osobistą skumulowaną zniżkę i pozwoli na zgromadzenie profesjonalnej oceny Xakep Score!

Podobał Ci się artykuł? Podziel się z przyjaciółmi!
Czy ten artykuł był pomocny?
tak
Nie
Dziekuję za odpowiedź!
Coś poszło nie tak i Twój głos nie został policzony.
Dziękuję Ci. Twoja wiadomość została wysłana
Znalazłeś błąd w tekście?
Wybierz, kliknij Ctrl+Enter a my to naprawimy!