前言:
本篇文章是对系统包安装流程的总结,基于Android12 上 com.android.packageinstaller
源码的分析,第三方应用商城(华为商城,小米商城,应用宝,豌豆荚,酷安等)下载安装应
用,在普通安装和静默安装app两种方式下,对代码流程的梳理和讲解。
触发安装:
当你在商城界面中点击安装按钮,应用会自动下载,下载完成后就会调起系统安装应用的界面,此种触发方式一般是通过Intent 隐式调用的,我们先阅读如下代码:
Android7.0之前的跳转:
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri ,"application/vnd.android.package-archive");
startActivity(intent);
但是在Android7.0 之后,直接调用的话会报Caused by:android.os.FileUriExposedExceptiony异常,原因是,安卓官方为了提高私有文件的安全性,在 Android 7.0 或更高版本的应用私有目录被限制访问,如果要访问私有文件的话,官方推荐使用FileProvider机制,系统源码文件管理(com.android.documentsui)中有参考例子,我们可以拿这个来讲解一下
1. 首先在AndroidManifest.xml 定义一个FileProvder, 可以自定义,也可以直接用系统的,下面的代码就是直接用androidx.core.content.FileProvider 这个类:
<manifest>
...
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.android.documentsui.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
如果自定义FileProvider类的话,就需要继承FileProvider,如下:
//#1. 继承FileProvider
public class MyFileProvider extends FileProvider {
public MyFileProvider() {
super(R.xml.file_paths)
}
}
//#2. AndroidManifest.xml中组件声明:
<manifest>
...
<application>
...
<provider
android:name="com.sample.MyFileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false" #FileProvider 是不需要公开的
android:grantUriPermissions="true"> #允许您授予对文件的临时访问权限
...
</provider>
...
</application>
</manifest>
2.配置file_paths.xml文件后,FileProvider 就能为预先指定的目录中的文件生成可以被访问的内容URI,在源码FileProvider.java 文件中有配置的说明
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--external-path 对应 Environment.getExternalStorageDirectory()-->
<external-path name="name" path="." />

本文详细介绍了Android系统中第三方应用商城如何通过Intent启动系统安装流程,特别是针对Android7.0后的FileProvider机制。内容包括正常安装和静默安装的区别,以及在不同Android版本下如何处理文件Uri,确保安全地启动安装界面。同时,文章还分析了包安装过程中涉及的Activity和Intent,如InstallStart、InstallStaging、PackageInstallerActivity等,以及如何处理安装过程中的各种状态和异常情况。
最低0.47元/天 解锁文章
4654

被折叠的 条评论
为什么被折叠?



