Ich möchte das Android SDK (oder besser nur die android.jar) neu erstellen, um versteckte und interne APIs einzuschließen.
Ich konnte keine Dokumentation oder Diskussion darüber finden, wie ich vorgehen sollte. Ich habe bereits eine Ubuntu CyanogenMod-Build-Umgebung eingerichtet, die cm7 erstellen kann.
Jetzt habe ich gelesen, dass make SDK das SDK erstellt, aber ich möchte ein SDK erstellen, das Methoden und Felder enthält, die mit @hide als ausgeblendet markiert sind. Ist das möglich?
Ich möchte Änderungen an einer Anwendung vornehmen, die eine versteckte API verwendet. Um sie neu zu erstellen, möchte ich das geänderte SDK verwenden.
android
android-sdk-2.3
android-source
Thomas Hofmann
quelle
quelle
@Hidden
Bezeichnung der API entfernen, auf die Sie zugreifen möchten, dann ausführenmake update-api
undmake SDK
Ihr eigenes SDK erstellen.Antworten:
Dies ist, was ich immer tue, um versteckte API zu verwenden.
quelle
.iml
Datei des Moduls ändern und die gewünschten Bibliotheken<orderEntry>
vor das Android SDK bringen . Leider ist diese Technik nicht dauerhaft, da die Datei überschrieben wird, sobald die Gradle-Sync-Taste gedrückt wird.Ich habe einige Nachforschungen angestellt, und meine Schlussfolgerung lautet einfach: Dies kann nicht ohne viel Arbeit geschehen. Lesen Sie den Rest dieser Antwort, um Einzelheiten zu dem zu erfahren, was ich gefunden habe.
android.jar
besteht eigentlich aus der "öffentlichen API" vonframework.jar
undcore.jar
die sichsystem/frameworks/
auf dem Gerät befindet.android.jar
ist eine Art von dem, was ich als Java-Bibliotheksheader bezeichnen würde. Alle Implementierungen im eigentlichen Bytecode sind nur athrow new RuntimeException("stub");
. Dies ermöglicht es Ihnen, dagegen zu bauenandroid.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, denen die Javadoc-Annotation nicht vorangestellt ist
@{hide}
. Dh alles, was nicht kommentiert ist, ist im SDK enthalten.android.jar
wird aus den Quellen erstellt, inout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
denen sich das Tool DroidDoc befindetbuild/tools/droiddoc
.DroidDoc ist das Tool (wahrscheinlich aus Javadoc angepasst oder mithilfe von Javadoc), das die eigentliche Android SDK-Dokumentation generiert. Als Nebeneffekt und wahrscheinlich, weil es bereits alle Javadoc analysiert, spuckt es auch die Android-Stubs aus, die dann in das kompiliert werden
android.jar
im SDK verteilten .Um das verborgene Material einzuschließen, können Sie, wenn Sie nur bestimmte Teile einschließen möchten, einfach das entfernen
@hide
Anmerkung und das SDK neu erstellen.Wenn Sie jedoch alle versteckten Teile einbeziehen möchten, werden die Dinge viel komplizierter. Sie können DroidDoc ändern (die entsprechende Quelle befindet sich in
build/tools/droiddoc/src/Stubs.java
) so dass nichts als versteckt erkannt wird. Dies ist ziemlich trivial und ich habe es versucht, aber die Stubs, die dann generiert werden, werden überhaupt nicht kompiliert.Mein Fazit ist inzwischen, dass dies einfach nicht machbar ist. Die Stubs, die generiert werden, wenn Sie den Teil von DroidDoc entfernen, der versteckte Anmerkungen erkennt, sind einfach nicht kompilierbar und erfordern eine Menge Arbeit, um korrekt zu kompilieren.
Meine Antwort auf Ihre Fragen lautet also: Nein, dies kann nicht ohne viel Arbeit geschehen. Es tut uns leid.
Eine Randnotiz zum
mkstubs
Tool.mkstubs
werden verwendet, wenn Sie ein SDK-Addon erstellen , dh die Addons, die Sie im Android SDK-Manager von Anbietern finden, z. B. Samsung, das Ihnen eine zusätzliche API für Dinge bereitstellt, die für Samsung-Telefone spezifisch sind.mkstubs
Funktioniert ähnlich wie beim Generieren von DroidDoc-Stubs, verwendet jedoch keine@hide
Anmerkungen, sondern eine.defs
Datei, die beschreibt, welche Pakete / Klassen / Felder in Ihr SDK-Addon aufgenommen oder aus diesem ausgeschlossen werden sollen.Dies ist jedoch für die Frage irrelevant, da der Android SDK-Build das Tool nicht verwendet
mkstubs
. (Unglücklicherweise.)quelle
@hide
Anmerkungen, sondern "nur" eine.defs
Datei, die beschreibt, welche Pakete / Klassen / Felder in die API des Addons aufgenommen werden sollen.$(hide)
, Sie verwirren sich.$(hide)
ist einfach ein Präfix in den Makefiles, um die eigentliche Befehlszeile des ausgeführten Programms zu verbergen, nichts weiter, und es wird fast überall überall verwendet. Es hat überhaupt nichts mit dem Android SDK oder der@hide
Anmerkung im Quellcode zu tun .Wir könnten die * .jar-Dateien von der Android-Plattform rekonstruieren.
Schließen Sie zuerst ADB an Ihr Gerät an. Dann renne:
Sie
core.jar
enthalten die Standard-Java-Bibliotheken (java.*
) undframework.jar
die Android-Bibliotheken (android.*
). Dies ist noch nicht verwendbar, da die tatsächlichen Dateien im DEX-Format und nicht im JAR-Format vorliegen.Wir könnten diese DEX-formatierten * .jars mit Tools wie dex2jar in echte JARs konvertieren :
Ziehen Sie diese Gläser dann mit "Externe JARs hinzufügen ..." ein (vorausgesetzt, Sie verwenden Eclipse ADT).
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Wählen Sie dascore-dex2jar.jar
undframework-dex2jar.jar
von oben).Auf diese Weise können Sie die internen und einige Java 7-APIs verwenden. (Die generierte APK enthält, soweit ich sehen kann, keinen tatsächlichen Code aus den JARs.)
quelle
/system/framework/core.odex
,/system/framework/framework.odex
und wahrscheinlich mehr. Diese können deodexiert (java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core
) und reodexiert (java -jar smali-2.0.3.jar -x -o core.dex core
) werden, und erst danachdex2jar core.dex
erledigt es seine Aufgabe.Für Lollipop ist der Fluss etwas anders:
Holen Sie sich /system/framework/arm/boot.oat vom Lollipop-Gerät
Verwenden Sie 'java -jar oat2dex.jar boot boot.oat'
ps: wahrscheinlich musst du die Schritte 4-6 für 'framework_classes2.dex' wiederholen
quelle
DroidCon 2011
Hier erklärt Erik Hellman von Sony Ericson, wie man auf die versteckten Android-APIs zugreift:
http://vimeo.com/30180393 (Hmm-Link scheint nicht zu funktionieren).
Gehen Sie zur DroidCon-Webseite Tag 2 und scrollen Sie nach unten zu Using Hidden APIs 10:15 können Sie sie ansehen.
Links sterben!
Ich habe dieses gefunden: http://skillsmatter.com/podcast/os-mobile-server/hidden-api Keine Ahnung, wie lange es noch dauern wird
quelle
Sie können die geänderten
android.jar
APIs als versteckte APIs aus diesem Repository herunterladen . Folgen Sie dort den Anweisungen.quelle
Versuchen Sie , betrachten dies :
quelle
Ich habe einmal einige Groovy-Skripte geschrieben, um die Java-Dateien aus einem Repo-Checkout von http://source.android.com/ zu extrahieren und sie dann zu kompilieren, ohne dass eine vollständige Toolchain zum Kompilieren aller Android-Quellen erforderlich ist, einschließlich der erforderlichen anderen Schritte ( Verpackung, Erzeugung von Ressourcen usw.).
Sie finden sie hier:
https://github.com/thoutbeckers/CollectAndroid
Aber sicher muss dies für alles nach Gingerbread aktualisiert werden, hauptsächlich durch Festlegen der richtigen Verzeichnisse in "rootdirs" in der Konfigurationsdatei (CollectConfig.groovy).
Zu der Zeit habe ich dies regelmäßig für die Entwicklung verwendet, wobei alle versteckten APIs und Quellen (die zu dieser Zeit ebenfalls problematisch waren) verfügbar waren.
Wie an anderer Stelle erwähnt, wird com / android / internal / ** in neueren Versionen von ADT aufgrund der hinzugefügten Zugriffsregel weiterhin ausgeblendet.
quelle
Longs Antwort funktionierte für mich, aber mir fehlten noch einige Klassen, die ich brauchte, insbesondere android.provider.Telephony. Ich konnte es so hinzufügen:
Extrahieren Sie die Datei framework.jar
Erstellen Sie das Android-Repo, das das Verzeichnis out / target / common / obj / JAVA_LIBRARIES erstellt
Finden Sie heraus, wo die fehlenden Klassen sind
Fügen Sie die neuen Klassen hinzu und erstellen Sie die Framework-JAR-Datei neu
Oder Sie können einfach faul sein und alle Klassen in eine riesige JAR-Datei aufnehmen:
quelle
Ich kann keinen Kommentar abgeben, aber dies ist im Grunde ein Kommentar zu @ KennyTMs ( https://stackoverflow.com/a/13550030/2923406 ) ausgezeichneter Antwort:
Wenn Sie den folgenden Fehler in Eclipse haben:
(das heißt, android.internal. * ist nicht verfügbar)
Eine mögliche Lösung besteht darin, dieselbe Methode für /system/framework/framework2.jar anzuwenden. Mit dem Android Emulator für SDK19 habe ich dieses zusätzliche Glas. Auf meinem HTC One gibt es sogar ein framework3.jar.
quelle