Android APK安装过程介绍

课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析

思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析;但现在整个PMS非常庞大。我们采取抓住某个功能点分析,由点到面,直到掌控全部

目录
现象    1
log分析    3
PackageInstaller 功能的提取    4
PackageInstaller/AndroidManifest.xml    4
PackageInstallerActivity.java    4
InstallAppProgress.java    4
PackageManager.java分析    5
1. installPackageWithVerificationAndEncryption    5
2. pm.installExistingPackage    5
PM/APM/PMS的关系    5
Apk安装流程图总纲    6
ApplicationPackageManager分析    6
PackageManagerService分析    8
installPackage    8
installPackageAsUser    8

现象
果宝三国.apk

 

log分析

ActivityManager:   START u0 {act=android.intent.action.VIEW dat=file:///storage/emulated/0/果宝三国.apk typ=application/vnd.android.package-archive cmp=com.android.packageinstaller/.PackageInstallerActivity (has extras)} from uid 10037 pid 7437 on display 0
ActivityManager:   Start proc com.android.packageinstaller for activity com.android.packageinstaller/.PackageInstallerActivity: pid=8691 uid=10095 gids={50095, 9997, 1028} abi=armeabi-v7a

要安装apk,ActivityManager根据Intent筛选 打开PackageInstaller

PackageInstaller:Launching settings
PackageManager:  Failed to generatePackageInfoFromSettingsLPw, There isnt package setting object for com.centurysoft.fruityrobo
PackageManager:  START_PACKAGE_INSTALL: observer{532627611}
PackageManager:            originPath{/storage/emulated/0/果宝三国.apk}
PackageManager:            flag{0}
PackageManager:            Request from{null}
PackageManager:            VerificationParams{VerificationParams{,mOriginatingUid=1000,mManifestDigest=ManifestDigest {mDigest=60,e1,a0,c0,72,ef,1c,21,4c,b9,a3,d8,bd,af,0e,af,05,8c,16,5b,ce,65,6a,ab,ac,45,d5,f9,66,8e,91,fa,},mInstallerUid=10095}}
PackageManager:  [MSG] INIT_COPY: observer{532627611}
PackageManager:            idx{0}
PackageManager:            for_user{UserHandle{0}}
PackageManager:  [MSG] MCS_BOUND: observer{532627611}
PackageManager:            for_user{UserHandle{0}}
PackageManager:  remove MCS_UNBIND message and Posting MCS_UNBIND 10 secs later
PackageManager:  [MSG] PROCESS_PENDING_INSTALL: observer{532627611}
PackageManager:  currentStatus{1}
PackageManager:  installPackageLI: path=/data/app/vmdl679148838.tmp
PackageManager:  verifying app can be installed or not
PackageManager:  Renaming /data/app/vmdl679148838.tmp to /data/app/com.centurysoft.fruityrobo-1
PackageManager:  installNewPackageLI: Package{1af2bbac com.centurysoft.fruityrobo}
PackageManager:  scanFileNewer : com.centurysoft.fruityrobo
PackageManager:  Resolved nativeLibraryRoot for com.centurysoft.fruityrobo to root=/data/app/com.centurysoft.fruityrobo-1/lib, isa=true
PackageManager:  Abis for package[com.centurysoft.fruityrobo] are primary=armeabi secondary=null
PackageManager:  Running dexopt on: /data/app/com.centurysoft.fruityrobo-1/base.apk pkg=com.centurysoft.fruityrobo isa=arm vmSafeMode=false interpret_only=false
PackageManager:  do mInstaller.dexopt : 0
PackageManager:  Time to dexopt com.centurysoft.fruityrobo: 4.943 seconds
PackageManager:  New package installed in /data/app/com.centurysoft.fruityrobo-1
PackageManager:  Not granting permission android.permission.MOUNT_UNMOUNT_FILESYSTEMS to package com.centurysoft.fruityrobo (protectionLevel=18 flags=0x8be44)
PackageManager:  Unknown permission com.android.launcher3.permission.READ_SETTINGS in package com.centurysoft.fruityrobo
PackageManager:  Unknown permission com.android.launcher2.permission.READ_SETTINGS in package com.centurysoft.fruityrobo
PackageManager:  doPostInstall for uid{10156}
PackageManager:  token 11 to BM for possible restore
PackageManager:  BM finishing package install for 11
PackageManager:  [MSG] POST_INSTALL: observer{532627611}
PackageManager:            Handling post-install for 11
Launcher.PackageChangeReceiver: onReceive = Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.centurysoft.fruityrobo flg=0x4000010 (has extras) }
PackageManager: result of install: 1{532627611}

PackageInstaller 通过一系列的校验之后 调用PMS来实现安装过程

PackageManager: result of install: 1{532627611} 表示安装成功,如果是其他的返回值表示安装不成功

PackageInstaller 功能的提取

PackageInstaller/AndroidManifest.xml

刚才的log如下:

act=android.intent.action.VIEW

dat=file:///storage/emulated/0/果宝三国.apk

typ=application/vnd.android.package-archive

PackageInstallerActivity.java

PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java

找构造方法和onCreate方法

构造方法:无

onCreate方法:

InstallAppProgress.java

PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

搜关键字“pm.” 关于安装的只有两个地方

搜索“pm =”,可以看到依赖 PackageManager 中的方法

PackageManager.java分析

1. installPackageWithVerificationAndEncryption

public abstract void installPackageWithVerificationAndEncryption(Uri packageURI,
        IPackageInstallObserver observer, int flags, String installerPackageName,
        VerificationParams verificationParams, ContainerEncryptionParams encryptionParams);

public abstract void installPackageWithVerificationAndEncryption(Uri packageURI,
        PackageInstallObserver observer, int flags, String installerPackageName,
        VerificationParams verificationParams, ContainerEncryptionParams encryptionParams);
installerPackageName 安装程序来自于哪,由哪个程序安装的

2. pm.installExistingPackage

因为这是首次安装,所以不走这个路径

Apk安装流程图总纲

ApplicationPackageManager分析

installPackageWithVerificationAndEncryption

installCommon

PackageManagerService 是 IPackageManager的实现类

PackageManagerService分析

installPackage

installPackageAsUser

对userId和callingUid判断是否合法

判断安装请求 来自于哪里ADB还是其他程序

判断是对所有用户安装还是只针对当前用户

EnterpriseDeviceManager对请求进行判断

各种检查完成,开始进入安装阶段

打出要安装的apk的信息

KNOX的feature,强制apk安装到SD卡

获取Apk默认安装路径

以不信任的方式获取apk,确定要安装的路径(内部存储器、外部存储器)

封装一个异步消息 INIT_COPY,发送 (含义:启动复制)

/android/frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

DefaultContainerService中实现了 IMediaContainerService.Stub

MCS服务在创建连接时会发送MCS_BOUND异步消息

处理MCS_BOUND异步消息

由上面的分析可以得出,代码实际调用的是InstallParams

InstallParams.handleStartCopy流程图如下:

FileInstallArgs

int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException

AsecInstallArgs

int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException

/android/frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

时间: 2024-10-29 23:50:30

Android APK安装过程介绍的相关文章

Android APK安装过程学习笔记

1.什么是APK APK,即Android Package,Android安装包.不同平台的安装文件格式都不同,类似于Windows的安装包是二进制的exe格式,Mac的安装包是dmg格式.APK可以再Android上执行安装,APK的本质是一个Zip压缩包,只是后缀被修改为apk,其中打包了源代码编译出的class.dex.一些图片视屏资源文件和一些Native库文件.APK文件与Zip文件最大的一个不同是APK包含签名文件,用于保证安装包安全不被修改. 2.什么是DEX文件和ODEX文件 J

2.EVE-NG安装过程介绍

文章列表(关注微信公众号EmulatedLab,及时获取文章以及下载链接) 1.EVE-NG介绍(EVE-NG最好用的模拟器,仿真环境时代来临!) 2.EVE-NG安装过程介绍 3.EVE-NG导入Dynamips和IOL 4.EVE-NG导入QEMU镜像 5.EVE-NG关联SecureCRT,VNC,Wireshark 6.EVE-NG网卡桥接,带您走进更高级的实验 7.EVE-NG硬盘扩容,存储海量镜像 8.EVE-NG定制个人镜像,脚本快速导入 9.EVE-NG容纳H3C.Huawei,

Android系统启动时的apk安装过程

1.前言 在Android系统启动的过程中,系统会通过PackageManagerService来扫描特定的目录,以便可以对保存在里面的apk进行安装.PackageManagerService主要做两件事情: - 解析这个apk的配置文件AndroidManifest.xml以便获得它的安装信息 - 为这个apk分配Linux用户ID和用户组ID以便apk在系统中可以获取到合适的运行权限 下面我们来开始分析PackageManagerService是如何安装apk并执行上面两件事情的 2.源码

深度探究apk安装过程

一.先验知识 0.PcakageaManagerService版本变化 1.概述 2.PackageManagerService服务启动流程 3. PackageManagerService入口 二.四种安装方式 1.系统应用安装2.网络下载应用安装3. ADB工具安装 4.第三方应用安装 三.总结 概述 1.1概述 众所周知,Android应用最终是打包成.apk格式(其实就是一个压缩包),然后安装至手机并运行的.APK即Android Package的缩写. Android系统在启动的过程中

Android apk打包过程

概述 android打包过程,下面这张图取自Android开发权威指南,非常清晰. 整个过程使用的工具有 名称 功能介绍 在操作系统中的路径 aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt aidl Android接口描述语言转化为.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl javac Java Compiler ${JDK_HOME}/javac或/usr/bin/j

android Apk打包过程概述_android是如何打包apk的

最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成R.java文件 2.处理aidl文件,生成相应java 文件 3.编译工程源代码,生成相应class 文件 4.转换所有class文件,生成classes.dex文件 5.打包生成apk 6.对apk文件进行签名 7.对签名后的apk文件进行对其处理 打包过程使用的工具 名称 功能介绍 在操作系统中的

Android打包安装过程

1. 打包安装过程:即 Run as Android Application 1. 生成apk文件. 1). 生成.dex文件(将.java生成.dex).:.java --> javac --> .class --> dx.bat --> .dex 2). 资源索引表的生成resources.arsc. 3). 准备未编译文件. 4). 清单文件AndroidMenifest.xml文件转换成二进制. 5). 使用debug.keystore对整个应用程序进行打包签名. 2. 加

Android应用安装过程及原理

#标签:读博客 看了一圈我就笑了,其实最后安装都回到了PMS的调用. :) 本文转载自:http://www.miui.com/thread-759958-1-1.html Android应用安装的流程及路径: 应用安装涉及到如下几个目录: system/app               系统自带的应用程序,无法删除 data/app                   用户程序安装的目录,有删除权限.安装时把apk文件复制到此目录 data/data                   存放

怎么让一个android APK安装之后无法卸载?

============问题描述============ 要给学生安装一个管理软件  不能被卸载   有人知道怎么做么? ============解决方案1============ 这么一分析 要想把软件做成这样,还是有办法的: 你去找谷歌,把你的软件集成到android系统里 ============解决方案2============ 写俩apk  一个是管理 一个是服务 做嵌套. 重点在服务,开机自动启动,各种状态全不显示,只在程序进程里显示.如果管理那个被删了,服务检测到的话 在连网的情况