-
Notifications
You must be signed in to change notification settings - Fork 778
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-09-29:请简述Apk的安装过程? #157
Comments
PackageInstaller 原理简述 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。 Android应用安装有如下四种方式
应用安装的流程及路径 system/app data/app 安装时把apk文件复制到此目录 data/data Data/dalvik-cache
一、系统应用安装: (源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java) PackageManagerService服务启动的流程:
2.第二步扫描安装“system\app”目录下的各个系统应用 scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode); 3.第三步扫描“data\app”目录,即用户安装的第三方应用 scanDirLI(mAppInstallDir, 0, scanMode); 4.第四步扫描" data\app-private"目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)。 scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED); 安装应用的过程 1.scanDirLI(Filedir, int flags, int scanMode) 遍历安装指定目录下的文件 2.scanPackageLI(FilescanFile,
3.scanPackageLI(
通过解析安装包parsePackage获取到安装包的信息结构 4.mInstaller.install(pkgName,pkg.applicationInfo.uid,
(源文件路径:frameworks\base\cmds\installd\installd.install) 二、从market上下载应用: public voidinstallPackage(final Uri packageURI, final IPackageInstallObserver observer,final int flags) final Uri packageURI:文件下载完成后保存的路径 final IPackageInstallObserver observer:处理返回的安装结果 final int flags:安装的参数,从market上下载的应用,安装参数为-r (replace) installPackage接口函数的安装过程: 1.public voidinstallPackage(
final StringinstallerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数 2.FiletmpPackageFile = copyTempInstallFile(packageURI, res); 把apk文件复制到临时目录下的临时文件 3.private voidinstallPackageLI(Uri pPackageURI,
解析临时文件,获取应用包名pkgName = PackageParser.parsePackageName(
4.判断如果带有参数INSTALL_REPLACE_EXISTING,则调用replacePackageLI(pkgName,
5.如果没有,则调用installNewPackageLI(pkgName,
6.privatePackageParser.Package scanPackageLI(
scanPackageLI以后的流程,与开机时的应用安装流程相同。 三、从ADB工具安装 (源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java) ADB命令行的形式为adb install <path_to_apk> ,还可以带安装参数如:"-l""-r" "-i" "-t" 函数runInstall()中判断参数 "-l"――INSTALL_FORWARD_LOCK "-r"——INSTALL_REPLACE_EXISTING "-i" ——installerPackageName "-t"——INSTALL_ALLOW_TEST 我们常用的参数为-r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。 runInstall与market调用同样的接口完成应用安装。 public voidinstallPackage(android.net.Uri packageURI,android.content.pm.IPackageInstallObserver observer, int flags,java.lang.String installerPackageName) 四、第三方应用安装――通过SD卡里的APK文件安装 PackageInstallerActivity负责解析包,判断是否是可用的Apk文件 创建临时安装文件/data/data/com.android.packageinstaller/files/ApiDemos.apk 并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安装有同名应用,则需要用户确认是否要替换安装。 确认安装后,启动InstallAppProgress,调用安装接口完成安装。 pm.installPackage(mPackageURI,observer, installFlags); 其它:
2.手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。 |
面试的时候能把这么长的背下来? |
1.安装方式 2.安装常用目录 3.APK安装四大步骤
|
复制APK安装包到/data/app目录下,解压缩并扫描安装包,向资源管理器注入APK资源,解析AndroidManifest文件,并在/data/data目录下创建对应的应用数据目录,然后针对Dalvik/ART环境优化dex文件,保存到dalvik-cache目录,将AndroidManifest文件解析出的组件、权限注册到PackageManagerService并发送广播。 |
No description provided.
The text was updated successfully, but these errors were encountered: