Android10 开机向导流程

news2024/9/28 21:47:55

        最近在弄开机向导,网上查了查,基本都是参照系统的​​​​​​Provision应用来做的,而且还要将apk打包到系统目录下的pri-app目录下,打包到其他目录下不行,参照着做是没问题,但是好奇为什么要这么做?调用流程是怎样?这就是接下来要来探究的。

launcher启动

        以如下模拟器为例来看Google首次开机涉及到哪些launcher

       开机时过滤日志ActivityTaskManager

2023-01-29 16:44:03.285 1993-1993/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.CryptKeeper} from uid 0
2023-01-29 16:44:03.289 1993-1993/system_process I/ActivityTaskManager: Loaded persisted task ids for user 0
2023-01-29 16:44:04.089 1993-2096/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.setupwizard/.SetupWizardActivity} from uid 0
2023-01-29 16:44:05.129 1993-2347/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.FallbackHome} from uid 0
2023-01-29 16:44:06.212 1993-2032/system_process I/ActivityTaskManager: Displayed com.android.settings/.FallbackHome: +1s80ms
2023-01-29 16:44:14.244 1993-2610/system_process I/ActivityTaskManager: Config changes=3 {1.0 310mcc260mnc [en_US] ldltr sw392dp w392dp h757dp 440dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2280) mAppBounds=Rect(0, 0 - 1080, 2148) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.6}
2023-01-29 16:44:14.264 1993-2610/system_process I/ActivityTaskManager: Override config changes=3 {1.0 310mcc260mnc [en_US] ldltr sw392dp w392dp h757dp 440dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2280) mAppBounds=Rect(0, 0 - 1080, 2148) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.6} for displayId=0
2023-01-29 16:44:16.159 1993-2024/system_process I/ActivityTaskManager: Loading recents for user 0 into memory.
2023-01-29 16:44:16.436 1993-3016/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.sdksetup/.DefaultActivity} from uid 0
2023-01-29 16:44:19.084 1993-2047/system_process I/ActivityTaskManager:   Force finishing activity ActivityRecord{cb6abf3 u0 com.google.android.sdksetup/.DefaultActivity t4}
2023-01-29 16:44:19.086 1993-2047/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.apps.nexuslauncher/.NexusLauncherActivity} from uid 0
2023-01-29 16:44:19.234 1993-2028/system_process W/system_server: Long monitor contention with owner PackageManager (2047) at void com.android.server.wm.ActivityTaskManagerService$LocalService.cleanupDisabledPackageComponents(java.lang.String, java.util.Set, int, boolean)(ActivityTaskManagerService.java:6820) waiters=0 in void com.android.server.wm.InputMonitor$1.run() for 150ms
2023-01-29 16:44:26.653 1993-2032/system_process I/ActivityTaskManager: Displayed com.google.android.apps.nexuslauncher/.NexusLauncherActivity: +5s191ms

 涉及到应用包括:

1、com.android.settings/.CryptKeeper

2、com.google.android.setupwizard/.SetupWizardActivity

3、com.android.settings/.FallbackHome

4、com.google.android.sdksetup/.DefaultActivity

5、com.google.android.apps.nexuslauncher/.NexusLauncherActivity

 开机涉及到这么多页面,但我们实际能感觉到的就只有FallbackHome和NexusLauncherActivity两个页面,NexusLauncherActivity就是我们最终显示的launcher了,FallbackHome则是开机动画完成后出现的一个加载动画(Pixs is Starting ...)。

        再说launcher启动前,先来看下验证的几个方法:

    fun testApi() {
        val homeIntent = Intent(Intent.ACTION_MAIN)
        homeIntent.addCategory(Intent.CATEGORY_HOME)
        val resolvedType = homeIntent.resolveTypeIfNeeded(contentResolver)
        val queryIntentActivities = AppGlobals.getPackageManager().queryIntentActivities(
            homeIntent, resolvedType,
            PackageManager.GET_SHARED_LIBRARY_FILES, 0
        )
        for (parcelable in queryIntentActivities.list) {
            val toString = (parcelable as ResolveInfo).toString()
            Log.d(ZZQ_TAG, "queryIntentActivities: "+toString)
        }
        val resolveIntent = AppGlobals.getPackageManager().resolveIntent(
            homeIntent, resolvedType,
            PackageManager.GET_SHARED_LIBRARY_FILES, 0
        )
        Log.d(ZZQ_TAG, "resolveIntent: "+resolveIntent.toString())
    }

         queryIntentActivities()查询到的就是当前所有匹配到的activity信息,而resolveIntent()就是获取当前优先级最高的launcher,用这个方法测试时,需要注意这个应用要是系统应用,有系统签名和menifest中需要加android:sharedUserId="android.uid.system",否则拿到的就不全,

        对于launcher启动属性的页面,当页面起来后,调用它的finish()方法,就会重新去启动优先级高的launcher(调用Activity的pause()方法后,系统会重新执行启动launcher),可能会有疑问,重新启动不还是刚finish()点的launcher么,正常来说是的,但是如果调用了如下方法:

        val defaultName = ComponentName("com.android.provision", "com.android.provision.DefaultActivity")
        pm.setComponentEnabledSetting(
            defaultName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP
        )

那么在PackageManager中就会去掉这个Activity的信息,自然重新查找launcher就不是原来的launcher了,按照这个逻辑,除了首次开机会启动所有的launcher,其他时候开机就只剩NexusLauncherActivity了,但是每次打开模拟器时,都会有FallbackHome的加载动画,那就说明FallbackHome并没有从包管理中去掉,那是怎么跳过FallbackHome启动后面的Launcher的呢?那这就要看android:directBootAware="true"了,这个属性的意思是当设备未解锁时是否允许被启动,true表示可以启动,false表示不可以启动,FallbackHome就配置了这个属性,并且FallbackHome是在监听到解锁后finish()掉的,接下来看下这几个页面在menifest的配置:

1、com.android.settings/.CryptKeeper

    <application
        android:directBootAware="true">

        <activity
            android:theme="@ref/0x7f13027a"
            android:name="com.android.settings.CryptKeeper"
            android:process=":CryptKeeper"
            android:excludeFromRecents="true"
            android:launchMode="1"
            android:screenOrientation="5"
            android:configChanges="0x233"
            android:windowSoftInputMode="0x10"
            android:immersive="true"
            androidprv:systemUserOnly="true">

            <intent-filter android:priority="10">
                <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>

2、com.google.android.setupwizard/.SetupWizardActivity

        <activity
            android:theme="@ref/0x7f1100b0"
            android:label="@ref/0x7f100028"
            android:name="com.google.android.setupwizard.SetupWizardActivity"
            android:excludeFromRecents="true"
            android:launchMode="2"
            android:configChanges="0x4b3"
            android:immersive="true"
            android:directBootAware="true">

            <intent-filter android:priority="5">
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.SETUP_WIZARD" />
            </intent-filter>
        </activity>

3、com.android.settings/.FallbackHome

    <application
        android:directBootAware="true">

        <activity
            android:theme="@ref/0x7f130104"
            android:label="@string/0x32"
            android:name="com.android.settings.FallbackHome"
            android:taskAffinity="com.android.settings.FallbackHome"
            android:excludeFromRecents="true"
            android:screenOrientation="5">

            <intent-filter android:priority="-1000">
                <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>

4、com.google.android.sdksetup/.DefaultActivity

        <activity
            android:name="DefaultActivity"
            android:excludeFromRecents="true">

            <intent-filter android:priority="3">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

5、com.google.android.apps.nexuslauncher/.NexusLauncherActivity

        <activity
            android:theme="@ref/0x7f12000a"
            android:name="com.google.android.apps.nexuslauncher.NexusLauncherActivity"
            android:enabled="true"
            android:taskAffinity="@string/0x35"
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:launchMode="2"
            android:screenOrientation="-1"
            android:configChanges="0xdf3"
            android:windowSoftInputMode="0x20"
            android:resumeWhilePausing="true"
            android:resizeableActivity="true">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
                <category android:name="android.intent.category.LAUNCHER_APP" />
            </intent-filter>

            <meta-data
                android:name="com.android.launcher3.grid.control"
                android:value="com.google.android.apps.nexuslauncher.grid_control" />
        </activity>

上面这些就是Pixel 5模拟器所有launcher配置,系统启动选取launcher是通过上面提到的resolveIntent()这个方法解决,感兴趣的可以自己去看看源码,在开机时,系统是没有解锁的,所以只会找到配置了android:directBootAware="true"的Activity,所以这里先找到的是CryptKeeper、SetupWizardActivity、FallbackHome,然后再来看下优先级,CryptKeeper的priority是10、SetupWizardActivity的priority是5、FallbackHome的priority是-1000,优先级高的先执行,CryptKeeper、SetupWizardActivity执行完后通常都是会从包管理中移除,在执行到FallbackHome时,FallbackHome有解锁的监听,解锁完成就直接finish()掉了,但不会从包管理中移除,这也就是每次开机都能看到一个加载的动画,FallbackHome执行完后,再次寻找launcher时,找到是FallbackHome、DefaultActivity、NexusLauncherActivity,同样根据优先级,这时候由于FallbackHome的优先级是-1000,所以是不会执行了,DefaultActivity执行完后会直接从包管理中移除,所以最终显示的就是NexusLauncherActivity了,而在后续的开机中,就只会涉及到FallbackHome和NexusLauncherActivity了,这样开机中涉及到的所有launcher就全了。上面所涉及到的五个Activity,其中SetupWizardActivity、DefaultActivity是开机向导,为什么Pixel 5中会有两个开机向导,这就不是很明白了(个人猜测可能是在设置SetupWizardActivity的过程中,就已经解锁了,而有些设置需要在解锁后设置)。

2、自定义开机向导

        明白了开机流程中的原理,再来弄开机向导就很简单。

        现在就可以来自定义我们的开机向导了,按照网上大部分教程是参照Provision这个应用,这里就会有个问题,如果开机向导中有设置语言,在首次开机时,FallbackHome的加载动画的文本就只能使用系统默认的语言了,而且还延长了开机时间,所以建议参照SetupWizardActivity来配置,这样有几个好处:

1、可以不将包放到系统目录的pri-app目录下;

2、首次开机可以省略掉FallbackHome加载动画(前提是开机向导设置完成时设备已解锁);

如果有些需求需要系统解锁后在进行设置,那就可以参照网上的Provision了,如果你不想将包打包进pri-app目录下(后续手动安装覆盖不掉),也是有解决方案的,那就是重新设置launcher的优先级,不过这里需要注意下,不再pri-app目录下,设置1到1000是无效的,只能设置0到-1000,这样所有问题都可以解决了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esp32连接阿里云物联网平台进行MQTT通信

前提&#xff1a;IDE是采用arduino IDE&#xff0c;arduino使用的库是pubsubclient 开发板可以使用esp32&#xff08;esp8266也是一样的&#xff09; 已经学会pubsubclient库的基本使用 使用pubsubclient 库连接阿里云物联网平台 const char* ssid "........"; c…

java ssm校园勤工俭学助学志愿者兼职系统 idea maven

本论文主要论述了如何使用JSP技术开发一个校园勤工俭学兼职系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园勤工俭学兼职系统的当前背景以及系统开发的…

使用CCProxy+Proxifier实现代理

目录1.使用场景2.什么是网络代理&#xff1f;3.CCProxy3.1 说明3.2 下载安装3.3 使用说明4.Proxifier4.1 说明4.2 下载安装4.3 使用说明4.4 Proxifier CPU占用率高问题解决1.使用场景 很多时候当我们访问某个网络&#xff08;例如&#xff1a;校园网、企业网&#xff09;&#…

射频识别技术|期末考试知识点|重点题目|第1讲_RFID

课堂笔记 1.RFID技术 标签(芯片、天线、封装) 读写器 中间件和系统软件 公共服务体系 2.IC&ID

使用原始命令编译打包部署springboot-demo项目

目录简介源文件介绍编译编译restful-common编译manual-springboot打包&部署&执行jar命令介绍不打包直接运行打普通jar包&#xff0c;通过java -jar运行打fat jar通过java -jar打war&#xff0c;通过部署至tomcat运行纯手工命令开发打包部署的缺点参考简介 本文将使用j…

CUDA编程笔记(7)

文章目录前言共享内存的合理使用数组归约计算使用全局内存的计算引入线程块中的同步函数使用共享内存计算静态共享内存使用动态共享内存性能比较避免共享内存的bank冲突使用共享内存进行数组转置bank概念性能比较总结前言 cuda共享内存的合理使用。 共享内存的合理使用 共享…

TF-A移植

1.对tf-a源码进行解压 $> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.打补丁 $> for p in ls -1 ../*.patch; do patch -p1 < $p; done 3.配置交叉编译工具链 将Makefile.sdk中EXTRA_OEMAKE修改为 EXTRA_OEMAKECROSS_COMPILEarm-linux-gnueabihf- 4.复制设备树…

linux 部署jmeter

一、linux 安装jdk Java Downloads | Oracle 二、 linux上传jmeter 2.1 上传jmeter jmeter 下载地址&#xff1a; Apache JMeter - Download Apache JMeter 注意&#xff1a; 我先在我本地调试脚本&#xff08;mac环境&#xff09;&#xff0c;调试完成后&#xff0c;再在…

前端首屏优化

一. 打包分析 在 package.json 中添加命令 “report”: “vue-cli-service build --report” 然后命令行执行 npm run report&#xff0c;就会在dist目录下生成一个 report.html 文件&#xff0c;右键浏览器中打开即可看到打包分析报告。 二. 路由懒加载 component: () >…

MacOS - steam 蒸汽平台安装教程,带你躲避高仿网站的陷阱

MacOS - steam 蒸汽平台安装教程 MacOS 其实也是可以安装 Steam 平台的&#xff0c;虽然 steam 上的大多游戏暂时都不支持 MacOS&#xff0c;但还是有一些游戏可以玩的&#xff0c;而且近几年支持 MacOS 的游戏也是越来越多了。另外现在高仿网站特别多&#xff0c;所以才有了这…

transformer库使用

Transformer库简介 是一个开源库&#xff0c;其提供所有的预测训练模型&#xff0c;都是基于transformer模型结构的。 Transformer库 我们可以使用 Transformers 库提供的 API 轻松下载和训练最先进的预训练模型。使用预训练模型可以降低计算成本&#xff0c;以及节省从头开…

Grafana 系列文章(三):Tempo-使用 HTTP 推送 Spans

&#x1f449;️URL: https://grafana.com/docs/tempo/latest/api_docs/pushing-spans-with-http/ &#x1f4dd;Description: 有时&#xff0c;使用追踪系统是令人生畏的&#xff0c;因为它似乎需要复杂的应用程序仪器或 span 摄取管道&#xff0c;以便 ... 有时&#xff0c;使…

SurfaceFlinger学习笔记(七)之SKIA

关于Surface请参考下面文章 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFlinger学习笔记(三)之SurfaceFlinger进程 SurfaceFlinger学习笔记(四)之HWC2 SurfaceFlinger学习笔记(五)之HWUI SurfaceFlinger学习笔记(六)之View Layout Dr…

react 实现表格列表拖拽排序

问题描述 在项目开发中&#xff0c;遇到这样一个需求&#xff1a;需要对表格里面的数据进行拖拽排序。 效果图如下所示&#xff1a; 思路 安装两个插件&#xff1a; react-sortable-hoc &#xff08;或者 react-beautiful-dnd&#xff09;array-move npm install --save r…

59 多线程环境普通变量作为标记循环不结束

前言 最近看到这篇例子的时候, [讨论] 内存可见性问题, 吧其中的 demo 拿到本地来跑 居然 和楼主一样, testBasicType 这里面的这个子线程 居然 不结束了, 卧槽 我还以为 只是可能 用的时间稍微长一点 哪知道 直接 无限期执行下去了, 然后 另外还有一个情况就是 加上了 -…

Segmenter论文解读

Segmenter: Transformer for Semantic Segmentation 论文&#xff1a;[2105.05633] Segmenter: Transformer for Semantic Segmentation (arxiv.org) 代码&#xff1a;[rstrudel/segmenter: ICCV2021] Official PyTorch implementation of Segmenter: Transformer for Semanti…

vue3+ts error TS7053:

在远程仓库拉取线上正常运行的项目&#xff0c;编译之后出现报错出现问题&#xff0c;逐步排查node版本是否与别人一致2.检查node_modules是否与别人一致检查到这一步就发现了是因为依赖版本不一致导致的原因因为目前vue-tsc等依赖更新频繁把这两个依赖的版本号锁死&#xff0c…

vuex

目录 1、什么是vuex 2、vuex的工作方式 3、vuex的使用场景 4、工作流程&#xff1a;View -> Actions -> Mutations -> State -> View 5、vuex的核心API ​ &#xff08;1&#xff09;state&#xff1a; ​ &#xff08;2&#xff09;mutations ​ &#xff…

Pinia的使用(以vue3+ts+vite为例)

文章目录Pinia1. 安装2. 引入vue33. 初始化store仓库4. 修改state5. 解构store6. store中的方法和计算属性&#xff08;actions、getters&#xff09;7. API7.1 $reset7.2 $subscribe 和 $onAction8. 插件案例&#xff1a;持久化插件Pinia Pinia官方文档 Pinia GitHub地址 1…

VSCode vscode-pandoc插件将中文Markdown转换为好看的pdf文档(使用eisvogel模板)

Markdown的使用经常需要转变其他格式&#xff0c;在VSCode里有个很好用的插件&#xff1a;vscode-pandoc&#xff0c;先进行下载。 打开设置&#xff08;左下角的小齿轮&#xff09; 输入pandoc 在HTML Opt String中粘贴入&#xff1a; -s -t html5可将Markdown转换输出HTML。…