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 也正常進行安裝了

   不過還是沒搞懂爲什麼沒修改之前其他手機是可以的,如果又大佬碰巧看到我的疑問,希望解答一下。

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