首页 > 编程知识 正文

app软件一直处于安装状态,为什么app安装过程老是闪退

时间:2023-05-03 12:57:07 阅读:218059 作者:2116

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

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

出现问题的版本: android 10

代码排查

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

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

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

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 也正常进行安装了

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。