此項目是基於 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 也正常進行安裝了
不過還是沒搞懂爲什麼沒修改之前其他手機是可以的,如果又大佬碰巧看到我的疑問,希望解答一下。