Je souhaite reconstruire le SDK Android (ou plutôt uniquement le fichier android.jar) pour inclure des API cachées et internes.
Je n'ai trouvé aucune documentation ou discussion sur la manière de procéder. J'ai un environnement de construction Ubuntu CyanogenMod déjà configuré qui est capable de construire cm7.
Maintenant, j'ai lu que make SDK construira le SDK mais je souhaite créer un SDK qui inclut des méthodes et des champs marqués comme masqués à l'aide de @hide. Est-ce possible?
Ce que je veux faire, c'est apporter des modifications à une application qui utilise une API cachée et afin de la reconstruire, je voudrais utiliser le SDK modifié.
android
android-sdk-2.3
android-source
Thomas Hofmann
la source
la source
@Hidden
étiquette de l'API à laquelle vous souhaitez accéder, puis exécutermake update-api
etmake SDK
créer votre propre SDK.Réponses:
C'est ce que je fais toujours pour utiliser les API cachées.
la source
.iml
fichier du module et amener les bibliothèques souhaitées<orderEntry>
avant le SDK Android . Malheureusement, cette technique n'est pas persistante car le fichier sera écrasé une fois que le bouton gradle-sync est enfoncé.J'ai fait quelques recherches à ce sujet et ma conclusion est simplement la suivante: cela ne peut se faire sans pas mal de travail. Lisez le reste de cette réponse pour plus de détails sur ce que j'ai trouvé.
android.jar
est en fait composé de l '"api publique" deframework.jar
etcore.jar
qui se trouvesystem/frameworks/
sur l'appareil.android.jar
est une sorte de ce que j'appellerais l'en-tête de la bibliothèque Java, toutes les implémentations dans le code d'octet réel sont juste unthrow new RuntimeException("stub");
, cela vous permet de construire contreandroid.jar
(par exemple dans Eclipse), mais l'exécution doit être effectuée sur un périphérique ou un émulateur.L'API publique du SDK Android est définie par des classes / méthodes / champs qui ne sont pas précédés de l'
@{hide}
annotation javadoc. C'est-à-dire que tout ce qui n'est pas annoté est inclus dans le SDK.android.jar
est construit à partir des sources situées dansout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
lesquelles elle-même est générée par l'outil DroidDoc situé dansbuild/tools/droiddoc
.DroidDoc est l'outil (probablement adapté de javadoc ou utilisant javadoc) qui génère la documentation du SDK Android. En tant qu'effet secondaire, et probablement parce qu'il analyse déjà tout le javadoc, il crache également les stubs Android qui sont ensuite compilés dans le
android.jar
qui est distribué dans le SDK.Donc, pour inclure les éléments cachés, vous pouvez, si vous ne souhaitez inclure que des parties spécifiques, supprimez simplement l'
@hide
annotation et reconstruisez le SDK.Cependant, si vous souhaitez inclure toutes les parties cachées, les choses deviennent beaucoup plus compliquées. Vous pouvez modifier DroidDoc (la source appropriée est dans
build/tools/droiddoc/src/Stubs.java
) de sorte que rien ne soit détecté comme caché. C'est assez trivial et j'ai essayé cela, mais les stubs qui sont ensuite générés ne se compilent pas du tout.Ma conclusion à présent est que ce n’est tout simplement pas possible. Les stubs générés si vous supprimez la partie de DroidDoc qui détecte les annotations cachées, ne sont tout simplement pas compilables et nécessiteraient un peu de travail pour se compiler correctement.
Ma réponse à vos questions est donc: non, cela ne peut pas être fait sans beaucoup de travail. Pardon.
Une note latérale sur l'
mkstubs
outil.mkstubs
sont utilisés lorsque vous construisez un module complémentaire SDK , c'est-à-dire les modules complémentaires que vous pouvez trouver dans le gestionnaire Android SDK des fournisseurs, par exemple Samsung qui vous fournit une API supplémentaire pour des éléments spécifiques aux téléphones Samsung.mkstubs
fait à peu près la même chose que le processus de génération de stubs DroidDoc, mais il n'utilise pas d'@hide
annotations, il utilise un.defs
fichier décrivant les packages / classes / champs à inclure ou à exclure de votre addon SDK.Cependant, tout cela n'a aucun rapport avec la question, car la version du SDK Android n'utilise pas l'
mkstubs
outil. (Malheureusement.)la source
@hide
annotations, il utilise "juste" un.defs
fichier décrivant les packages / classes / champs à inclure dans l'API de l'addon.$(hide)
, vous vous confondez.$(hide)
est simplement un préfixe dans les makefiles pour masquer la ligne de commande réelle du programme en cours d'exécution, rien de plus, et il est utilisé un peu partout partout. Cela n'a rien à voir avec le SDK Android ou l'@hide
annotation dans le code source.Nous pourrions reconstruire les fichiers * .jar à partir de la plate-forme Android.
Tout d'abord, connectez ADB à votre appareil. Puis exécutez:
adb pull /system/framework/core.jar . adb pull /system/framework/framework.jar .
Le
core.jar
contient les bibliothèques Java standard (java.*
) et leframework.jar
contient les bibliothèques Android (android.*
). Ce n'est pas encore utilisable, car les fichiers réels sont au format DEX et non au format JAR.Nous pourrions convertir ces * .jars au format DEX en vrais JAR à l'aide d'outils tels que dex2jar :
dex2jar core.jar dex2jar framework.jar
Ensuite, récupérez ces fichiers en utilisant "Ajouter des fichiers JAR externes ..." (en supposant que vous utilisez Eclipse ADT)
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Choisissez lecore-dex2jar.jar
etframework-dex2jar.jar
d'en haut).Cela vous permettra d'utiliser les API internes et certaines API Java 7. (D'après ce que je peux voir, l'APK généré ne contient aucun code réel des JAR.)
la source
/system/framework/core.odex
,/system/framework/framework.odex
et probablement plus. Ceux-ci peuvent être déodexés (java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core
) et réodexés (java -jar smali-2.0.3.jar -x -o core.dex core
), et seulement après celadex2jar core.dex
fait son travail.Pour Lollipop, le flux est un peu différent:
Obtenez /system/framework/arm/boot.oat à partir de l'appareil Lollipop
Utilisez 'java -jar oat2dex.jar boot boot.oat'
ps: vous devez probablement répéter les étapes 4 à 6 pour 'framework_classes2.dex'
la source
Vous pouvez télécharger les modifications
android.jar
à utiliser comme API masquées à partir de ce référentiel . Suivez les instructions.la source
DroidCon 2011
Ici, Erik Hellman de Sony Ericson explique comment accéder aux API Android cachées:
http://vimeo.com/30180393 (le lien Hmm ne semble pas fonctionner).
Aller à la page web droidcon Jour 2 défiler vers le bas à l' aide des API cachés 10h15 et vous pouvez le regarder là - bas.
Les liens meurent!
J'ai trouvé celui-ci: http://skillsmatter.com/podcast/os-mobile-server/hidden-api je ne sais pas combien de temps il sera en place
la source
Essayez de regarder ceci :
la source
Une fois, j'ai écrit des scripts Groovy pour extraire les fichiers java d'une extraction de dépôt à partir de http://source.android.com/ , puis les compiler sans avoir besoin d'une chaîne d'outils complète pour compiler toutes les sources Android, y compris les autres étapes nécessaires ( emballage, génération de ressources, etc.).
Ils peuvent être trouvés ici:
https://github.com/thoutbeckers/CollectAndroid
Mais pour sûr, cela nécessitera une mise à jour pour tout ce qui suit Gingerbread, principalement en définissant les bons répertoires dans "rootdirs" dans le fichier de configuration (CollectConfig.groovy).
À l'époque, je l'utilisais régulièrement pour le développement avec toutes les API et sources cachées (également problématiques à l'époque) disponibles.
Comme mentionné ailleurs, com / android / internal / ** sera toujours masqué dans les versions récentes d'ADT en raison de la règle d'accès ajoutée.
la source
La réponse de Long a fonctionné pour moi, mais il me manquait encore certaines classes dont j'avais besoin, en particulier android.provider.Telephony. J'ai pu l'ajouter comme ceci:
Extrayez le fichier framework.jar
mkdir /tmp/framework cp framework.jar /tmp cd /tmp/framework jar xvf ../framework.jar mv android classes
Construisez le référentiel Android, qui créera le répertoire out / target / common / obj / JAVA_LIBRARIES
Trouvez où se trouvent les classes manquantes
$ 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
Ajoutez les nouvelles classes et reconstruisez le fichier JAR du framework
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 .
Ou vous pouvez simplement être paresseux et inclure toutes les classes dans un fichier jar géant:
cd /tmp/framework cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes . cd classes jar cvf ../framework.jar .
la source
Je ne peux pas faire de commentaire mais c'est essentiellement un commentaire à l' excellente réponse de @ KennyTM ( https://stackoverflow.com/a/13550030/2923406 ):
Si vous vous trouvez avec l'erreur suivante dans Eclipse:
The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class files
(autrement dit, android.internal. * n'est pas disponible)
Ensuite, une solution possible est d'appliquer la même méthode pour /system/framework/framework2.jar. En utilisant l'émulateur Android pour SDK19, j'ai ce fichier jar supplémentaire. Sur mon HTC One, il y a même un framework3.jar.
la source