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

 

保存在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键的处理机制。

android provision相关推荐

  1. Android Provision (OOBE)

    Android Provision (OOBE) 源码路径:android/packages/apps/Provision 在Android的原生代码中,Priovision只是一个第一次启动的设置向 ...

  2. Android 系统(123)---MTK android 常用修改点

    MTK android 常用修改点 1. *#06#等关键码判断文件 SpecialCharSequenceMgr.java 2.音效 ControlPanelEffect.java 3.版本号修改 ...

  3. Android 设置向导启动分析

    一.Android 系统启动流程 Bootloader 系统引导 启动 Linux 内核 启动 init 进程 启动 Zygote 进程 启动 SystemServer 进程 启动 Binder 线程 ...

  4. Android开机向导setupwizard,设置系统语言,WiFi向导

    Android的框架设计有考虑到开机向导这一场景,因此我们实现开机向导参考Android的Provision.apk Provision: MSM8976/repo/packages/apps/Pro ...

  5. Android 5.1 AppOps总结

    什么是AppOps 涉及的类 常用名词 权限管理是如何触发的 系统默认应用权限 AppOps Policy 文件 AppOpsService准备工作 详细分析权限管理的触发 应用层对权限的设置 什么是 ...

  6. 关于Provision.apk

    今天遇到一个应用无法打开的问题,跟踪代码发现app在onCreate的时候会检查 inKeyguardRestrictedInputMode() 这是KeyguardManager的方法 解释为: / ...

  7. poco for android,POCO桌面(com.mi.android.globallauncher) - 2.6.8.25 - 应用 - 酷安

    权限信息 · com.android.launcher.permission.INSTALL_SHORTCUT · com.miui.home.launcher.permission.UNINSTAL ...

  8. android ROM设置默认Launcher(主屏幕应用)

    Launcher Launcher是android系统的桌面.是android系统的主要组件.android系统允许存在多个Launcher并设置默认主界面. 应用程序作为Home(主界面)需在Act ...

  9. ActivityManagerService解读之Activity启动时间闲聊--Android Framework层时间计算介绍

    从ActivityManagerService解读之Activity启动初探,到ActivityManagerService解读之Activity启动再探,到ActivityManagerServic ...

  10. MTK android 常用修改点

    1. *#06#等关键码判断文件 SpecialCharSequenceMgr.java 2.音效 ControlPanelEffect.java 3.版本号修改 bulid/core/build_i ...

最新文章

  1. 日10亿级处理,基于云的微服务架构
  2. 一个包从服务器到达客户端
  3. 密码学:RSA加密算法详解
  4. Content-Type一览
  5. 可以输入值的下拉框(select和input的组合使用)
  6. 越来越受欢迎的Vue想学么,90后小姐姐今儿来教你
  7. 6、宏定义与预处理、函数与函数库
  8. C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074
  9. android分享到新浪微博,认证+发送微博
  10. lomboz eclipse怎么连接oracle10,lomboz eclipse 3.3的安装和连接oracle 11g(图解详细教程)...
  11. 局域网文件管理系统_企业能耗管理系统「斯必得智慧物联」
  12. 2021年最佳Selenium替代品
  13. OpenBmc开发13:添加传感器(fan)
  14. 总结 27 类深度学习主要神经网络:结构图及应用
  15. safenet 超级狗 java调用 小计
  16. 在 WPS Word中成功使用zetero
  17. 【已解决】ThinkdPad X1 麦克风没声音
  18. CocosCreator微信小游戏排行榜及开放数据域的理解与使用
  19. 起点小说免费看 Scrapy爬取起点小说网数据导入MongoDB数据
  20. 电脑爱好者2012年5-12期

热门文章

  1. 渗透测试详解及爱加密加固使用及优势
  2. matlab 传函将s换为jw,2010MATLAB及控制系统仿真_总复习.ppt
  3. bak 安全牛 kali link
  4. 【XJTUSE计算机图形学】第三章 几何造型技术(3)——B样条曲线与曲面
  5. ubuntu服务器lxde桌面,LXDE桌面环境简介
  6. 人工神经网络心得体会_图神经网络打卡心得体会
  7. 关于在数据库中如何存储时间这件事
  8. 大厂纷纷押宝“元宇宙”“鸡肋”智能眼镜难成密钥
  9. openGL之API学习(七十)windows的opengl扩展wgl
  10. 听说昨天朋友圈炸开了锅???