5 votos

Lollipop y superiores - ¿Cómo instalo un APK como aplicación del sistema?

Antiguamente, instalar una aplicación como aplicación del sistema era tan sencillo como mover el archivo APK a /system/app o /system/priv-app . Eliminarlas fue tan sencillo como borrar el APK.

Ahora, mientras estoy personalizando la ROM stock del teléfono, me he dado cuenta de que todas y cada una de las aplicaciones de la partición del sistema estaban dentro de su propia carpeta. He intentado simplemente soltar el APK en /system/app o /system/priv-app pero no funcionan.

¿Cómo instalo una aplicación como aplicación del sistema en Lollipop? Sospecho que algo pasa con SELinux y el contexto, pero no tengo acceso Root. Sin embargo, tengo acceso de lectura/escritura al sistema de archivos (montando la imagen en Linux).

ACTUALIZACIÓN: He intentado Death Mask Salesman y echado un vistazo a logcat . Las aplicaciones que quiero preinstalar (por ejemplo, Instagram) arrojan este error:

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

Los síntomas:

  • Todas las aplicaciones que he instalado fuerzan el cierre
  • Los nombres de sus paquetes y el logotipo genérico aparecen en el lanzador en lugar del nombre y el logotipo de su aplicación
  • Simplemente no funcionan

Para las personas que planean marcar esto como un duplicado, estas respuestas no funcionan/están desactualizadas/no son aplicables (no es un sistema vivo/sin acceso Root):

3voto

Dominik Puntos 153

Bien, lo tengo funcionando. Así es como lo hice:

  1. Copie el archivo APK en /system/app/some-folder/ o /system/priv-app/xyz-folder/ .
    • Mantenerlos en sus propias carpetas puede/debe evitar conflictos. Algunas aplicaciones quieren tener su libs y otros archivos extraídos y colocados junto al APK en carpetas específicas, aunque son bastante raros.
    • Intenta revisar algunas carpetas de otras aplicaciones del sistema. Observa que algunas de ellas tienen un lib u otra carpeta junto al APK.
    • Es por eso que casi todas las aplicaciones en las carpetas mencionadas anteriormente tienen sus APKs dentro de sus propias carpetas.
    • Seguir el paso 1 suele ser suficiente.
  2. Cambiar el contexto del archivo APK utilizando el comando
    • chcon u:object_r:system_file:s0 /path/to/apk-file.apk
    • O, si lo has copiado en su propia carpeta, ejecuta chcon -R u:object_r:system_file:s0 /folder/where/the/APK/is/saved .

Si no se cambia el contexto, Android no tratará tu aplicación como una aplicación del sistema. Aparecerá en el lanzador como una aplicación con un icono genérico y zzz.package.name como el nombre.

En los viejos tiempos (por ejemplo, Gingerbread), simplemente había que copiar el APK en /system/app/ y establecer los permisos adecuados. Los tiempos han cambiado.

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