5 votes

Lollipop et supérieur - Comment installer un APK comme application système ?

À l'époque, pour installer une application en tant qu'application système, il suffisait de déplacer le fichier APK dans le dossier de l'application. /system/app o /system/priv-app . Les supprimer était aussi simple que de supprimer l'APK.

Maintenant, pendant que je personnalise la ROM stock du téléphone, j'ai remarqué que chaque application sur la partition système était dans son propre dossier. J'ai essayé de simplement déposer l'APK en /system/app o /system/priv-app mais ça ne marche pas.

Comment installer une application en tant qu'application système sur Lollipop ? Je soupçonne qu'il y a un problème avec SELinux et le contexte, mais je n'ai pas d'accès Root. Cependant, j'ai un accès en lecture/écriture au système de fichiers (en montant l'image dans Linux).

UPDATE : J'ai essayé Death Mask Salesman et jeté un coup d'oeil à logcat . Les applications que je souhaite préinstaller (par exemple, Instagram) génèrent cette erreur :

01-01 01:04:45.108 5538-5538/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.instagram.android, PID: 5538
                                                 java.lang.RuntimeException: Unable to instantiate application com.instagram.app.InstagramAppShell: java.lang.ClassNotFoundException: Didn't find class "com.instagram.app.InstagramAppShell" on path: DexPathList[[zip file "/system/framework/com.google.android.maps.jar"],nativeLibraryDirectories=[/custpack/app/removeable/withlibs/com.instagram.android-1/lib/arm, /vendor/lib, /system/lib]]
                                                     at android.app.LoadedApk.makeApplication(LoadedApk.java:572)
                                                     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4818)
                                                     at android.app.ActivityThread.access$1500(ActivityThread.java:178)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531)
                                                     at android.os.Handler.dispatchMessage(Handler.java:111)
                                                     at android.os.Looper.loop(Looper.java:194)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5624)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:372)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
                                                  Caused by: java.lang.ClassNotFoundException: Didn't find class "com.instagram.app.InstagramAppShell" on path: DexPathList[[zip file "/system/framework/com.google.android.maps.jar"],nativeLibraryDirectories=[/custpack/app/removeable/withlibs/com.instagram.android-1/lib/arm, /vendor/lib, /system/lib]]
                                                     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                                     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                                     at android.app.Instrumentation.newApplication(Instrumentation.java:985)
                                                     at android.app.LoadedApk.makeApplication(LoadedApk.java:567)
                                                     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4818) 
                                                     at android.app.ActivityThread.access$1500(ActivityThread.java:178) 
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                     at android.os.Looper.loop(Looper.java:194) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:5624) 
                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                     at java.lang.reflect.Method.invoke(Method.java:372) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 
                                                    Suppressed: java.lang.ClassNotFoundException: com.instagram.app.InstagramAppShell
                                                     at java.lang.Class.classForName(Native Method)
                                                     at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                                                     at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                                                     at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                                                            ... 13 more
                                                  Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Symptômes :

  • Toutes les applications que j'ai installées se ferment de force.
  • Le nom de leur paquet et le logo générique apparaissent sur le lanceur au lieu du nom et du logo de leur application.
  • Ils ne fonctionnent tout simplement pas

Pour les personnes qui prévoient de signaler cette question comme étant un doublon, ces réponses ne fonctionnent pas / sont dépassées / ne sont pas applicables (pas un système en direct / pas d'accès Root) :

3voto

Aloha Points 325

Ok, je l'ai fait fonctionner. Voici comment je l'ai fait :

  1. Copiez le fichier APK dans /system/app/some-folder/ o /system/priv-app/xyz-folder/ .
    • Le fait de les conserver dans leurs propres dossiers permet d'éviter les conflits. Certaines applications veulent avoir leur libs et d'autres fichiers extraits et placés à côté de l'APK dans des dossiers spécifiques, bien qu'ils soient plutôt rares.
    • Essayez de vérifier certains dossiers d'autres applications système. Remarquez que certains d'entre eux ont un lib ou un autre dossier à côté de l'APK.
    • C'est pourquoi presque toutes les applications des dossiers mentionnés ci-dessus ont leurs APKs dans leurs propres dossiers.
    • Suivre l'étape 1 est généralement suffisant.
  2. Changez le contexte du fichier APK en utilisant la commande
    • chcon u:object_r:system_file:s0 /path/to/apk-file.apk
    • Ou, si vous l'avez copié dans son propre dossier, exécutez chcon -R u:object_r:system_file:s0 /folder/where/the/APK/is/saved .

Si le contexte n'est pas modifié, Android ne traitera pas votre application comme une application système. Elle s'affichera sur le lanceur comme une application avec une icône générique et un nom de domaine. zzz.package.name comme nom.

Auparavant (par exemple Gingerbread), il suffisait de copier l'APK dans le répertoire /system/app/ et définir les permissions appropriées. Les temps ont changé.

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