当前位置: 首页 > news >正文

Android 初始化Setup Wizard——Provision

今天说说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="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程序才会配置的标记。

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

 

复制代码
 
//Edited by mythou
//http://www.cnblogs.com/mythou/

public class DefaultActivity extends Activity 
{@Overrideprotected 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就是我们上面说的系统升级完标记。这个标记是保存在:

 

保存在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="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标记是否正常。

 

3、结语

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

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

 

 

Edited by mythou

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

http://www.xdnf.cn/news/819631.html

相关文章:

  • 软考 | 2012年上半年 软件设计师 下午试卷
  • 个人博客论坛系统测试报告
  • 高等数学基础篇(数二)之二重积分(解析版)
  • Zero Sum 和为零
  • 【AI】2114- 汇总 11 个 AI 领域的优质飞书知识库,完全免费,赶紧收藏起来!
  • 【高校主办!国际高级别组委加入!EIScopus检索】2024年经济决策与人工智能国际学术会议 (EDAI 2024)
  • 什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!
  • centos7下升级openssh9.6版本以上远程连接报ssh服务器不能连接错误
  • Windows运行命令大全
  • 这儿有你所需要的所有关于科研的网址
  • Linux 命令chmod(文件管理)
  • Lightbox JS v2.0
  • 百度笔试题面试题集总
  • checklistbox控件用法总结
  • 软件外包公司对比:海辉、软通、东软集团等
  • surfacecreated啥时被调用_小豪爱上JVM--运行时数据区 | 面试必问
  • Macbook air(2012 MID)乞丐版升级——继续发挥余热
  • visio2002无法安装(您必须首先安装Enterprise Architect Edition of visual Studio.Net2003)的解决方案
  • 分享54个ASP.NET源码总有一个是你想要的
  • Web前端-BOM之Navigator对象
  • Linux内核中内存相关的操作函数
  • 由于找不到d3dx9_26.dll文件导致游戏软件无法运行启动问题
  • 《Microsoft Visual Studio 6.0 Enterprise Edition》(完整9CD,带中文MSDN Library)下载
  • Qt学习笔记之--Qt内置图标一览表
  • ASCII码对照表(HTML颜色代码表)
  • C语言程序设计经典例题100道(四)
  • 性能优化之YUICompressor压缩JS、CSS
  • 未能找到你安装了radmin服务器,Radmin
  • 服务器如何端口映射?
  • 全网最全!分子材料计算模拟软件Materials Studio安装教程(附安装包),以及使用教程!...