Quiero reconstruir el SDK de Android (o más bien solo el android.jar) para incluir API ocultas e internas.
No pude encontrar ninguna documentación o discusión sobre cómo hacer esto. Tengo un entorno de compilación Ubuntu CyanogenMod ya configurado que puede compilar cm7.
Ahora, leí que make SDK creará el SDK, pero quiero crear un SDK que incluya métodos y campos marcados como ocultos con @hide. es posible?
Lo que quiero hacer es realizar cambios en una aplicación que usa una API oculta y para reconstruirla me gustaría usar el SDK modificado.
android
android-sdk-2.3
android-source
Thomas Hofmann
fuente
fuente
@Hidden
etiqueta de la API a la que desea acceder, luego ejecutarmake update-api
ymake SDK
construir su propio SDK.Respuestas:
Esto es lo que siempre hago para usar una API oculta.
fuente
.iml
archivo del módulo y traer las bibliotecas deseadas<orderEntry>
antes del SDK de Android . Desafortunadamente, esta técnica no es persistente ya que el archivo se sobrescribirá una vez que se presione el botón Gradle-Sync.He investigado un poco sobre esto y mi conclusión es sencilla: esto no se puede hacer sin bastante trabajo. Lea el resto de esta respuesta para obtener detalles sobre lo que he encontrado.
android.jar
en realidad está compuesto por la "API pública" deframework.jar
ycore.jar
que se encuentra ensystem/frameworks/
el dispositivo.android.jar
es una especie de lo que yo llamaría el encabezado de la biblioteca de Java, todas las implementaciones en el código de bytes real son solo unathrow new RuntimeException("stub");
, esto le permite construir contraandroid.jar
(por ejemplo, en Eclipse), pero la ejecución debe realizarse en un dispositivo o emulador.La API pública del SDK de Android se define mediante clases / métodos / campos que no tienen como prefijo la
@{hide}
anotación javadoc. Es decir todo lo que no es anotado está incluido en el SDK.android.jar
se construye a partir de las fuentes ubicadas en lasout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
que se genera la herramienta DroidDoc ubicada enbuild/tools/droiddoc
.DroidDoc es la herramienta (probablemente adaptada de javadoc o usando javadoc) que genera la documentación real del SDK de Android. Como efecto secundario, y probablemente porque ya está analizando todo el javadoc, también arroja los stubs de Android que luego se compilan en el
android.jar
que se distribuye en el SDK.Entonces, para incluir las cosas que están ocultas, podría, si solo desea incluir partes específicas, simplemente elimine el
@hide
anotación y reconstruya el SDK.Sin embargo, si desea incluir todas las partes ocultas, las cosas se complican mucho más. Puede modificar DroidDoc (la fuente relevante está en
build/tools/droiddoc/src/Stubs.java
) de modo que no se detecte nada como oculto. Esto es bastante trivial y lo he intentado, sin embargo, los stubs que luego se generan no se compilan en absoluto.Mi conclusión a estas alturas es que esto simplemente no es factible. Los stubs generados si elimina la parte de DroidDoc que detecta anotaciones ocultas, simplemente no son compilables y requerirían bastante trabajo para compilarse correctamente.
Entonces, mi respuesta a sus preguntas es: No, esto no se puede hacer sin hacer mucho trabajo. Lo siento.
Una nota al margen sobre la
mkstubs
herramienta.mkstubs
se utilizan cuando crea un complemento de SDK , es decir, los complementos que puede encontrar en el administrador de SDK de Android de los proveedores, por ejemplo, Samsung le proporciona una API adicional para cosas específicas de los teléfonos Samsung.mkstubs
hace lo mismo que el proceso de generación de stubs de DroidDoc, sin embargo, no usa@hide
anotaciones, usa un.defs
archivo que describe qué paquetes / clases / campos incluir o excluir de su complemento SDK.Sin embargo, todo esto es irrelevante para la pregunta, ya que la compilación del SDK de Android no usa la
mkstubs
herramienta. (Desafortunadamente.)fuente
@hide
anotaciones, "simplemente" usa un.defs
archivo que describe qué paquetes / clases / campos se incluirán en la API del complemento.$(hide)
, te estás confundiendo.$(hide)
es simplemente un prefijo en los archivos MAKE para ocultar la línea de comandos real del programa que se está ejecutando, nada más, y se usa en casi todas partes. No tiene nada que ver con el SDK de Android o la@hide
anotación en el código fuente.Podríamos reconstruir los archivos * .jar desde la plataforma Android.
Primero, conecte ADB a su dispositivo. Entonces corre:
adb pull /system/framework/core.jar . adb pull /system/framework/framework.jar .
El
core.jar
contienen las bibliotecas estándar de Java (java.*
) y laframework.jar
contienen las bibliotecas Android (android.*
). Esto aún no se puede utilizar, ya que los archivos reales están en formato DEX, no en formato JAR.Podríamos convertir estos archivos * .jar con formato DEX en archivos JAR reales utilizando herramientas como dex2jar :
dex2jar core.jar dex2jar framework.jar
Luego, extraiga estos frascos con "Agregar archivos JAR externos ..." (suponiendo que esté usando Eclipse ADT)
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Elijacore-dex2jar.jar
yframework-dex2jar.jar
desde arriba).Esto le permitirá utilizar la API interna y algunas API de Java 7. (El APK generado, por lo que puedo ver, no contiene ningún código real de los JAR).
fuente
/system/framework/core.odex
,/system/framework/framework.odex
y probablemente más. Estos pueden ser deodexados (java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core
) y reodexados (java -jar smali-2.0.3.jar -x -o core.dex core
), y solo después de esodex2jar core.dex
hace su trabajo.Para Lollipop, el flujo es un poco diferente:
Obtenga /system/framework/arm/boot.oat desde el dispositivo lollipop
Utilice 'java -jar oat2dex.jar boot boot.oat'
ps: probablemente necesite repetir los pasos 4-6 para 'framework_classes2.dex'
fuente
Puede descargar la versión modificada
android.jar
para usarla como API oculta desde este repositorio . Siga las instrucciones allí.fuente
DroidCon 2011
Aquí Erik Hellman de Sony Ericson explica cómo acceder a las API ocultas de Android:
http://vimeo.com/30180393 (Hmm, el enlace no parece funcionar).
Ir a la Droidcon página web Día 2 abajo desplazarse a Utilización de las API Ocultos 10:15 y se puede ver allí.
¡Los enlaces están muriendo!
Encontré este: http://skillsmatter.com/podcast/os-mobile-server/hidden-api no sé cuánto tiempo estará activo
fuente
Intenta mirar esto :
fuente
Una vez escribí algunos scripts Groovy para extraer los archivos java de un pago de repositorio de http://source.android.com/ y luego compilarlos sin la necesidad de una cadena de herramientas completa para compilar todas las fuentes de Android, incluidos los otros pasos necesarios ( embalaje, generación de recursos, etc.).
Pueden ser encontrados aquí:
https://github.com/thoutbeckers/CollectAndroid
Pero seguro que será necesario actualizarlo para cualquier cosa posterior a Gingerbread, principalmente configurando los directorios correctos en "rootdirs" en el archivo de configuración (CollectConfig.groovy).
En ese momento, usé esto regularmente para el desarrollo con todas las API y fuentes ocultas (también problemáticas en ese momento) disponibles.
Como se mencionó en otra parte, com / android / internal / ** todavía estará oculto en las versiones recientes de ADT debido a la regla de acceso agregada.
fuente
La respuesta de Long funcionó para mí, pero todavía me faltaban algunas clases que necesitaba, en particular android.provider.Telephony. Pude agregarlo así:
Extraiga el archivo framework.jar
mkdir /tmp/framework cp framework.jar /tmp cd /tmp/framework jar xvf ../framework.jar mv android classes
Construya el repositorio de Android, que creará el directorio out / target / common / obj / JAVA_LIBRARIES
Encuentra dónde están las clases que faltan
$ 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
Agregue las nuevas clases y reconstruya el archivo JAR del marco
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 .
O simplemente puede ser perezoso e incluir todas las clases en un archivo jar gigante:
cd /tmp/framework cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes . cd classes jar cvf ../framework.jar .
fuente
No puedo comentar, pero esto es básicamente un comentario para la excelente respuesta de @ KennyTM ( https://stackoverflow.com/a/13550030/2923406 ):
Si se encuentra con el siguiente error en Eclipse:
The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class files
(es decir, android.internal. * no está disponible)
Entonces, una posible solución es aplicar el mismo método para /system/framework/framework2.jar. Usando el emulador de Android para SDK19 tengo este frasco adicional. En mi HTC One hay incluso un framework3.jar.
fuente