在做桌面產品的時候,發現一些機型存在將桌面默認后重啟手機出現卡死的情況,通過查看log,出現錯誤信息在手機系統啟動加載完androidmanifest.xml,開始進行contentproveder的加載注冊處理時發生。查看相關部分的功能處理代碼無果后,將關注點放在了androidmanifest.xml中的權限聲明中。
application的屬性 android:persistent,如果將android:persistent=“true",其目的是為了希望程序常駐內存,但前提是程序必須為系統程序,即其安裝目錄為/system/apk/目錄下才會有效。這樣的程序需要重啟手機后才會起效。正常的程序安裝后路徑為 /data/apk/目錄下,因此即使設置了該屬性也不會有效果。
一些手機,特別實三星的部分手機會根據這個權限的設置去做檢查,使得contentprovider在加載與關聯時,認為其不具備系統級的權限使得contentprovider不斷的重復循環執行,因此導致程序運行失敗。
使用android:persistent時慎重使用。如不是系統級別的應用,不推薦使用。
persistent屬性介紹
系統應用開發中,一些特殊的應用需要加上 persistent 屬性來保證應用的持久性,提高應用的存活。persistent 是用于控制應用程序特殊持久模式的標志。通常情況下不應被應用程序使用,要求系統始終保持應用程序的運行。persistent 為true時則當應用被強制殺掉后,應用會進行重啟,當然如果應用奔潰也會導致一系列問題。
persistent 屬性用法如下:
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/settings_launcher_ic"
android:label="@string/app_name"
android:persistent="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
...
persistent應用不建議用于安裝,如果已經安裝了應用,則需要卸載后再安裝,或者push到系統app目錄下。
由于persistent應用在啟動時 AM S會對系統system應用的 Manifest 進行緩存,因此在push應用后,Manifest 依舊為原來的配置,需要對此目錄中對應的應用緩存刪除,Android 9的目錄為:
/data/system/package_cache/1
或者刪除原有 /system/priv-app/ 下的應用,再install apk安裝,每次安裝apk時會生成新的安裝應用的緩存。
如果不想刪除緩存,也可以修改版本號編譯新apk放入系統目錄下。