Proceso de instalación de Android del programa .apk

 
 De información interna de Huawei

 Breve descripción del principio PackageInstaller

La instalación de aplicaciones es la característica principal de los teléfonos inteligentes, es decir, los usuarios pueden instalar varias aplicaciones (como juegos, etc.) en el teléfono y realizar operaciones de administración como desinstalarlas. APK es la abreviatura de Android Package, es decir, paquete de instalación de Android. APK es un formato de archivo similar a Symbian Sis o Sisx. Se puede instalar transfiriendo directamente el archivo APK al emulador de Android o al teléfono Android para su ejecución.

 

Hay cuatro formas de instalar aplicaciones de Android

1. Instalación de la aplicación del sistema: completa al arrancar, sin interfaz de instalación

2. Descarga de red e instalación de aplicaciones: a través de la aplicación de mercado, no hay interfaz de instalación

3. Instalación de la herramienta ADB: no hay interfaz de instalación.

4. Instalación-instalación de aplicaciones de terceros a través del archivo APK en la tarjeta SD, hay una interfaz de instalación, la interfaz de la aplicación packageinstaller.apk para manejar el proceso de instalación y desinstalación.

Proceso y ruta de 
instalación de la aplicación La instalación de la aplicación incluye los siguientes directorios:

Sistema / aplicación 
 El programa de aplicación que viene con el sistema no puede eliminar  el directorio donde está instalado el programa de usuario de
 
datos / aplicación
y tiene el permiso de eliminación.

Durante la instalación, copie el archivo apk en este directorio
 
data / data para
 almacenar los datos de la aplicación
 
Data / dalvik-cache
 Instale el archivo dex en el apk en el directorio dalvik-cache (el archivo dex es el archivo ejecutable de dalvik virtual máquina, y su tamaño es de aproximadamente (es una cuarta parte del tamaño del archivo apk original)
 

 

       Proceso de instalación: copie el paquete de instalación de APK en el directorio data / app, descomprima y escanee el paquete de instalación, guarde el archivo dex (código de bytes de Dalvik) en el directorio dalvik-cache y cree el directorio de datos de la aplicación correspondiente en el directorio data / data .

       Proceso de desinstalación: elimine los archivos y directorios creados en los tres directorios anteriores durante el proceso de instalación.


 

1. Instalación de la aplicación del sistema: 
PackageManagerService maneja la instalación, desinstalación y administración de varias aplicaciones. Este servicio es iniciado por systemServer al arrancar

(Ruta del archivo de origen: android \ frameworks \ base \ services \ java \ com \ android \ server \ PackageManagerService.java)

 

El proceso de iniciar el servicio PackageManagerService:

1. Primero escanee e instale el paquete jar en el directorio "system \ framework"

1. scanDirLI (mFrameworkDir, PackageParser.PARSE_IS_SYSTEM,

                    scanMode | SCAN_NO_DEX);

 


2. El segundo paso es escanear e instalar cada aplicación del sistema en el directorio "system \ app"

scanDirLI (mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);


3. El tercer paso es escanear el directorio "data \ app", que es la aplicación de terceros instalada por el usuario.

scanDirLI (mAppInstallDir, 0, scanMode);


4. El cuarto paso es escanear el directorio "data \ app-private" para instalar el archivo APK protegido por DRM (hasta ahora no se han encontrado tales aplicaciones).

scanDirLI (mDrmAppPrivateInstallDir, 0, scanMode | SCAN_FORWARD_LOCKED);

 

El proceso de instalación de la aplicación

1.scanDirLI (Filedir, int flags, int scanMode) recorre los archivos en el directorio especificado de la instalación

 

2.scanPackageLI (FilescanFile,

            Archivo destCodeFile, FiledestResourceFile, int parseFlags,

            int scanMode) instalar el archivo del paquete

 

3.scanPackageLI (

        Archivo scanFile, Archivo destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

Obtenga la estructura de información del paquete de instalación analizando el paquete de instalación parsePackage

 

4.mInstaller.install (pkgName, pkg.applicationInfo.uid,

              pkg.applicationInfo.uid); realizar el proceso de instalación de la copia del archivo

(Ruta del archivo de origen: frameworks \ base \ cmds \ installd \ installd.install)


2. Descarga de aplicaciones del mercado: las 
aplicaciones de Google Market deben iniciar sesión con una cuenta de Gmail antes de poder usarse. Después de seleccionar una aplicación, comienza a descargar el paquete de instalación. Durante este proceso, habrá una barra de progreso en el área de señales del teléfono. La instalación de la interfaz de Packagemanager se llama automáticamente, y la interfaz de llamada es la siguiente:

public voidinstallPackage (final Uri packageURI, final IPackageInstallObserver observer, final int flags)

paquete Uri finalURI: la ruta donde se guarda el archivo después de que se completa la descarga

Observador final de IPackageInstallObserver: procesando los resultados de instalación devueltos

banderas int finales: parámetros instalados, aplicaciones descargadas del mercado, el parámetro de instalación es -r (reemplazar)

El proceso de instalación de la función de interfaz installPackage:

1.public voidinstallPackage (

            final Uri packageURI, final IPackageInstallObserverobserver, final int flags,

            final String installerPackageName)

final StringinstallerPackageName: una vez completada la instalación, este nombre se guarda en la configuración, generalmente nulo, no un parámetro clave

2.FiletmpPackageFile = copyTempInstallFile (packageURI, res);

Copie el archivo apk al archivo temporal en el directorio temporal

3.private voidinstallPackageLI (Uri pPackageURI,

            int pFlags, boolean newInstall, String installerPackageName,

           Archivo tmpPackageFile, PackageInstalledInfo res)

Analice el archivo temporal para obtener el nombre del paquete de la aplicación pkgName = PackageParser.parsePackageName (

                   tmpPackageFile.getAbsolutePath (), 0);

4. Juzgue si hay un parámetro INSTALL_REPLACE_EXISTING, llame a replacePackageLI (pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg, forwardLocked, newInstall, installerPackageName,

                        res)

5. Si no es así, llame a installNewPackageLI (pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg, forwardLocked, newInstall, installerPackageName,

                        res);

6.privatePackageParser.Package scanPackageLI (

        Archivo scanFile, Archivo destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

El proceso posterior a scanPackageLI es el mismo que el proceso de instalación de la aplicación al inicio.

3. Instale
Android Debug Bridge (adb) desde la herramienta ADB  . Es una herramienta para la administración de dispositivos que viene con el SDK. También puede instalar aplicaciones para teléfonos móviles o emuladores a través de la línea de comandos ADB. El archivo fuente de la función de entrada es pm .Java

(Ruta del archivo de origen: android \ frameworks \ base \ cmds \ pm \ src \ com \ android \ commands \ pm \ pm.java)

La forma de la línea de comandos de ADB es adb install <path_to_apk>, y parámetros de instalación como: "-l" "- r" "-i" "-t"

Juzgar parámetros en la función runInstall ()

"-l" ―― INSTALL_FORWARD_LOCK

 "-r" —— INSTALL_REPLACE_EXISTING 

"-i" ——installerPackageName

"-t" —— INSTALL_ALLOW_TEST

Nuestro parámetro de uso común es -r, que significa sobrescribir la aplicación instalada del mismo nombre en el teléfono. La aplicación descargada del mercado también se instala directamente pasando este parámetro.

runInstall y market llaman a la misma interfaz para completar la instalación de la aplicación.

public voidinstallPackage (android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer, int flags, java.lang.String installerPackageName)

Cuarto, instalación de aplicaciones de terceros:
guarde el paquete de instalación de APK en la tarjeta SD a través de la instalación del archivo APK  en la tarjeta SD, acceda al paquete de instalación de APK en la tarjeta SD desde el teléfono, haga clic para iniciar la interfaz de instalación y el sistema application Packageinstaller.apk Procese el flujo de la interfaz de instalación y desinstalación de esta manera, como se muestra a continuación:


PackageInstallerActivity es responsable de analizar el paquete y determinar si es un archivo Apk disponible

Cree un archivo de instalación temporal /data/data/com.android.packageinstaller/files/ApiDemos.apk

E inicie la interfaz de confirmación de instalación startInstallConfirm, que enumera la información básica analizada de la aplicación. Si una aplicación con el mismo nombre ya está instalada en el teléfono, el usuario debe confirmar si desea reemplazar la instalación.

Después de confirmar la instalación, inicie InstallAppProgress y llame a la interfaz de instalación para completar la instalación.

pm.installPackage (mPackageURI, observer, installFlags);

Otros: 
1. La clase interna AppDirObserver de PackageManagerService.java implementa la función de monitorear el directorio de la aplicación: cuando arrastra un APK al directorio de la aplicación, puede llamar directamente a scanPackageLI para completar la instalación.

2. El archivo "data / system / packages.xml" en el directorio del área de datos del teléfono móvil contiene la información básica de todas las aplicaciones instaladas en el teléfono móvil, como la ruta de instalación, el permiso aplicado y otra información.


Dirección original: http://www.oschina.net/question/1249832_126587 

Supongo que te gusta

Origin blog.csdn.net/zhengjian1996/article/details/112916948
Recomendado
Clasificación