Frage Wie erstelle ich das Android SDK mit versteckten und internen APIs?


Ich möchte das Android SDK (oder besser nur die android.jar) neu erstellen, um versteckte und interne APIs einzubinden.

Ich konnte keine Dokumentation oder Diskussion darüber finden, wie ich das anstellen könnte. Ich habe bereits eine Ubuntu CyanogenMod Build-Umgebung, die CM7 erstellen kann.

Jetzt lese ich, dass make SDK das SDK erstellt, aber ich möchte ein SDK erstellen, das Methoden und Felder enthält, die mit @hide als versteckt gekennzeichnet sind. Ist das möglich?

Was ich tun möchte, ist Änderungen an einer Anwendung, die versteckte API verwendet, und um es neu zu erstellen, möchte ich das modifizierte SDK verwenden.


76
2017-10-25 10:55


Ursprung


Antworten:


Dies ist, was ich immer mache, um versteckte API zu verwenden.

  1. Erstellen Sie die Repos oder laden Sie die Jars von https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong
  2. kopiere out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar (besser als "framework_all.jar" umbenennen)
  3. Konfigurieren Sie Ihren Projektbuildpfad -> Bibliotheken -> fügen Sie diese externen Jars hinzu. In Order und Export, verschieben Sie es und vor android.jar

61
2017-11-15 16:10



Ich habe einige Nachforschungen darüber angestellt, und meine Schlussfolgerung ist einfach: Dies ist ohne viel Arbeit nicht möglich. Lesen Sie den Rest dieser Antwort für Details zu dem, was ich gefunden habe.


android.jar besteht eigentlich aus der "public api" von framework.jar und core.jar welches in gefunden wird system/frameworks/ auf dem Gerät. android.jar ist eine Art von was ich Java-Bibliothek Header nennen würde, sind alle Implementierungen in der tatsächlichen Byte-Code nur ein throw new RuntimeException("stub");, damit können Sie gegen bauen android.jar (z. B. in Eclipse), aber die Ausführung muss auf einem Gerät oder Emulator durchgeführt werden.

Die öffentliche API des Android SDK wird durch Klassen / Methoden / Felder definiert, die Folgendes sind nicht mit dem vorangestellt @{hide} Javadoc Annotation. I.e. alles was ist nicht Kommentiert ist im SDK enthalten.

android.jar ist aus den Quellen in gebaut out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates welches selbst vom Tool generiert wird DroidDoc gelegen in build/tools/droiddoc.

DroidDoc ist das Tool (wahrscheinlich von javadoc oder javadoc angepasst), das die eigentliche Android SDK-Dokumentation generiert. Als Nebeneffekt, und wahrscheinlich, weil es bereits das ganze Javadoc analysiert, spuckt es auch die Android-Stubs aus, die dann in die android.jar welches im SDK verteilt wird.

Um die versteckten Inhalte einzubinden, können Sie, wenn Sie nur bestimmte Teile hinzufügen möchten, einfach die entfernen @hide Annotation und das SDK neu erstellen.

Wenn Sie jedoch alle versteckten Teile einschließen möchten, werden die Dinge viel komplizierter. Sie können ändern DroidDoc (Die relevante Quelle ist in build/tools/droiddoc/src/Stubs.java) so dass nichts als versteckt erkannt wird. Das ist ziemlich trivial und ich habe das versucht, aber die Stubs, die dann erzeugt werden, kompilieren überhaupt nicht.

Meine Schlussfolgerung ist, dass dies einfach nicht machbar ist. Die Stubs, die erzeugt werden, wenn Sie den Teil von DroidDoc entfernen, der verborgene Anmerkungen entdeckt, sind einfach nicht kompilierbar und würden ziemlich viel Arbeit erfordern, um korrekt zu kompilieren.

Meine Antwort auf Ihre Fragen ist also: Nein, das geht nicht, ohne viel Arbeit zu machen. Es tut uns leid.


Eine Randnotiz über die mkstubs Werkzeug. mkstubs werden verwendet, wenn Sie ein erstellen SDK-Erweiterungdie Add-Ons, die Sie im Android SDK-Manager von Anbietern finden können, z. Samsung bietet Ihnen eine zusätzliche API für Samsung Handys. mkstubs funktioniert ähnlich wie der DroidDoc-Stubs-Generierungsprozess, wird jedoch nicht verwendet @hide Anmerkungen verwendet es ein .defs Datei, die beschreibt, welche Pakete / Klassen / Felder in Ihr SDK-Addon ein- oder ausgeschlossen werden sollen.

Das ist jedoch alles egal, wie das Android SDK-Build tut nicht benutze die mkstubs Werkzeug. (Unglücklicherweise.)


39
2018-03-05 10:23



Wir konnten die * .jar-Dateien von der Android-Plattform rekonstruieren.

Verbinden Sie zuerst ADB mit Ihrem Gerät. Dann renne:

adb pull /system/framework/core.jar .
adb pull /system/framework/framework.jar .

Das core.jar enthalten die Standard-Java-Bibliotheken (java.*) und das framework.jar enthalten die Android-Bibliotheken (android.*). Dies ist noch nicht möglich, da die eigentlichen Dateien im DEX-Format und nicht im JAR-Format vorliegen.

Wir könnten diese DEX-formatierten * .jars in echte JARs konvertieren, indem wir Tools wie dex2jar:

dex2jar core.jar
dex2jar framework.jar

Dann ziehe diese Jars mit "Add External JARs ..." (vorausgesetzt du benutzt Eclipse ADT)

  • Rechtsklick auf Project → Properties → Java Build Path → Libraries → Add External JARs... → (Wählen Sie die core-dex2jar.jar und framework-dex2jar.jar von oben).

Dadurch können Sie die internen und einige Java 7-APIs verwenden. (Soweit ich sehen kann, enthält das generierte APK keinen tatsächlichen Code von den JARs.)


28
2017-11-25 10:09



Für Lollipop ist der Ablauf etwas anders:

  1. Hol dir /system/framework/arm/boot.oat vom Lollipop-Gerät

  2. Benutze 'java -jar oat2dex.jar boot boot.oat '

  3. Sie werden 2 Ordner haben: Dex und Odex. Gehe zu dex und mache 'java -jar dex2jar.jar framework.dex '
  4. Benennen Sie die resultierende framework.jar in .zip um, extrahieren und suchen Sie die benötigten Klassen
  5. Gehe zu [sdk_path] / platforms / [target_platform] und entpacke android.jar (benenne es zuerst in zip um).
  6. Kopieren Sie Dateien aus extrahiertem Framework in extrahierte android.jar. Dann komprimieren, um sie zu komprimieren und in .jar umzubenennen :)

ps: Wahrscheinlich müssen Sie die Schritte 4-6 für 'framework_classes2.dex' wiederholen


16
2018-02-22 08:08



DroidCon 2011

Hier erklärt Erik Hellman von Sony Ericson, wie man auf versteckte Android-APIs zugreift:

http://vimeo.com/30180393 (Hmm Link scheint nicht zu funktionieren).

Gehe zum DroidCon Webseite Tag 2 scrollen Sie nach unten Versteckte APIs verwenden 10:15 und du kannst es dort sehen.

Links sterben!

Ich habe dieses gefunden: http://skillsmatter.com/podcast/os-mobile-server/hidden-api Weiß nicht, wie lange es dauern wird

Die offiziellen APIs im Android SDK reichen normalerweise für die meisten normalen Anwendungen aus. Es gibt jedoch manchmal Situationen, in denen ein Entwickler Zugriff auf die internen Systemdienste, APIs und Ressourcen benötigt, die nicht in den offiziellen APIs veröffentlicht sind. Glücklicherweise sind diese APIs immer noch durch einige clevere Tricks verfügbar und können oft nützlich sein, wenn Sie eine neue und innovative Lösung zusätzlich zu Android entwickeln. In dieser Sitzung erfahren Sie, wie Sie auf diese versteckten und geschützten APIs zugreifen und diese verwenden, sowie die Einschränkungen ihrer Verwendung und einige Tipps, wie Sie diese sicher und über mehrere Geräte und Android-Versionen hinweg verwenden können. Das Publikum wird mehrere erweiterte Demos sehen, die normalerweise mit Android nicht möglich sind. Erwarten Sie eine ziemlich fortgeschrittene Sitzung mit vielen Einblicken in die Interna der Android-Plattform.


15
2017-10-25 11:37



Versuchen Sie sich anzuschauen Dies:

Das ultimative Ziel dieser Artikel besteht darin, Entwicklern die Leistung von internen und versteckten APIs ohne Reflektion zu geben. Wenn Sie alle in den nächsten Teilen beschriebenen Schritte ausgeführt haben, können Sie sie verwenden Intern und Versteckt APIs als wären sie öffentlich offene APIs. Es wird keine Reflexion nötig sein.

Wenn Sie diese nicht öffentlichen APIs verwenden, sollten Sie jedoch beachten, dass Ihre Anwendung einem hohen Risiko ausgesetzt ist. Grundsätzlich gibt es keine Garantie dafür, dass APIs beim nächsten Update auf Android OS nicht beschädigt werden. Es gibt sogar keine Garantie für konsistentes Verhalten auf Geräten verschiedener Hersteller. Du bist komplett alleine.

Es gibt drei Szenarien, denen Sie folgen können:

  1. Aktivieren Sie beide intern und versteckt APIs (Szenario A)
  2. Nur aktivieren versteckt API (Szenario B)
  3. Nur aktivieren intern API (Szenario C)

Szenario A ist eine Summe aus B und C. Szenario B ist das einfachste (erfordert keine Änderungen am Eclipse-ADT-Plugin).

Szenario A: Teile lesen 1, 2, 3, 4, 5

Szenario B: Teile lesen 1, 2, 3, 5

Szenario C: Teile lesen 1, 2, 3, 4, 5


12
2017-11-10 18:18



Sie können das modifizierte herunterladen android.jar als versteckte APIs verwendet werden dieses Repository. Folgen Sie den Anweisungen dort.


5
2017-09-17 08:50



Ich habe mal ein paar Groovy-Skripte zum Extrahieren der Java-Dateien aus einem Repo-Checkout geschrieben http://source.android.com/ und dann kompilieren sie ohne die Notwendigkeit für eine vollständige Toolchain zum Kompilieren aller Android-Quellen, einschließlich der erforderlichen anderen Schritte (Verpackung, Erzeugung von Ressourcen usw.).

Sie können hier gefunden werden:

https://github.com/thoutbecbers/CollectAndroid

Aber sicher Dies muss für alles nach Gingerbread aktualisiert werden, meistens indem die richtigen Verzeichnisse in "rootdirs" in der Konfigurationsdatei (CollectConfig.groovy) gesetzt werden.

Zu der Zeit nutzte ich dies regelmäßig für die Entwicklung mit allen versteckten APIs und Quellen (auch zu der Zeit problematisch).

Wie bereits an anderer Stelle erwähnt, ist com / android / internal / ** in den letzten Versionen von ADT aufgrund der Zugriffsregel weiterhin versteckt.


1
2017-09-18 11:29