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í .