Cet exemple simplifié s'inspire de ce fil de discussion de xda-developers .
Il est pratique d'utiliser adb
mais vous n'en avez pas besoin.
Obtenez un outil de signature Java et des clés
Votre ZIP emballé doit être signé. Si vous disposez d'un outil de signature Java, c'est parfait. Si ce n'est pas le cas, vous pouvez consulter les sources Google de signapk ou téléchargez une signapk.jar
de aquí o aquí .
Ce dernier contient également des exemples de clés de signature que vous pouvez utiliser mais vous pouvez faites le vôtre avec 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 discussion suivante suppose que vous disposez d'un signapk
répertoire contenant signapk.jar
, clé privée key.pk8
et le certificat certificate.pem
(qui contient la clé publique correspondante).
Préparer le contenu du ZIP
Créez un répertoire de travail (le nom n'a pas d'importance) :
$ mkdir apkzip
$ cd apkzip
Créez la structure requise
$ mkdir -p META-INF/com/google/android system/app
L'étape suivante consiste à créer un fichier appelé updater-script
qui contient un script écrit en quelque chose appelé édifier . Un script simple qui répond à cette exigence est présenté ci-dessous :
# 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");
Le troisième paramètre de mount
est le chemin du périphérique de bloc pour le system
partition. Vous pouvez (facultativement) vérifier cela avec :
$ adb shell grep system /proc/mounts
/dev/block/platform/mtk-msdc.0/by-name/system /system ext4 ...
Vous pouvez embellir le updater-script
avec des commentaires et des barres de progression, comme l'illustrent de nombreux exemples sur le web, mais ce n'est pas nécessaire.
Vous devez également fournir l'interpréteur pour le script qui est un fichier appelé update-binary
que vous pouvez obtenir à partir de la rom que vous utilisez, comme CyanogenMod ou ResurrectionRemix. Trouvez-le dans le fichier Zip de la ROM à l'emplacement META-INF/com/google/android/update-binary
et le copier dans l'arborescence du répertoire de travail à un emplacement similaire et à côté de l'option updater-script
créé à l'étape précédente.
Enfin, copiez dans le .apk
les fichiers que vous voulez dans votre ZIP. Ils doivent être placés dans des répertoires individuels comme system/app/<app-name>/<apk-file>
où <appName>
est un répertoire nommé d'après l'application (je ne pense pas que le nom soit pertinent) et <apk-file>
es el .apk
fichier. Il devrait y avoir un .apk
par répertoire.
Votre hiérarchie de fichiers devrait maintenant ressembler à ceci :
./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
Créer et signer le ZIP
Créez maintenant le ZIP signé (le -r
récure les sous-répertoires) :
$ zip -r /tmp/apps.zip *
$ cd ../signapk
$ java -jar signapk.jar certificate.pem key.pk8 /tmp/apps.zip apps.zip
Appliquer le ZIP à votre appareil
Poussez le ZIP signé (le apps.zip
créé dans la version actuelle ( signapk
) sur l'appareil, choisissez un emplacement que votre récupération peut voir :
$ adb push apps.zip /mnt/media_rw/sdcard1/
(Vous n'êtes pas obligé d'utiliser adb
- vous pouvez utiliser une autre méthode comme placer la carte SD dans votre ordinateur, etc).
Maintenant, redémarrez en mode récupération et flashez ou, dans le cas d'un bootloader verrouillé, utilisez FlashFire ou toute autre méthode préférée pour votre appareil.
Autres notes
Vous pouvez en savoir plus sur Edify :
Il peut être possible de remplacer update-binary
avec un script shell. Un exemple de ceci peut être vu dans le OpenGApps ZIP mais je n'ai pas essayé.
Ce qui précède fonctionne à condition que les applications ne contiennent pas de bibliothèques natives. Si c'est le cas, elles doivent être extraites manuellement de l'application. .apk
(qui est lui-même un fichier ZIP). /lib
et placé sous /system/vendor/lib
en plus de placer le paquet dans /system/app/...
.
Comme l'a fait remarquer @DeathMaskSalesman, la signature n'est pas requise par TWRP, CWM ou FlashFire ; vous pouvez donc sauter les étapes de signature si vous préférez.
J'ai produit un utilitaire qui fonctionne sous Linux ou Android. Obtenir apkzip aquí .