2010-04-27 11 views
15

W Androidzie documentation w zakresie podpisywania kodu możemy przeczytać: "Podpisując wiele aplikacji za pomocą tego samego certyfikatu i korzystając z kontroli uprawnień opartych na podpisie, twoje aplikacje mogą udostępnić kod i dane w bezpieczny sposób: "Android: jak udostępniać kod pomiędzy projektami podpisanymi z tym samym certyfikatem

Jak dokładnie można dzielić takie kodowanie? Czy możliwe jest zwolnienie głównej aplikacji i wielu wymienialnych wtyczek, a następnie wykrycie ich w czasie wykonywania? Jak wygląda kod źródłowy i jakie są zalety w stosunku do "standardowych" wywołań z/do różnych pakietów APK?

Odpowiedz

9

Użyj Context.createPackageContext(), aby utworzyć instancję dla innego pliku .apk, który Cię interesuje. Jeśli jest podpisany z tym samym certyfikatem co Twój, ORAZ oboje używają tego samego identyfikatora współużytkowanego, można użyć flaga, aby załadować swój kod do procesu, umożliwiając pobranie klasy ClassLoader z kontekstu i utworzenie instancji dowolnej klasy.

W przeciwnym razie, jeśli nie są one podpisane tak samo i jawnie za pomocą tego samego udostępnionego używanego identyfikatora, można załadować tylko te zasoby.

Należy zauważyć, że nie można zmienić udostępnionego identyfikatora użytkownika dla aplikacji (na coś innego lub przechodzenie między posiadaniem i nieposiadanie wspólnego identyfikatora użytkownika) po jej wejściu na rynek.

+0

Więcej informacji: http://developer.android.com/intl/de/guide/topics/security/security.html#userid i http://developer.android.com /intl/de/guide/topics/manifest/manifest-element.html – tomash

2

Powiedzmy, że chcesz wywołać publiczną funkcję dynamicznie ładowanej klasy. Użyj następujący fragment kodu:

Context friendContext = this.createPackageContext("packageName", Context.CONTEXT_INCLUDE_CODE); 
Class friendClass = friendContext.getClassLoader().loadClass("packageName.className"); 
Class noparams[] = {}; //say the function (functionName) required no inputs 
friendClass.getMethod("functionName", noparams).invoke(friendClass.newInstance(), null);