OTA升级后Home键失灵
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
OTA升级系统后Home键按下有反馈,但是没有相应的功能。
[SOLUTION]
请检查Provision.apk应用是否正常升级,并确认settings数据库中DEVICE_PROVISIONED是否已
经写为1.
Provision的作用很简单,就是一个系统初始化引导程序,原生的android里面
Provision只做了一件事,就是写入一个DEVICE_PROVISIONED标记。不过这个标记作
用很大,这个标记只会在系统全新升级(双清)的时候写入一次,代表了Android系
统升级准备完成,可以正常工作。系统在不格式化/data/分区的情况下(不进行双清操作)有可能会导致
一个问题,机器的Home键按了没反应。
1、Provision程序
首先,Provision在系统源码packages/apps下面,我们先看看Provision的配置
:
<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属性。
第二:priority=1,配置了优先级,也就是说它的优先级比我们原生的
Launcher优先级还要高,它会在Launcher启动前就运行起来。
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,主要做了两件
事:
设置DEVICE_PROVISIONED标记
禁止Provision自己的Activity组件
整个Provision程序只做了这两件事,DEVICE_PROVISIONED就是我们上面说的系
统升级完标记。
2、禁止组件
上面说了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/packages.xml
<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标记是
否正常。
OTA升级系统后Home键按下有反馈,但是没有相应的功能。
[SOLUTION]
请检查Provision.apk应用是否正常升级,并确认settings数据库中DEVICE_PROVISIONED是否已
经写为1.
Provision的作用很简单,就是一个系统初始化引导程序,原生的android里面
Provision只做了一件事,就是写入一个DEVICE_PROVISIONED标记。不过这个标记作
用很大,这个标记只会在系统全新升级(双清)的时候写入一次,代表了Android系
统升级准备完成,可以正常工作。系统在不格式化/data/分区的情况下(不进行双清操作)有可能会导致
一个问题,机器的Home键按了没反应。
1、Provision程序
首先,Provision在系统源码packages/apps下面,我们先看看Provision的配置
:
<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属性。
第二:priority=1,配置了优先级,也就是说它的优先级比我们原生的
Launcher优先级还要高,它会在Launcher启动前就运行起来。
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,主要做了两件
事:
设置DEVICE_PROVISIONED标记
禁止Provision自己的Activity组件
整个Provision程序只做了这两件事,DEVICE_PROVISIONED就是我们上面说的系
统升级完标记。
2、禁止组件
上面说了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/packages.xml
<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标记是
否正常。
