Instalación de APK (I): análisis del principio de PMS
En la descripción general de la instalación de APK, se menciona que hay cuatro métodos de instalación para apk, pero no importa qué método, eventualmente se enviará a PackageManagerService para su procesamiento, pero los pasos de procesamiento anteriores son diferentes, por lo que Esta publicación analiza primero el proceso principal de PMS. frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java Basado en Android 9.0
1. Establezca información específica del proceso del sistema y guárdela en la configuración. Analice el archivo xml /etc/permissions para obtener permisos del sistema, funciones del sistema y otra información
3. Analice /data/system/package.xml java basado en Android 9.0
4. xml para obtener información sobre las aplicaciones instaladas
4. dex optimiza el apk y el jar relacionados, principalmente el jar y el apk relacionados en el directorio /system/framework
5. Basado en el archivo SharedUserId, Podemos usar el archivo SharedUserId para obtener permisos del sistema e información de funciones. strong> configuración de SharedUserId para determinar en qué proceso se está ejecutando el apk y luego agregar información de proceso relevante a la configuración, para que el sistema pueda saber en qué proceso se está ejecutando cada apk
6. Analizar AndroidManifest. xml, extraiga información del nodo del archivo
7. Escanee archivos locales, principalmente aplicaciones del sistema, aplicaciones instaladas localmente, etc.
8. Administre el apk local, incluida la instalación, eliminación, etc.
Como se mencionó anteriormente, la información del APK se enviará al PMS para su instalación. Cree un objeto InstallParams en el método installStage, que corresponde a los datos de instalación del paquete de software, y crea un mensaje INIT_COPY, que luego se envía al PackageHandler para su procesamiento;
2. Se crea un PackageHandler en el método installStage. Al procesar el mensaje INIT_COPY, primero determina si está vinculado a DefaultContainerService, que se utiliza para verificar y asignar archivos a archivos extraíbles, lo que lleva mucho tiempo, por lo que no se ejecuta en el mismo proceso que PMS. No se ejecutan en el mismo proceso. Se comunican a través de IPC a través de IMediaContainerService. Si no están vinculados, están vinculados.
DefaultContainerConnection también se define en PMS. >
3. Al enviar un mensaje MCS_BOUND, se divide en dos tipos según si el mensaje enviado contiene un objeto, como se muestra a continuación:
4. Procesamiento de mensajes MCS_BOUND:
HandlerParams está en PMS Una clase abstracta, su clase de implementación es InstallParams, que es una clase interna de PMS.
El método startCopy de HandlerParams es el siguiente:
PackageManagerService.java#HandlerParams
El método abstracto handleStartCopy se llama en el comentario ① y se implementa en InstallParams de la siguiente manera:
PackageManagerService.java#InstallParams
1.Comentario ① Identifica la ubicación donde está instalado el APK.
2.Anotación ② Creó el objeto InstallArgs, que es una clase abstracta utilizada para definir la lógica de instalación, como copiar y cambiar el nombre de APK. En Android 8.x y versiones anteriores, hay tres subclases: FileInstallArgs, AsecInstallArgs y MoveInstallArgs. FileInstallArgs se usa para manejar APK instalados en almacenamiento que no es ASEC (es decir, almacenamiento interno (partición de datos)); AsecInstallArgs se usa para manejar APK instalados en ASEC (mnt/asec) (es decir, tarjeta SD); ASEC (mnt/asec) (es decir, tarjeta SD). InstallArgs llama al método copyApk. Aquí tomamos la implementación de FileInstallArgs como ejemplo. Llama internamente al método doCopyApk de FileInstallArgs:
1. El comentario ① se utiliza para crear un directorio de almacenamiento temporal, como /data. /app/vmdl18300388 .tmp, donde 18300388 es el ID de la sesión instalada;
2. Anotación ② Se utiliza para crear un directorio de almacenamiento temporal llamando al método copyPackage de DefaultContainerService en todos los procesos a través de IMediaContainerService. APK al directorio temporal en el directorio de almacenamiento del proceso DefaultContainerService, como /data/app/vmdl18300388.tmp/base.apk. En este punto, finaliza el proceso de copia del APK.
En la cadena de llamadas de asignación de APK anterior, el método handleReturnCode se llama en el método startCopy de HandlerParams. El diagrama de tiempo es el siguiente.
PackageManagerService#handleReturnCode:
Verifique el estado del APK en la nota 1 y asegúrese de que el entorno de instalación sea confiable antes de realizar la instalación. Si el entorno de instalación no es confiable, el archivo APK copiado lo hará. ser borrado. Si no es confiable, el APK copiado se eliminará. Compruebe si la instalación se realizó correctamente; de lo contrario, elimine los directorios y archivos relacionados con la instalación. Una vez que se complete la instalación, se enviará un mensaje POST_INSALL en la Nota 5 para notificar que la instalación se completó, lo cual se explicará más adelante.
installPackageTracedLI llama al método installPackageLI de PMS en el comentario ②:
PackageManagerService.java#installPackageLI:
Aquí es necesario explicar varios puntos:
1.Comentar ③ Primero verificará si hay información relevante sobre el APK que se instalará en la configuración. El APK ya está instalado, por lo que debe verificar la información de firma del APK para asegurarse de que sea seguro reemplazarlo.
2. En el comentario ④, cambie el nombre del archivo temporal, por ejemplo, /data/app/vmdl18300388.tmp/base.apk se cambia a /data/app/package-name- y /data/app /nombre-paquete- pasó a llamarse /data/app/nombre-paquete- oONlnRRPYyleU63AveqbYA==/base.apk. El nuevo nombre del paquete va seguido de una cadena alfanumérica cifrada con 16 caracteres generados aleatoriamente mediante MD5.
3. Nota ⑤, distinga según reemplazar Si se trata de una instalación de reemplazo, se llamará al método replacePackageLIF. Si lo es, este método también distinguirá entre la aplicación del sistema y la aplicación que no es del sistema. un APK recién instalado, llamará al método installNewPackageLIF
PackageManagerService.java#installNewPackageLIF:
En el método ProcessPendingInstall anterior, el mensaje POST_INSTALL se enviará en el comentario ⑤ para notificar que la instalación ha sido completado. Manejador de paquetes.
Lo anterior es un resumen de los métodos principales, que se pueden resumir de la siguiente manera:
1. Paso 1: el objetivo principal aquí es eliminar la información de instalación de la columna de instalación. lista, que también es el procesoPendingInstall antes de Agregar en
2. Paso 2: Después de una instalación exitosa, obtenga permisos de tiempo de ejecución
3. Paso 3: Envíe el mensaje ACTION_INSTALL a PackageHandler para notificar que el se completa la instalación: obtenga permiso Después de eso, envíe la transmisión ACTION_PACKAGE_ADDED para notificar el ícono de actualización de la transmisión de Laucher
4. Paso 4: si se trata de una actualización de actualización, envíe dos transmisiones más
5. Paso 5: Si está instalado Si el programa tiene PRIVATE_FLAG_FORWARD_LOCK configurado, o necesita instalarse en la tarjeta SD, llame al método sendResourcesChangedBroadcast para enviar la transmisión de cambio de recursos
6. Paso 6: Si la aplicación es un navegador, borre la configuración del navegador y vuelva a verificar la configuración del servidor de navegación
7. Paso 7: fuerce la llamada a gc y desactive la operación de recolección de basura JVM
8. Paso 8: elimine la información de instalación anterior p>
9. Vuelva a llamar el método packageInstalled de IPackageInstallObserver2. Informe a PackageInstaller los resultados de la instalación. Esto permitirá la devolución de llamada de instalación de la capa UI
La sección anterior explica aproximadamente los pasos principales del procesamiento APK de PMS, que se pueden resumir de la siguiente manera:
1. Cuando PackageInstaller envía información acerca de APK a PMS a Cuando esté listo para su procesamiento, PackageInstaller envía la información al PMS para su procesamiento. , PMS impulsa la copia e instalación de APK enviando mensajes a PackageHandler
2. PMS