Instalación de APK (1): análisis del principio de PMS
En la descripción general de la instalación de APK, se mencionó que hay cuatro escenarios de instalación para apk, pero no importa qué método se utilice, eventualmente se enviará a PackageManagerService para su procesamiento, pero el enlace de preprocesamiento es diferente. Por eso, este artículo analiza primero el proceso principal del síndrome premenstrual.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java Basado en Android 9.0
1. Configure cierta información específica del proceso del sistema y guárdela en Configuración
2. Analice los archivos xml relevantes en /etc/permissions para obtener permisos relacionados con el sistema, funciones relacionadas del sistema y otra información
3. Analice el archivo /data/system/package.xml para obtener información relevante sobre la instalación de aplicaciones
4. Realice la optimización dex en el apk y el jar relevantes, principalmente el jar y el apk relevantes en el directorio /system/framework
5. Basado en SharedUserId Configure para determinar en qué proceso se está ejecutando el apk y luego agregue la información relevante del proceso en ejecución a Configuración para que el sistema pueda saber en qué proceso se está ejecutando cada apk
6. Analice AndroidManifest.xml archivar y refinar la información del nodo del archivo en
7. Escanear archivos locales, principalmente para aplicaciones del sistema, aplicaciones instaladas localmente, etc.
8. Administrar apk local, incluida la instalación, eliminación, etc.
Como se mencionó anteriormente, la información del APK se enviará al PMS para una serie de tareas de instalación. Específicamente, los mensajes se envían a través de PackageHandler para controlar la copia e instalación del APK. es el siguiente:
Durante el proceso de carga de fotos, hay algunos puntos que deben explicarse:
1. El objeto InstallParams se crea en el método installStage, que corresponde al datos de instalación del paquete, y el mensaje INIT_COPY se crea y se envía al PackageHandler para su procesamiento
2 Cuando el PackageHandler procesa el mensaje INIT_COPY, primero determinará si está vinculado al DefaultContainerService. un servicio utilizado para verificar y asignar archivos móviles requiere mucho tiempo, por lo que no se ejecuta en el mismo proceso que el PMS. IMediaContainerService realiza la comunicación IPC.
DefaultContainerConnection también se define en PMS y el enlace de ejecución es el siguiente:
3. Al enviar el mensaje MCS_BOUND, según si el mensaje enviado contiene un objeto se divide en dos tipos , como se muestra a continuación:
4. Procesamiento de mensajes MCS_BOUND:
HandlerParams es una clase abstracta en PMS y su clase de implementación es la clase interna InstallParams de PMS.
El método startCopy de HandlerParams es el siguiente:
PackageManagerService.java#HandlerParams
Llame al método abstracto handleStartCopy en el comentario ①, y la implementación específica está en InstallParams, como se muestra a continuación:
PackageManagerService.java#InstallParams
1. El comentario ① determina la ubicación de instalación del APK.
2. Cree el objeto InstallArgs en el comentario ②. Este objeto es una clase abstracta que define la lógica de instalación, como copiar y cambiar el nombre de APK. Hay tres subclases en Android 8.x y versiones anteriores: FileInstallArgs, AsecInstallArgs. , MoveInstallArgs. Entre ellos, FileInstallArgs se usa para procesar APK instalados en espacio de almacenamiento que no es ASEC, es decir, espacio de almacenamiento interno (partición de datos); AsecInstallArgs se usa para procesar APK instalados en ASEC (mnt/asec), es decir, tarjetas SD; se usa para procesar APK instalados. La lógica de movimiento, sin embargo, AsecInstallArgs se eliminó después de Android 9. :
1. El comentario ① se usa para crear un directorio de almacenamiento temporal, como /data/app/vmdl18300388. .tmp, donde 18300388 es el ID de sesión instalado;
2. Se pasa el comentario ②. IMediaContainerService llama al método copyPackage de DefaultContainerService en todos los procesos. Este método copiará el APK al directorio de almacenamiento temporal en el proceso donde se encuentra DefaultContainerService. ubicado, como /data/app/vmdl18300388.tmp/base.apk. En este punto, finaliza la copia del APK.
En el proceso de la cadena de llamadas de asignación de APK anterior, en el método startCopy de HandlerParams, se llamará al método handleReturnCode. El diagrama de tiempo es el siguiente:
PackageManagerService#handleReturnCode:
Nota ① Verifique el estado del APK para asegurarse de que el entorno de instalación sea confiable antes de la instalación. Si no es confiable, los archivos APK copiados se borrarán. Nota ③ verificará si la instalación se realizó correctamente. Si falla, se eliminarán los directorios y archivos relacionados con la instalación. Una vez completada la instalación, se enviará un mensaje POST_INSALL en el comentario ⑤ para notificar que la instalación se completó, lo que se explicará más adelante.
installPackageTracedLI en la nota ② llamará al método installPackageLI de PMS:
PackageManagerService.java#installPackageLI:
Aquí es necesario explicar varios puntos: p>
1. Nota ③: Primero detectará que la información del APK que se instalará está almacenada en Configuración, lo que significa que el APK está instalado. Por lo tanto, es necesario verificar la información de la firma del APK para garantizar un reemplazo seguro. .
2. Nota ④, se cambiará el nombre del archivo temporal, por ejemplo /data/app/vmdl18300388.tmp/base.apk, se cambiará el nombre a /data/app/package name-oONlnRRPYyleU63AveqbYA==/base. apk. La cadena mixta de letras y números detrás del nuevo nombre del paquete es el producto del cifrado de 16 caracteres generados aleatoriamente usando MD5.
3. Nota ⑤, distinga según el reemplazo. Si se trata de una instalación de reemplazo, se llamará al método replacePackageLIF. El método también distinguirá entre la aplicación del sistema y la aplicación que no es del sistema. APK instalado El método installNewPackageLIF se llamará
PackageManagerService.java#installNewPackageLIF:
En el análisis del código fuente del método ProcessPendingInstall anterior, se enviará un mensaje POST_INSTALL en el comentario ⑤ para notificar que la instalación se haya completado, por lo que el siguiente paso es Específicamente, observe cómo se maneja este mensaje en PackageHandler.
Lo anterior es un resumen de los métodos principales, que se pueden resumir como:
1. El primer paso: aquí es principalmente eliminar la información de instalación de la lista de columnas de instalación. Este también es el paso anterior Agregado en el procesoPendingInstall
2. Paso 2: Después de una instalación exitosa, obtenga permisos de tiempo de ejecución
3. Paso 3: Después de obtener los permisos, envíe la transmisión ACTION_PACKAGE_ADDED para informar. Laucher Stream, icono de actualización
4. Paso 4: Si se trata de una actualización, envíe dos transmisiones
5. Paso 5: Si PRIVATE_FLAG_FORWARD_LOCK está configurado en el paquete de instalación o es necesario Si instalado en la tarjeta SD, llame al método sendResourcesChangedBroadcast para enviar una transmisión de cambio de recurso
6. Paso 6: si la aplicación es un navegador, borre la configuración del navegador y vuelva a verificarla
<. p> 7. Paso 7: Llame a gc a la fuerza e inicie JVM para realizar la operación de recolección de basura8. Paso 8: Elimine la información de instalación anterior
9. La devolución de llamada devuelve el método packageInstalled de IPackageInstallObserver2. Informe a PackageInstaller los resultados de la instalación.
Realizando así la devolución de llamada de instalación a la capa UI
Las partes anteriores describen aproximadamente los pasos principales del procesamiento del APK por PMS, que se pueden resumir de la siguiente manera:
1. Cuando PackageInstaller envía el APK información a PMS para su procesamiento, PMS impulsará la copia e instalación de APK enviando mensajes a PackageHandler
2. PMS envía mensajes de tipo INIT_COPY y MCS_BOUND, y controla PackageHandler para vincular DefaultContainerService para completar la copia de APK y otros trabajos
3. Después de copiar el APK, inicie el proceso de instalación del APK, incluida la inspección previa a la instalación, la instalación del APK y el trabajo de finalización posterior a la instalación.
[ 1 ] /framework/pms/3-pms-install.html
[ 4 ] /article/5119749905/
[ 5 ] /p/ 9ddb930153b7