`

(转)为什么第三方应用能早于System的app启动

 
阅读更多
Android应用的启动顺序网上有一大堆资料可以查阅了,这里就不细述了,这里不阐述ROM启动还有bootloader,软件启动的大致流程应该是启动kernel -> 运行servicemanager 把一些native的服务用命令启动起来(包括wifi, power, rild, surfaceflinger, mediaserver等等)-> 启动Dalivk中的第一个进程Zygote -> 启动java 层的系统服务system_server(包括PowerManagerService, ActivityManagerService , telephony.registry, DisplayManagerService等等)该服务中的这些部件跟native的那些服务关联在一起 -> 启动Luncher和Persistent的App,该程序是系统级的在AndroidManifest.xml里声明android:persistent="true" -> 发出ACTION_BOOT_COMPLETED广播给其他应用。
在这里需要注意的是声明android:persistent属性为true的APP被kill掉后还是会自动重启的。
系统中我们已知android:persistent属性为true的APP肯定有Phone App,也就是说第三方应用应当至少晚于Phone APP启动,如何判断呢?最简单的办法看其PID的大小,PID值越小越先启动。有其第三方应用可以先于Phone APP启动。我们探其应用的AndroidManifest.xml (PS:如何看APK的代码,网上有你懂的apktool等),发现其在AndroidManifest里定义的静态Receiver的intent-filter的属性如下:

       <receiver android:name="com.anguanjia.safe.AAAReceiver">
            <intent-filter android:priority="2147483647"></intent-filter></span>
                
                
                
                
                
            
            <intent-filter android:priority="2147483647">
                
                
                
                
                
                <data android:scheme="file">
            </data></action></action></action></action></action></intent-filter>
</action></action></action></action></action></receiver>

2147483647 这个值是什么?好大,哦,原来是int的最大值!我们来看下google 文档

android:priority
The priority that should be given to the parent component with regard to handling intents of the type described by the filter. This attribute has meaning for both activities and broadcast receivers:

It provides information about how able an activity is to respond to an intent that matches the filter, relative to other activities that could also respond to the intent. When an intent could be handled by multiple activities with different priorities, Android will consider only those with higher priority values as potential targets for the intent.

It controls the order in which broadcast receivers are executed to receive broadcast messages. Those with higher priority values are called before those with lower values. (The order applies only to synchronous messages; it's ignored for asynchronous messages.)

Use this attribute only if you really need to impose a specific order in which the broadcasts are received, or want to force Android to prefer one activity over others.

The value must be an integer, such as "100". Higher numbers have a higher priority. The default value is 0. The value must be greater than -1000 and less than 1000.


这个值是receiver的优先级,值越大优先级越高,按优先顺序执行,但是文档介绍优先级值大小是-1000~1000. 该应用的是int的最大值, 但android平台没有对android:priority值进行检查。在开机后该应用Receiver的intent-filter的优先级最高,在该filter里的intent被系统发送出来(android.intent.action.MEDIA_MOUNTE, android.net.wifi.WIFI_STATE_CHANGED等等),这个时候App会根据这个intent而被启动起来。
这里需要注意的是该Receiver是个静态的,一定是要注册在AndroidManifest里。当Wifi成功注册后会发出WIFI_STATE_CHANGED的消息, 或者其他的部件完成一些事件后也会发出类似的消息,而这些消息的发出又早于属性为persistent的系统级APP的启动, 由此就会发生第三方应用早于系统级APP的启动的情况。
分享到:
评论

相关推荐

    C#Winform实现打开第三方应用程序实例

    在C# WinForm开发中,有时我们需要集成或调用系统中已经安装的第三方应用程序,以扩展我们应用程序的功能或提供更多的用户交互。这个实例将详细讲解如何在C# WinForm应用中实现这一目标。 首先,我们需要了解`...

    Android给第三方应用systemapp 运行时权限默认开启

    Android给第三方应用systemapp 运行时权限默认开启

    android 把软件安装成系统软件(安装到system/app目录下)

    在Android系统中,将应用程序安装至system/app目录下,使其成为系统级应用,是一项高级操作,主要用于开发者在进行ROM定制、应用预装或是系统级调试时。以下将深入解析这一过程,涵盖技术背景、实现步骤及注意事项。...

    分类手机上安装的系统应用和第三方应用

    系统应用通常位于系统的专属文件夹,如Android的`/system/app`或`/system/priv-app`目录,而第三方应用则存放在`/data/app`目录下。在代码层面,可以通过检查应用的包名是否与系统包名前缀匹配,如Android的`...

    分别获取所有、系统、第三方、SD卡应用的信息

    本文将深入探讨如何分别获取所有应用、系统应用、第三方应用以及存储在SD卡上的应用的信息。 首先,我们需要理解Android中的应用类型。所有应用包括系统内置应用(预装在设备内部存储)和用户安装的应用(通常存储...

    android快捷卸载第三方应用

    因此,可以通过检查`PackageInfo.flags & FLAG_SYSTEM`是否等于0来判断一个应用是否为第三方应用。 接下来,实现卸载功能需要用到`Intent`对象和` startActivityForResult()`方法。创建一个`Intent`,指定动作为`...

    android开机自启动APP及使用adb命令测试方法

    现在大多数的android手机系统都默认禁止第三方安装的APP开机自启动,只有系统APP(system/app)才默认有这个权限,所以一般都需要去安全中心或者手机管家中去设置为允许。这里说个题外话,手机软件除非特殊情况,不然...

    系统程序卸载器_System App Remover_v4.13汉化版

    系统程序卸载器_System App Remover_v4.13汉化版系统程序卸载器_System App Remover_v4.13汉化版

    第三方APP微信支付Java服务端构建完整步骤

    第三方APP微信支付Java服务端构建完整步骤 在本资源中,我们将详细介绍第三方APP微信支付Java服务端的构建步骤。微信支付是微信提供的一种在线支付方式,允许用户通过微信客户端进行支付。为了使用微信支付,需要在...

    System app remover系统应用删除10.1.13540专业版.rar

    System app remover系统应用删除10.1.13540专业版.rar

    android系统自带system/app

    在Android操作系统中,"system/app"是一个至关重要的目录,它包含了Android系统预装的应用程序。这些应用程序是系统的核心组成部分,通常由设备制造商或Google预先安装,以提供基本功能和服务。让我们深入探讨一下这...

    Android识别预装的第三方App方法实例

    "Android识别预装的第三方App方法实例" Android识别预装的第三方App方法实例主要给大家介绍了关于Android如何识别预装的第三方App的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴。 知识点一...

    Android启动流程app安装和启动原理.docx

    当用户点击图标启动应用时,会触发startActivity(Intent)方法,这个过程会通过Binder IPC机制调用ActivityManagerService。ActivityManagerService首先解析Intent以确定目标Activity的信息,然后检查权限,如果满足...

    SystemAppMover, Android 应用 将其他应用程序从/system/app 文件夹移动到文件夹.zip

    SystemAppMover, Android 应用 将其他应用程序从/system/app 文件夹移动到文件夹 SystemAppMover需要 root 使用你自己的风险 !这里应用将应用程序从/system/app 文件夹移动到文件夹,使它的成为系统应用程序或者...

    系统程序卸载器 v4.19systemappremover_3

    系统程序卸载器 v4.19systemappremover_3.apk

    新中新电子 C# 调用 第三方接口

    在IT行业中,调用第三方接口是一项常见的任务,特别是在软件开发中。C#作为一种广泛应用的编程语言,被广泛用于构建各种应用程序,包括与外部系统交互。本文将深入探讨新中新电子如何利用C#来调用第三方接口,以及在...

    delphi 安卓 app apk 开机自动启动 自启 服务定时启动 源码 教程 收集

    ### Delphi 安卓 App APK 开机自动启动与服务定时启动源码教程解析 #### 一、背景介绍 在移动应用开发领域,特别是在使用 Delphi 进行安卓应用开发时,有时我们需要让应用具备开机自启动功能或者定时启动某些服务...

    SystemApp:系统应用

    这些应用程序是操作系统不可或缺的一部分,它们负责管理设备资源、提供用户界面、维护系统安全以及支持其他第三方应用的运行。在Android系统中,"SystemApp"指的是预装在设备上的应用,它们拥有更高的权限,能够访问...

Global site tag (gtag.js) - Google Analytics