"El instalador del paquete dejó de funcionar" después de la actualización a OxygenOS 3.1.4 (Marshmallow)

Actualicé mi teléfono OnePlus X (rooteado) de Oxygen OS 2.2.x a 3.1.4 (actualización sucia, de Lollipop a Marshmallow).

Desde que hice eso, la vista de configuración se bloqueó con "Desafortunadamente, el instalador del paquete se detuvo" cuando intento ver los detalles de permiso para algunas aplicaciones. Por ejemplo, cuando abro trato de ver los permisos para Hangouts (Configuración> Aplicaciones> Hangouts> permisos), aparece el cuadro de diálogo anterior y el siguiente resultado se muestra en logcat:

AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: Process: com.android.packageinstaller, PID: 16689
AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.ManagePermissionsActivity}: java.lang.SecurityException: com.google.android.talk from uid 10100 not allowed to perform WRITE_CONTACTS
AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2493)
AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2576)
AndroidRuntime:        at android.app.ActivityThread.access$1000(ActivityThread.java:155)
AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
AndroidRuntime:        at android.os.Looper.loop(Looper.java:148)
AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:5539)
AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
AndroidRuntime: Caused by: java.lang.SecurityException: com.google.android.talk from uid 10100 not allowed to perform WRITE_CONTACTS
AndroidRuntime:        at android.app.AppOpsManager.checkOp(AppOpsManager.java:1521)
AndroidRuntime:        at com.android.packageinstaller.permission.model.AppPermissionGroup.create(AppPermissionGroup.java:152)
AndroidRuntime:        at com.android.packageinstaller.permission.model.AppPermissionGroup.create(AppPermissionGroup.java:94)
AndroidRuntime:        at com.android.packageinstaller.permission.model.AppPermissions.loadPermissionGroups(AppPermissions.java:136)
AndroidRuntime:        at com.android.packageinstaller.permission.model.AppPermissions.<init>(AppPermissions.java:66)
AndroidRuntime:        at com.android.packageinstaller.permission.ui.handheld.AppPermissionsFragment.onCreate(AppPermissionsFragment.java:105)
AndroidRuntime:        at android.app.Fragment.performCreate(Fragment.java:2198)
AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
AndroidRuntime:        at android.app.BackStackRecord.run(BackStackRecord.java:793)
AndroidRuntime:        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
AndroidRuntime:        at android.app.FragmentController.execPendingActions(FragmentController.java:325)
AndroidRuntime:        at android.app.Activity.performStart(Activity.java:6305)
AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2456)
AndroidRuntime:        ... 9 more

Y cuando abro el acceso a Configuración> Aplicaciones> Icono de engranajes> Permisos de acceso, la actividad de Android aparece brevemente y luego se cierra. No hay un cuadro de diálogo de error, pero logcat muestra el siguiente error:

AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
AndroidRuntime: Process: com.android.packageinstaller, PID: 19194
AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
AndroidRuntime:        at android.os.AsyncTask$3.done(AsyncTask.java:309)
AndroidRuntime:        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
AndroidRuntime:        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
AndroidRuntime:        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
AndroidRuntime:        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
AndroidRuntime:        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
AndroidRuntime:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
AndroidRuntime:        at java.lang.Thread.run(Thread.java:818)
AndroidRuntime: Caused by: java.lang.SecurityException: com.ubercab from uid 10102 not allowed to perform CAMERA
AndroidRuntime:        at android.app.AppOpsManager.checkOp(AppOpsManager.java:1521)
AndroidRuntime:        at com.android.packageinstaller.permission.model.AppPermissionGroup.create(AppPermissionGroup.java:152)
AndroidRuntime:        at com.android.packageinstaller.permission.model.PermissionApps.loadPermissionApps(PermissionApps.java:189)
AndroidRuntime:        at com.android.packageinstaller.permission.model.PermissionApps.-wrap0(PermissionApps.java)
AndroidRuntime:        at com.android.packageinstaller.permission.model.PermissionApps$PermissionAppsLoader.doInBackground(PermissionApps.java:375)
AndroidRuntime:        at com.android.packageinstaller.permission.model.PermissionApps$PermissionAppsLoader.doInBackground(PermissionApps.java:374)
AndroidRuntime:        at android.os.AsyncTask$2.call(AsyncTask.java:295)
AndroidRuntime:        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
AndroidRuntime:        ... 4 more

¿Por qué sucede esto y cómo puedo solucionarlo?

Respuestas (1)

Ambos mensajes de error en la pregunta incluyen un mensaje en el siguiente formato:

java.lang.SecurityException: [id de aplicación] de uid [id de usuario] no autorizado para realizar [id de permiso]

Recordé que para las aplicaciones afectadas, una vez deshabilité algunos permisos usando la función "Permisos de aplicaciones" de OxygenOS 2/Lollipop. En OxygenOS 3/Marshmallow, "Permisos de aplicaciones" se reemplazó por el sistema de administración de permisos de Android 6. Aunque la interfaz de usuario desapareció después de la actualización, el backend no lo hizo y provocó fallas cuando la página de configuración intentó verificar el permiso.

Para solucionar los problemas, borré algunos permisos de aplicaciones, de la siguiente manera:

  1. En el teléfono: habilite la "Depuración de USB" (Configuración > Opciones de desarrollador > Depuración de USB).
  2. Conecte su teléfono a su computadora (donde está instalado ADB).
  3. En la computadora: comience adb logcata recibir un flujo continuo de mensajes de registro (también puede usar Logcat en el teléfono, pero usar la computadora es más fácil porque necesitará el espacio de la pantalla del teléfono en un paso posterior).
  4. En la computadora: use adb shellpara obtener un shell (lo más probable es que no se necesite root).
  5. Ahora repita los siguientes pasos para cada aplicación en Configuración > Aplicaciones:

    • Toque el icono de la aplicación para ver su configuración.
    • Si la sección "Permisos" no está vacía, omita los siguientes pasos y continúe con la siguiente aplicación (por ejemplo, cuando muestra "No se otorgaron permisos" o "No se solicitaron permisos" o un permiso específico como "Ubicación").
    • De lo contrario (la sección "Permiso" está en blanco), toque "Permisos".
    • Ahora verá "El instalador del paquete ha dejado de funcionar".
    • Mire la salida de logcat y busque el siguiente mensaje:

      java.lang.RuntimeException: no se puede iniciar el receptor com.android.packageinstaller.permission.model.PermissionStatusReceiver: java.lang.SecurityException: com.google.android.talk desde uid 10100 no se permite realizar WRITE_CONTACTS

      En los ejemplos a continuación, usaré com.google.android.talk como ID de aplicación y WRITE_CONTACTS como ID de operación/permiso.

    • OPCIONAL: Primero mire la operación existente, en caso de que quiera restaurar el valor original (en este caso, la salida es "WRITE_CONTACTS: deny"), ejecute lo siguiente en adb shell:

      appops get com.google.android.talk WRITE_CONTACTS
      

      ( Ejecute "appops" sin argumentos para obtener más opciones/ayuda ).

    • Permita la operación ejecutando el siguiente comando en el adb shell(si no funciona, intente "permitir" en lugar de "predeterminado"):

      appops set com.google.android.talk WRITE_CONTACTS default
      
    • Si obtiene "Sin operaciones", entonces el nombre del permiso probablemente sea diferente. Ejecutar appops get com.google.android.talk(sin el permiso específico) para ver todos los permisos existentes. Por ejemplo, logcat muestra "READ_ICC_SMS", pero el ID de operación real que muestra el appopscomando es "READ_SMS"
    • En su teléfono, toque "Permisos". Si vuelve a fallar, repita los pasos anteriores (Mire la salida de logcat, ...). Si no falla, se muestran los permisos para la aplicación seleccionada y puede revocar los permisos si lo desea.

Después de seguir todos los pasos, no obtuve ningún error del tipo "El paquete instalado dejó de funcionar" en el menú de configuración, y también pude usar Configuración> Aplicaciones> Icono de engranajes> Permisos de acceso.

PD: no todos los permisos de aplicaciones son problemáticos. Algunas de las operaciones que tuve que permitir para algunas aplicaciones son: COARSE_LOCATION, CALL_PHONE, CAMERA, READ_CONTACTS, READ_SMS, RECEIVE_SMS, SEND_SMS, WRITE_CONTACTS. Por ejemplo, para Hangouts, denegar las siguientes operaciones no evita que la pantalla de configuración funcione: WRITE_SMS, WRITE_WALLPAPER.