Android PackageManagerService 总结(一)应用市场下载安装apk流程

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

前言:

        本篇文章是对系统包安装流程的总结,基于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="."  />
    
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值