Android 初始化Setup Wizard——Provision

  今天说说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

  • 设置DEVICE_PROVISIONED标记
  • 禁止Provision本身的Activity组件

整个Provision程序只作了这两件事,DEVICE_PROVISIONED就是咱们上面说的系统升级完标记。这个标记是保存在:component

 

保存在settings.db里面,准确来讲是settings.db的secure表里面。xml

 

二、禁止组件htm

  上面说了Provision其中一个功能,写入一个标记。除了写入标记,还有一个禁止自己Activity组件的功能。先简单介绍一下禁止组件的API。

void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
  • componentName:组件名称 
  • newState:组件新的状态,能够设置三个值,分别是以下: 
  •   不可用状态:COMPONENT_ENABLED_STATE_DISABLED 
  •   可用状态:COMPONENT_ENABLED_STATE_ENABLED 
  •   默认状态:COMPONENT_ENABLED_STATE_DEFAULT 
  • flags:行为标签,值能够是DONT_KILL_APP或者0。 0说明杀死包含该组件的app

 

禁止组件功能后,系统的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 

相关文章
相关标签/搜索