android provision apk 分析

转载 2015年07月09日 12:32:09
今天说说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/


/**
 * Application that sets the provisioned bit, like SetupWizard does.
 */
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.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); 
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1); 
        android.util.Log.i("frank_07_09", "DefaultActivity ....");

        // 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(开机向导setupwizard程序)

转载请标明出处: http://blog.csdn.net/u011974987/article/details/50502769; 本文出自:【Xiho的博客】 先来说说我为什么写下...
  • u011974987
  • u011974987
  • 2016年01月12日 11:14
  • 7706

android provision

今天说说Provision这个APK,可能很多朋友都不知道有这个APK存在。Provision的作用很简单,就是一个系统初始化引导程序,原生的Android里面Provision只做了一件事,就是写入...
  • shenmay2012
  • shenmay2012
  • 2014年03月04日 15:22
  • 10276

关于Provision.apk

今天遇到一个应用无法打开的问题,跟踪代码发现appz
  • louyong0571
  • louyong0571
  • 2014年09月19日 16:19
  • 2227

Android6.0 无法锁屏

由于修改系统锁屏界面,风格,导致SystemUI和Keyguard改动比较大。结果发现重启后,无法锁屏、 还原所有改动,无果。遂只能跟踪锁屏源码逻辑,结果发现:doKeyguard: not show...
  • Roggin
  • Roggin
  • 2017年03月04日 10:22
  • 1017

Android——锁定launch - 原生Browser启动 -引导provision

前段时间做了一个功能,就是锁定主launch,机器上只能跑我们定义的launch,当时没注意影响, 最近发现就是因为在AMS中加了这个锁定过滤条件导致原生Browser无法启动了, 把我郁闷的,当...
  • jscese
  • jscese
  • 2014年11月12日 18:01
  • 3408

《深入理解Android 卷III》第七章 深入理解SystemUI

《深入理解Android 卷III》即将发布,作者是张大伟。此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分。在一个特别讲...
  • Innost
  • Innost
  • 2015年08月14日 13:43
  • 18380

Android 7.0Settings加载主界面流程

新人一枚,没有整机环境,有什么写的不对欢迎批评指正,万分感谢! Settings主界面加载时序图(这里很多判断逻辑我省略掉了。更多的是想把加载主界面流程跑通。) 这张流程图将主fragm...
  • A771642
  • A771642
  • 2017年04月20日 18:15
  • 2850

(N)Telephony分析(五)之DcTracker的初始化

DcTracker对象的初始化,需要从前文中进行分析,我们来看看其的初始化 PhoneFactory.java public static void makeDefaultPhone(Context ...
  • Check_Out
  • Check_Out
  • 2017年09月14日 14:37
  • 180

Android快速设置中添加隐藏状态栏和导航栏选项

Android的状态栏和导航栏是在SystemUI中实现的,目前还不支持手动隐藏和显示状态栏和导航栏,接下来我们将对此功能进行讲解。 在系统启动过程中,会加载SystemUI中的状态栏,具体过程在这...
  • u013467735
  • u013467735
  • 2015年03月19日 11:46
  • 2807

Settings7.0添加新菜单列表项源码分析&Fragment配置Activity启动入口

Android6.0 Settings是通过加载dashboard_categories.xml,获取显示列表,所以在6.0上可以直接在dashboard_categories.xml添加icon、t...
  • qq_25804863
  • qq_25804863
  • 2017年06月08日 17:43
  • 1216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android provision apk 分析
举报原因:
原因补充:

(最多只允许输入30个字)