今天说说Provision这个APK,可能很多朋友都不知道有这个APK存在。Provision的作用很简单,就是一个系统初始化引导程序,原生的Android里面Provision只做了一件事,就是写入一个DEVICE_PROVISIONED标记。不过这个标记作用很大,这个标记只会在系统全新升级(双清)的时候写入一次,代表了Android系统升级准备完成,可以正常工作。

  之所以会关注DEVICE_PROVISIONED这个标记,是因为我在升级系统的时候遇到一个问题。系统在不格式化/data/分区的情况下(不进行双清操作)有可能会导致一个问题,机器的Home键按了没反应。

1、Provision程序

  首先说说一下Provision,Provision在系统源码packages/apps下面,我们先看看Provision的配置:

    <application>
<activity android:name="DefaultActivity"
android:excludeFromRecents="true">
<intent-filter android:priority="">
<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程序才会配置的标记。

  第二:priority=1,配置了优先级,也就是说它的优先级比我们原生的Launcher优先级还要高,它会在Launcher启动前就运行起来。


//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, ); // 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就是我们上面说的系统升级完标记。这个标记是保存在:

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

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/


//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="" ft="11b7e237e00" it="11b7e237e00"
ut="11b7e237e00" version="" userId="">
<sigs count="">
<cert index="" />
</sigs>
<disabled-components>
<item name="com.android.provision.DefaultActivity" />
</disabled-components>

</package>

  上面就是记录了package里面被禁止的组件信息。当然,package.xml里面还包含了应用包所有信息,这个可以自己看一下。

  这个组件只会运行一次,所以我们如果没有格式化/data目录,这个组件就会被禁止。所以会导致一个问题,就是我们的DEVICE_PROVISIONED标记不会再次写入。

  如果你遇到了机器Home键没有作用,可以检查一下DEVICE_PROVISIONED标记是否正常。

3、结语

  今天主要是说说原生的Provision作用,其实我们可以在Provision里面做一些升级后需要完成的事情,比如我们在电阻屏上需要进行坐标校准。就可以在Provision里面首先运行坐标校准,因为它会在Launcher之前运行。

  这问题也查了很久,除了Provision外,还分析了Home键的详细处理机制。后面有空再分析一下Home键的处理机制。

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3425570.html 

Android 初始化Setup Wizard——Provision的更多相关文章

  1. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  2. Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)

    电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...

  3. node.js setup wizard ended prematurely Win7安装nodejs失败解决方法

    笔记本win7在nodejs官方网站下载.msi文件安装,安装到一半的时候,进度条提示:roll back,because of a error.node.JS setup wizard ended ...

  4. 通过sougou输入法,解决卡在Setup Wizard(小绿人)界面

    本人使用海信EG900手机(安卓2.3.5,已root),为了使用google的服务,先后手动复制和CWM recovery刷入google服务包(gapps-gb-20110828-signed.z ...

  5. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  6. node.js Setup Wizard ended prematurely 安装失败

    解决: 1. 按照管理员权限运行. 2.安装时禁用掉node 运行环境中的performance counters 和 ETW,或者可以尝试先禁用performance counters .

  7. android studio 提示翻译

    1. you can import your settings from a previous version of Studio可以导入您的设置从先前版本的工作室 2. I want to impo ...

  8. Ubuntu 安装Android Studio与使用手册

    用的是Ubuntu 12.04 1.先去下载,国内可以去这里下载 https://github.com/inferjay/AndroidDevTools 2.下载后解压进入android-studio ...

  9. Windows10下搭建Android Studio3.12开发环境

    1.准备工作: 操作系统:Windows10 专业版或企业版 JDK安装:参考文章 http://www.cnblogs.com/yuwentao/p/4742575.html =========== ...

随机推荐

  1. singleton注意

    如果singleton里面的构造函数里面对资源进行了初始化,那么程序退出时,需要一个release进行资源释放,并且设置instance = null;

  2. STL之map应用 +hash表(51nod 1095)

    题目:Anigram单词 题意:给出词典,再给出一些单词,求单词的Anigram数量. 思路:先将字串转换成哈希表,然后再用map链接. hash表构造方法汇总:http://www.cnblogs. ...

  3. HTML控件篇 -- input

    1. 取消input提示框及自动填充: <input type="text" autocomplete="off" /> 处理chrome下自动填充 ...

  4. Linux内核分析之跟踪分析Linux内核的启动过程

    一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...

  5. django rest_framework--入门教程3

    rest_framwork 之post 与put rest_framwork可以接受post与put delete get请求,可以对资源进行刚CRUD,以一个DEMO为例, 1.先在VIEW里定义一 ...

  6. 检查密码复杂度的C#正则表达式

    在用户注册与修改.重置密码时,强制密码达到一定的复杂度,是减少盗号的有效措施之一. 而在代码中检查密码复杂度就需要用到正则表达式,比如要求密码必须包含数字.小写或大写字母.特殊字符.字符数在8-30之 ...

  7. 我没发现Mvc里的 web.config 有什么用。

    实验过程 由于 Mvc2+ 引入 Area ,导致文件夹结构发生变化. Mvc下的 web.config 所在的位置是: ~/Areas/MySystem/Views/Web.config 对应的请求 ...

  8. 修改注册表来修改IE的设置---资料汇总

    原文链接: http://blog.csdn.net/wangqiulin123456/article/details/17068649 附带批处理执行脚本: @echo off &title ...

  9. 重装Eclipse、离线安装ADT、Android SDK

    由于最新的ADT.Android SDK需要最新版本的Eclipse才能使用,我无奈的只好升级Eclipse.看看自己的Eclipse已经两年没有升级了,也是时候升级了.升级前,有很多的顾虑.因为像这 ...

  10. 设置jenkins代理

    http://stackoverflow.com/documentation/jenkins/919/introduction-to-jenkins Natively, Jenkins runs on ...