Chcę przebudować Android SDK (a raczej tylko android.jar), aby zawierał ukryte i wewnętrzne interfejsy API.
Nie mogłem znaleźć żadnej dokumentacji ani dyskusji, jak się do tego zabrać. Mam już skonfigurowane środowisko kompilacji Ubuntu CyanogenMod, które jest w stanie zbudować cm7.
Teraz czytałem, że make SDK zbuduje SDK, ale chcę zbudować SDK, który zawiera metody i pola, które są oznaczone jako ukryte za pomocą @hide. czy to możliwe?
To, co chcę zrobić, to wprowadzić zmiany w aplikacji, która korzysta z ukrytego API i aby ją przebudować, chciałbym użyć zmodyfikowanego SDK.
android
android-sdk-2.3
android-source
Thomas Hofmann
źródło
źródło
@Hidden
etykietę API, do którego chcesz uzyskać dostęp, a następnie wykonaćmake update-api
imake SDK
zbudować własny SDK.Odpowiedzi:
To jest to, co zawsze robię, aby używać ukrytego interfejsu API.
źródło
.iml
plik modułu i wprowadzić żądane biblioteki<orderEntry>
przed Android SDK . Niestety ta technika nie jest trwała, ponieważ plik zostanie nadpisany po naciśnięciu przycisku synchronizacji gradle.Zbadałem to trochę i mój wniosek jest prosty: nie da się tego zrobić bez dużej ilości pracy. Przeczytaj resztę tej odpowiedzi, aby uzyskać szczegółowe informacje na temat tego, co znalazłem.
android.jar
w rzeczywistości składa się z „publicznego interfejsu API” programuframework.jar
icore.jar
znajduje się wsystem/frameworks/
urządzeniu.android.jar
jest rodzajem tego, co nazwałbym nagłówkiem biblioteki Java, wszystkie implementacje w rzeczywistym kodzie bajtowym są po prostu athrow new RuntimeException("stub");
, to pozwala na kompilacjęandroid.jar
(np. w Eclipse), ale wykonanie musi być wykonane na urządzeniu lub emulatorze.Publiczny interfejs API zestawu Android SDK jest definiowany przez klasy / metody / pola, które nie są poprzedzone
@{hide}
adnotacją javadoc. To znaczy wszystko, co nie jest opisane, jest zawarte w SDK.android.jar
jest zbudowany ze źródeł, wout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
których sam jest generowany przez narzędzie DroidDoc znajdujące się wbuild/tools/droiddoc
.DroidDoc to narzędzie (prawdopodobnie zaadaptowane z javadoc lub używające javadoc), które generuje rzeczywistą dokumentację Android SDK. Jako efekt uboczny i prawdopodobnie dlatego, że już analizuje cały javadoc, wypluwa również kody pośredniczące Androida, które są następnie kompilowane do tego,
android.jar
który jest dystrybuowany w SDK.Aby uwzględnić ukryte elementy, możesz, jeśli chcesz uwzględnić tylko określone części, po prostu usuń
@hide
adnotację i przebuduj SDK.Jeśli jednak chcesz uwzględnić wszystkie ukryte części, sprawy stają się znacznie bardziej skomplikowane. Możesz zmodyfikować DroidDoc (odpowiednie źródło jest w
build/tools/droiddoc/src/Stubs.java
) tak, aby nic nie było wykrywane jako ukryte. Jest to dość trywialne i próbowałem tego, jednak generowane wówczas kody pośredniczące w ogóle się nie kompilują.Mój wniosek jest teraz taki, że jest to po prostu niewykonalne. Stopy wygenerowane po usunięciu części DroidDoc, która wykrywa ukryte adnotacje, są po prostu niekompilowalne i wymagałyby sporo pracy, aby je poprawnie skompilować.
Tak więc moja odpowiedź na Twoje pytania brzmi: Nie, nie da się tego zrobić bez dużego nakładu pracy. Przepraszam.
Dodatkowa uwaga na temat
mkstubs
narzędzia.mkstubs
są używane podczas budowania dodatku SDK , czyli dodatków, które można znaleźć w menedżerze Android SDK od dostawców, np. Samsunga udostępniającego dodatkowe API dla rzeczy specyficznych dla telefonów Samsung.mkstubs
robi to samo, co proces generowania kodów pośredniczących w DroidDoc, jednak nie używa@hide
adnotacji, używa.defs
pliku opisującego, które pakiety / klasy / pola należy uwzględnić lub wykluczyć z dodatku SDK.Jednak to wszystko nie ma znaczenia dla pytania, ponieważ kompilacja Android SDK nie korzysta z tego
mkstubs
narzędzia. (Niestety.)źródło
@hide
adnotacji, a "po prostu" używa.defs
pliku opisującego, które pakiety / klasy / pola mają być zawarte w API dodatku.$(hide)
, mylisz się.$(hide)
jest po prostu prefiksem w plikach makefile, który ukrywa linię poleceń wykonywanego programu, nic więcej, i jest używany prawie wszędzie. Nie ma to nic wspólnego z Android SDK ani@hide
adnotacją w kodzie źródłowym.Mogliśmy zrekonstruować pliki * .jar z platformy Android.
Najpierw podłącz ADB do swojego urządzenia. Następnie uruchomić:
adb pull /system/framework/core.jar . adb pull /system/framework/framework.jar .
core.jar
Zawierać standardowe biblioteki Java (java.*
) iframework.jar
zawierają biblioteki Androida (android.*
). Nie można tego jeszcze używać, ponieważ rzeczywiste pliki są w formacie DEX, a nie w formacie JAR.Moglibyśmy przekonwertować te * .jary w formacie DEX na prawdziwe pliki JAR przy użyciu narzędzi takich jak dex2jar :
dex2jar core.jar dex2jar framework.jar
Następnie ściągnij te słoiki za pomocą „Dodaj zewnętrzne pliki JAR ...” (zakładając, że używasz Eclipse ADT)
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Wybierzcore-dex2jar.jar
izframework-dex2jar.jar
góry).Umożliwi to korzystanie z wewnętrznego i niektórych interfejsów API Java 7. (Wygenerowany plik APK, o ile widzę, nie zawiera żadnego rzeczywistego kodu z plików JAR).
źródło
/system/framework/core.odex
,/system/framework/framework.odex
i prawdopodobnie więcej. Można je deodexed (java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core
) i reodexed (java -jar smali-2.0.3.jar -x -o core.dex core
), a dopiero potemdex2jar core.dex
wykonuje swoje zadanie.W przypadku Lollipopa przepływ jest nieco inny:
Pobierz /system/framework/arm/boot.oat z urządzenia Lollipop
Użyj 'java -jar oat2dex.jar boot boot.oat”
ps: prawdopodobnie musisz powtórzyć kroki 4-6 dla 'framework_classes2.dex'
źródło
Możesz pobrać zmodyfikowane
android.jar
do użycia jako ukryte API z tego repozytorium . Postępuj zgodnie z instrukcjami.źródło
DroidCon 2011
Tutaj Erik Hellman z Sony Ericson wyjaśnia, jak uzyskać dostęp do ukrytych interfejsów API systemu Android:
http://vimeo.com/30180393 (Hmm link nie wydaje się działać).
Przejdź do strony internetowej DroidCon Dzień 2 przewiń w dół do sekcji Używanie ukrytych interfejsów API 10:15 i możesz ją tam obejrzeć.
Linki umierają!
Znalazłem ten: http://skillsmatter.com/podcast/os-mobile-server/hidden-api nie wiem, jak długo to będzie działać
źródło
Spójrz na to :
źródło
Kiedyś napisałem kilka skryptów Groovy do wyodrębniania plików java z kasy repozytorium ze strony http://source.android.com/ a następnie kompilowania ich bez konieczności posiadania pełnego zestawu narzędzi do kompilacji wszystkich źródeł Androida, w tym potrzebnych innych kroków ( pakowanie, generowanie zasobów itp.).
Można je znaleźć tutaj:
https://github.com/thoutbeckers/CollectAndroid
Ale na pewno będzie to wymagało aktualizacji dla czegokolwiek po Gingerbread, głównie poprzez ustawienie właściwych katalogów w "rootdirs" w pliku konfiguracyjnym (CollectConfig.groovy).
W tamtym czasie regularnie używałem tego do programowania z wszystkimi dostępnymi ukrytymi API i źródłami (również problematycznymi w tym czasie).
Jak wspomniano w innym miejscu, com / android / internal / ** nadal będzie ukryty w ostatnich wersjach ADT z powodu zastosowanej reguły dostępu.
źródło
Odpowiedź Longa działała dla mnie, ale nadal brakowało mi niektórych zajęć, których potrzebowałem, w szczególności android.provider.Telephony. Udało mi się to dodać tak:
Wyodrębnij plik framework.jar
mkdir /tmp/framework cp framework.jar /tmp cd /tmp/framework jar xvf ../framework.jar mv android classes
Zbuduj repozytorium Androida, które utworzy katalog out / target / common / obj / JAVA_LIBRARIES
Dowiedz się, gdzie są brakujące klasy
$ cd /path/to/out/target/common/obj/JAVA_LIBRARIES $ find . | grep "/Telephony.class" ./telephony-common_intermediates/classes/android/provider/Telephony.class ./android_stubs_current_intermediates/classes/android/provider/Telephony.class
Dodaj nowe klasy i odbuduj plik JAR struktury
cd /tmp/framework cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes . cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/classes . cd classes jar cvf ../framework.jar .
Lub możesz po prostu być leniwy i dołączyć wszystkie klasy do jednego gigantycznego pliku jar:
cd /tmp/framework cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes . cd classes jar cvf ../framework.jar .
źródło
Nie mogę komentować, ale jest to w zasadzie komentarz do @ KennyTM's ( https://stackoverflow.com/a/13550030/2923406 doskonałej odpowiedzi ):
Jeśli napotkasz następujący błąd w Eclipse:
The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class files
(to znaczy, android.internal. * nie jest dostępny)
Wtedy jednym możliwym rozwiązaniem jest zastosowanie tej samej metody dla /system/framework/framework2.jar. Używając emulatora Androida dla SDK19 mam ten dodatkowy słoik. Na moim HTC One jest nawet plik framework3.jar.
źródło