今天說說Provision這個APK,可能不少朋友都不知道有這個APK存在。Provision的做用很簡單,就是一個系統初始化引導程序,原生的Android裏面Provision只作了一件事,就是寫入一個DEVICE_PROVISIONED標記。不過這個標記做用很大,這個標記只會在系統全新升級(雙清)的時候寫入一次,表明了Android系統升級準備完成,能夠正常工做。html
之因此會關注DEVICE_PROVISIONED這個標記,是由於我在升級系統的時候遇到一個問題。系統在不格式化/data/分區的狀況下(不進行雙清操做)有可能會致使一個問題,機器的Home鍵按了沒反應。android
一、Provision程序app
首先說說一下Provision,Provision在系統源碼packages/apps下面,咱們先看看Provision的配置:ide
<application>
<activity android:name="DefaultActivity" android:excludeFromRecents="true">
<intent-filter android:priority="1">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
從上面代碼能夠看到兩個比較有意思的地方,第一:Provision配置了category.HOME屬性,作系統開發的朋友應該都瞭解,category.HOME是桌面程序的標記,簡單點說就是Launcher程序纔會配置的標記。this
第二:priority=1,配置了優先級,也就是說它的優先級比咱們原生的Launcher優先級還要高,它會在Launcher啓動前就運行起來。spa
//Edited by mythou
//http://www.cnblogs.com/mythou/
public class DefaultActivity extends Activity { @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); // Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Secure.putInt(getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 1); // remove this activity from the package manager.
PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); // terminate the activity.
finish(); } }
上面就是Provision的所有源碼,Provision只有一個Activity,並且作的事情很少。主要作了兩件事:code
整個Provision程序只作了這兩件事,DEVICE_PROVISIONED就是咱們上面說的系統升級完標記。這個標記是保存在:component
保存在settings.db裏面,準確來講是settings.db的secure表裏面。xml
二、禁止組件htm
上面說了Provision其中一個功能,寫入一個標記。除了寫入標記,還有一個禁止自己Activity組件的功能。先簡單介紹一下禁止組件的API。
void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
禁止組件功能後,系統的package信息會記錄下來,有關係統的package信息都是保存在/data/system/
//Edited by mythou
//http://www.cnblogs.com/mythou/
<package name="com.android.provision" codePath="/system/app/Provision.apk" nativeLibraryPath="/data/data/com.android.provision/lib" flags="1" ft="11b7e237e00" it="11b7e237e00" ut="11b7e237e00" version="15" userId="10005">
<sigs count="1">
<cert index="1" />
</sigs>
<disabled-components> <item name="com.android.provision.DefaultActivity" /> </disabled-components>
</package>
上面就是記錄了package裏面被禁止的組件信息。固然,package.xml裏面還包含了應用包全部信息,這個能夠本身看一下。
這個組件只會運行一次,因此咱們若是沒有格式化/data目錄,這個組件就會被禁止。因此會致使一個問題,就是咱們的DEVICE_PROVISIONED標記不會再次寫入。
若是你遇到了機器Home鍵沒有做用,能夠檢查一下DEVICE_PROVISIONED標記是否正常。
三、結語
今天主要是說說原生的Provision做用,其實咱們能夠在Provision裏面作一些升級後須要完成的事情,好比咱們在電阻屏上須要進行座標校準。就能夠在Provision裏面首先運行座標校準,由於它會在Launcher以前運行。
這問題也查了好久,除了Provision外,還分析了Home鍵的詳細處理機制。後面有空再分析一下Home鍵的處理機制。
Edited by mythou
原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3425570.html