APP 应用内更新,下载安装包之后调起安装界面无反应/安装界面闪退返回到了 APP 页面

此项目是基于 mPaaS 框架,更新 APP 的功能

最近测试提的一个缺陷,线上的 APP 更新时,点击更新下载完安装包后点击安装无法调起 APP 安装。

出现问题的版本: android 10

  • 代码排查

(PS:因为测试说是在 android 10 才会出现的问题,所以从一开始就朝着 android 10 适配的方向去排查问题)

  1. 1 “私有目录” 的适配(安卓 10 上对于目录权限的改动大家可以自行百度)

     查看安装包下载的目录,发现下载好的新的安装包是存储在报名目录下的 download 文件夹中,所以排除了访问外部目录导致这个因素。

  1. 2 安卓10 对于后台启动 Activity 做了限制

     安装操作是用户点击 “安装更新” 按钮才调起安装界面的,因而这个因素也可以排除

【黑人问号.gif】,那不对呀!安卓 10 上的改动与更新安装包有关的也就这两个点了,感觉方向有点跑偏了......

 

  • 没有其他思路了,抱着死马当活马医的心态我插上了数据线打算调试一下。(手上的测试机:华为 Mate 20 Pro/ Android 10.0)

       无论怎么点击立即安装,APP 都没有作出任何反应,日志上也看不到明显的报错(然后我忍痛将自己的手机【Redmi K20 Pro / Android 9.0】 升级到了安卓 10 )

       好消息是,用 Redmi 手机调试的时候可以看到点击 “立即更新” 会跳转到系统安装页面又很快闪退回来 APP。日志中可以看到明显的报错信息是缺少了 REQUEST_INSTALL_PACKAGES 这个权限,加上这个权限后在 Mate 20 Pro 和 Redmi K20 就可以正常调起安装页面了。

      出了新包,通知测试进行复测后,测试传来捷报,华为 Mate 30 Pro 依旧无法调起安装页面(我也是很无奈,Mate 20 可以,Mate 30 不行,安卓机型的适配一直都是个大坑,总是会有一些莫名其妙的问题),没办法,只能接着排查问题。

      顺着安卓 10 私有目录的思路(我想 APP 无法调起安装页面的原因会不会是因为访问不到下载好的安装包)浏览了不少的博客文章,发现一个跟 “私有目录” 相关的一个东西,就是 FileProvider。FileProvider 是安卓 7.0 引入的一个机制,用来对 file://uri 的使用进行规范(关于 FileProvider 的使用有兴趣的自行百度)。

     在使用 FileProvider 的时候,我们会再 AndroidManifest.xml 文件中配置 provider

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

   其中 file_paths 的内容如下所示(代码中配置的目录则会决定外部 APP 所能够访问的你的 APP 的路径,下面的是我修改过的,考虑到如果是因为安装程序无权限访问 APP 安装包所在的目录,所以就把原来配置的 <external-files-path> 路径修改成了安装包所在的目录):

<!--
<root-path/> 代表设备的根目录new File("/");
<files-path/> 代表context.getFilesDir()
<cache-path/> 代表context.getCacheDir()
<external-path/> 代表Environment.getExternalStorageDirectory()
<external-files-path>代表context.getExternalFilesDirs()
<external-cache-path>代表getExternalCacheDirs()
-->

<paths>
    <files-path path="." name="sdcard"/>

    <external-files-path
        name="download"
        path="com..android.upgrade/downloads" />
    <external-path
        name="download_sdcard"
        path="files/com.android.upgrade/downloads" />

</paths>

   开心的是这个猜想是正确的,修改完之后 Mate 30 Pro 也正常进行安装了

   不过还是没搞懂为什么没修改之前其他手机是可以的,如果又大佬碰巧看到我的疑问,希望解答一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章