3 votos

¿Puedo hacer un ZIP flashable que contenga uno o más APKs?

¿Es posible hacer un ZIP que se pueda flashear en un dispositivo para añadir un paquete de aplicaciones ( .apk archivos) a la /system/app de forma que pueda ser flasheado después del sistema operativo (por ejemplo, CyanogenMod) de forma similar a otros paquetes como OpenGApps ?

He visto cosas como la aplicación ZipMe pero realmente me gustaría hacer esto en Linux donde tengo los archivos apk deseados en un directorio. Me gustaría hacer esto a mano si es posible para que pueda entender el contenido del ZIP.

7voto

starfry Puntos 178

Este ejemplo simplificado se inspira en este hilo de xda-developers .

Es práctico utilizar adb pero no es necesario.

Obtenga una herramienta de firma Java y claves

Su ZIP empaquetado necesita ser firmado. Si tienes una herramienta de firma de Java, genial. Si no, puedes consultar las fuentes de Google para signapk o descargue un signapk.jar de aquí o aquí .

Este último también contiene ejemplos de claves de firma que puede utilizar, pero puede hazlo tú mismo con OpenSSL:

$ openssl genrsa -out key.pem 1024
$ openssl req -new -key key.pem -out request.pem
$ openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
$ openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt

La siguiente discusión asume que usted tiene un signapk directorio que contiene signapk.jar , clave privada key.pk8 y certificado certificate.pem (que contiene la clave pública correspondiente).

Preparar el contenido del ZIP

Cree un directorio de trabajo (el nombre es irrelevante):

$ mkdir apkzip
$ cd apkzip

Crear la estructura necesaria

$ mkdir -p META-INF/com/google/android system/app

El siguiente paso es crear un archivo llamado updater-script que contiene un script escrito en algo llamado edificar . A continuación se muestra un sencillo script que cumple con este requisito:

# META-INF/com/google/android/updater-script
mount("MTD", "system", "/dev/block/platform/mtk-msdc.0/by-name/system", "/system");
package_extract_dir("system", "/system");
unmount("/system");

El tercer parámetro de mount es la ruta del dispositivo de bloque para el system partición. Puede (opcionalmente) verificar esto con:

$ adb shell grep system /proc/mounts
/dev/block/platform/mtk-msdc.0/by-name/system /system ext4 ...

Puedes adornar el updater-script con comentarios y barras de progreso, como lo demuestran muchos ejemplos en la web, pero no es necesario.

También es necesario proporcionar el intérprete para el script que es un archivo llamado update-binary que puedes obtener de cualquier rom que estés usando, como CyanogenMod o ResurrectionRemix. Encuéntralo en el archivo Zip de la ROM en la ubicación META-INF/com/google/android/update-binary y copiarlo en el árbol de directorios de trabajo en una ubicación similar y junto al updater-script creado en el paso anterior.

Por último, copie en el .apk archivos que desea en su ZIP. Tienen que ir en directorios individuales como system/app/<app-name>/<apk-file> donde <appName> es un directorio con el nombre de la aplicación (no creo que el nombre sea relevante) y <apk-file> es el .apk archivo. Debería haber un .apk archivo por directorio.

Su jerarquía de archivos debería tener ahora un aspecto similar al siguiente:

./META-INF/com/google/android/updater-script
./META-INF/com/google/android/update-binary
./system/app/SomeApp/com.some.app.apk
./system/app/SomeOtherApp/com.some.other.app.apk

Crear y firmar el ZIP

Ahora crea el ZIP firmado (el -r recorre los subdirectorios):

$ zip -r /tmp/apps.zip *
$ cd ../signapk
$ java -jar signapk.jar certificate.pem key.pk8 /tmp/apps.zip apps.zip

Aplica el ZIP a tu dispositivo

Empuje el ZIP firmado (el apps.zip creado en la corriente ( signapk ) al dispositivo, elija una ubicación que su recuperación pueda ver:

$ adb push apps.zip /mnt/media_rw/sdcard1/

(No es necesario utilizar adb - puede utilizar otro método, como colocar la tarjeta SD en el ordenador, etc.).

Ahora reinicia al recovery y flashea o, en el caso de un bootloader bloqueado, usa FlashFire o cualquier otro método preferido para tu dispositivo.

Otras notas

Puedes leer más sobre Edify:

Puede ser posible sustituir update-binary con un shell script. Un ejemplo de esto se puede ver en el OpenGApps ZIP, pero no lo he probado.

Lo anterior funciona siempre que las aplicaciones no tengan bibliotecas nativas. Si las tienen, hay que extraerlas manualmente del .apk (que a su vez es un archivo ZIP) /lib y colocado en el directorio /system/vendor/lib además de colocar el paquete en /system/app/... .

Como comenta @DeathMaskSalesman, la firma no es requerida por TWRP, CWM o FlashFire así que puedes saltarte los pasos de la firma si lo prefieres.

He producido una utilidad que funciona en Linux o Android. Obtenga apkzip aquí .

1 votos

Cuando se parpadea desde CWM o TWRP En general, uno puede ahorrarse la molestia de firmar el ZIP. También puede probar mi Generador de ZIP Flashable .

0 votos

@DeathMaskSalesman Había visto tu script pero no lo había entendido. Desde que entendí lo suficiente como para poder escribir esta respuesta, he vuelto a ver tu script y tengo algunas preguntas que voy a hacer allí ...

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X