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

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

 

1、Provision程序

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

复制代码
            "DefaultActivity"                android:excludeFromRecents="true">            "1">                "android.intent.action.MAIN" />                "android.intent.category.HOME" />                "android.intent.category.DEFAULT" />                        
复制代码

  从上面代码可以看到两个比较有意思的地方,第一: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就是我们上面说的系统升级完标记。这个标记是保存在:

Android 初始化Setup Wizard——Provision_第1张图片

 

保存在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/Android 初始化Setup Wizard——Provision_第2张图片

 

 

复制代码
    
//Edited by mythou//http://www.cnblogs.com/mythou/
"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">"1">"1" />
复制代码

 

 

 

   上面就是记录了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 

更多相关文章

  1. Android 强大的开发支持库组件AppFromwork框架详解
  2. Android Studio NDK开发在C代码中将Log输出到logcat上面
  3. 22个值得收藏的android开源代码-UI篇
  4. [Android]混淆代码后生成带签名的apk
  5. 把android sdk 1.5源代码加入SDK
  6. Android代码内存优化建议-Android资源篇
  7. Android 自定义view组件

随机推荐

  1. Android(安卓)Studio编译运行project报错
  2. android 读取SD卡或者其他地方文件功能函
  3. android扇形菜单
  4. android 碎片
  5. android增删改查sqlite数据库
  6. Android(安卓)按键事件流程概要
  7. Android打开页面
  8. 怎么正确学好画五官?漫画人物鼻子画法教程
  9. vite+vue3项目最佳起始点(保姆级)
  10. PHP生成PDF