3 votes

Puis-je créer un ZIP flashable contenant un ou plusieurs APK ?

Est-il possible de faire un ZIP qui peut être flashé sur un appareil pour ajouter un ensemble d'applications ( .apk ) vers le /system/app afin qu'il puisse être flashé après le système d'exploitation (par exemple CyanogenMod) de la même manière que d'autres bundles comme OpenGApps ?

J'ai vu des choses comme l'application ZipMe mais j'aimerais vraiment faire cela sur Linux où j'ai les fichiers apk désirés dans un répertoire. J'aimerais le faire à la main si possible afin de pouvoir comprendre le contenu du ZIP.

7voto

starfry Points 395

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X