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?
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:
adb logcat
a 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).adb shell
para obtener un shell (lo más probable es que no se necesite root).Ahora repita los siguientes pasos para cada aplicación en Configuración > Aplicaciones:
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
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 appops
comando es "READ_SMS"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.