Android 12首次开机启动Launcher前黑屏问题解析
在工作中,对于系统开发确实有些难度,特别是在开机阶段遇到的问题,比如开机动画播放完毕进入锁屏界面黑屏几秒然后进入 锁屏界面,这就需要根据开机日志来分析问题所在,在工作中遇到的几种黑屏情况做下记录
首次开机进入Launcher3前黑屏几秒的几种情况问题的总结
2.1 开机向导引起的进入Launcher桌面短暂黑屏
在系统中默认是有开机向导的,首次开机会首选进入开机向导,然后进入锁屏桌面,如果某些原因 引起开机向导卡顿,会造成短暂黑屏然后进入Launcher界面 去掉开机向导的相关修改为: frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<!--本文的关键属性======默认是否开启跳过开机向导-->
<bool name="def_user_setup_complete">false</bool>
<!--设备是否已经提供,开机首次是否进入锁屏界面 -->
<bool name="def_device_provisioned">false</bool>
可以修改如下:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<bool name="def_user_setup_complete">true</bool>
<bool name="def_device_provisioned">true</bool>
再在产品mk中去掉这两个app:
packages/apps/OneTimeInitializer
packages/apps/Provision
在build的handheld_product.mk中参与编译这两个apk
$(call inherit-product, $(SRC_TARGET_DIR)/product/media_product.mk)# /product packages
PRODUCT_PACKAGES += \Camera2 \DeskClock \LatinIME \Launcher3QuickStep \OneTimeInitializer \Provision \Music \Settings \SettingsIntelligence \StorageManager \SystemUI \WallpaperCropper \frameworks-base-overlaysPRODUCT_PACKAGES_DEBUG += \frameworks-base-overlays-debug修改如下:
build\make\target\product\handheld_product.mk
$(call inherit-product, $(SRC_TARGET_DIR)/product/media_product.mk)# /product packages
PRODUCT_PACKAGES += \Camera2 \DeskClock \LatinIME \Launcher3QuickStep \
- OneTimeInitializer \
- Provision \Music \Settings \SettingsIntelligence \StorageManager \SystemUI \WallpaperCropper \frameworks-base-overlaysPRODUCT_PACKAGES_DEBUG += \frameworks-base-overlays-debug
让系统直接启动桌面,不用启动Provision。Provision干的事情和SetupWizard、 OneTimeInitializer类似。都是设置DEVICE_PROVISIONED和USER_SETUP_COMPLETE。
2.2 开机动画引起的进入launcher前的黑屏情况
在系统进入首次开机的时候,由于需要加载相当多的系统数据和服务,首次开机耗时会长一点,如果 开机动画过少,在播放完开机动画以后,还没等到AMS执行完停止播放动画的相关通知,就会陷入 黑屏状态等得到AMS停止播放动画以后就会进入桌面
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javafinal void finishBooting() {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "FinishBooting");synchronized (this) {if (!mBootAnimationComplete) {mCallFinishBooting = true;return;}mCallFinishBooting = false;}ArraySet<String> completedIsas = new ArraySet<String>();for (String abi : Build.SUPPORTED_ABIS) {ZYGOTE_PROCESS.establishZygoteConnectionForAbi(abi);final String instructionSet = VMRuntime.getInstructionSet(abi);if (!completedIsas.contains(instructionSet)) {try {mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi));} catch (InstallerException e) {if (!VMRuntime.didPruneDalvikCache()) {// This is technically not the right filter, as different zygotes may// have made different pruning decisions. But the log is best effort,// anyways.Slog.w(TAG, "Unable to mark boot complete for abi: " + abi + " (" +e.getMessage() +")");}}completedIsas.add(instructionSet);}}IntentFilter pkgFilter = new IntentFilter();pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);pkgFilter.addDataScheme("package");mContext.registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String[] pkgs = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);if (pkgs != null) {for (String pkg : pkgs) {synchronized (ActivityManagerService.this) {if (forceStopPackageLocked(pkg, -1, false, false, false, false, false,0, "query restart")) {setResultCode(Activity.RESULT_OK);return;}}}}}}, pkgFilter);IntentFilter dumpheapFilter = new IntentFilter();dumpheapFilter.addAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);mContext.registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final long delay = intent.getBooleanExtra(DumpHeapActivity.EXTRA_DELAY_DELETE, false) ? 5 * 60 * 1000 : 0;mHandler.sendEmptyMessageDelayed(DELETE_DUMPHEAP_MSG, delay);}}, dumpheapFilter);// Inform checkpointing systems of successtry {// This line is needed to CTS test for the correct exception handling// See b/138952436#comment36 for contextSlog.i(TAG, "About to commit checkpoint");IStorageManager storageManager = PackageHelper.getStorageManager();storageManager.commitChanges();} catch (Exception e) {PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);pm.reboot("Checkpoint commit failed");}// Let system services know.mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);synchronized (this) {// Ensure that any processes we had put on hold are now started// up.final int NP = mProcessesOnHold.size();if (NP > 0) {ArrayList<ProcessRecord> procs =new ArrayList<ProcessRecord>(mProcessesOnHold);for (int ip=0; ip<NP; ip++) {if (DEBUG_PROCESSES) Slog.v(TAG_PROCESSES, "Starting process on hold: "+ procs.get(ip));mProcessList.startProcessLocked(procs.get(ip), new HostingRecord("on-hold"));}}if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {return;}// Start looking for apps that are abusing wake locks.Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_POWER_USE_MSG);mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_INTERVAL);// Tell anyone interested that we are done booting!SystemProperties.set("sys.boot_completed", "1");// And trigger dev.bootcomplete if we are not showing encryption progressif (!"trigger_restart_min_framework".equals(VoldProperties.decrypt().orElse(""))|| "".equals(VoldProperties.encrypt_progress().orElse(""))) {SystemProperties.set("dev.bootcomplete", "1");}//发送有序的开机广播ACTION_LOCKED_BOOT_COMPLETEDmUserController.sendBootCompleted(new IIntentReceiver.Stub() {@Overridepublic void performReceive(Intent intent, int resultCode,String data, Bundle extras, boolean ordered,boolean sticky, int sendingUser) {synchronized (ActivityManagerService.this) {mOomAdjuster.mAppCompact.compactAllSystem();requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);}}});mUserController.scheduleStartProfiles();}Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}在SurfaceFlinger.bootFinished中停止动画相关方法
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::bootFinished(){if (mBootFinished == true) {ALOGE("Extra call to bootFinished");return;}mBootFinished = true;if (mStartPropertySetThread->join() != NO_ERROR) {ALOGE("Join StartPropertySetThread failed!");}const nsecs_t now = systemTime();const nsecs_t duration = now - mBootTime;ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );mFrameTracer->initialize();mTimeStats->onBootFinished();// wait patiently for the window manager deathconst String16 name("window");mWindowManager = defaultServiceManager()->getService(name);if (mWindowManager != 0) {mWindowManager->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));}sp<IBinder> input(defaultServiceManager()->getService(String16("inputflinger")));if (input == nullptr) {ALOGE("Failed to link to input service");} else {mInputFlinger = interface_cast<IInputFlinger>(input);}if (mVrFlinger) {mVrFlinger->OnBootFinished();}// stop boot animation// formerly we would just kill the process, but we now ask it to exit so it// can choose where to stop the animation.property_set("service.bootanim.exit", "1");const int LOGTAG_SF_STOP_BOOTANIM = 60110;LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));static_cast<void>(schedule([this] {readPersistentProperties();mPowerAdvisor.onBootFinished();mBootStage = BootStage::FINISHED;if (property_get_bool("sf.debug.show_refresh_rate_overlay", false)) {enableRefreshRateOverlay(true);}}));}
在BootAnimation.cpp退出动画的相关方法
frameworks/base/cmds/bootanimation/BootAnimation.cppvoid BootAnimation::checkExit() {// Allow surface flinger to gracefully request shutdownchar value[PROPERTY_VALUE_MAX];property_get(EXIT_PROP_NAME, value, "0");int exitnow = atoi(value);if (exitnow) {requestExit();mCallbacks->shutdown();}}
在项目中遇到开机动画只有几张的项目 在首次开机的时候会出现黑屏 把开机动画增加到30张左右的就解决了这个问题
2.3 FallbackHome导致的黑屏问题
在无锁屏的情况下 会在开机动画播放完毕后进入系统设置的FallbackHome,等收到解锁通知后 然后进入默认桌面,这时可以在onCreate设置开机动画最后一张作为背景
public class FallbackHome extends Activity {private static final String TAG = "FallbackHome";private static final int PROGRESS_TIMEOUT = 2000;private boolean mProvisioned;private WallpaperManager mWallManager;private final Runnable mProgressTimeoutRunnable = () -> {View v = getLayoutInflater().inflate(R.layout.fallback_home_finishing_boot, null /* root */);setContentView(v);v.setAlpha(0f);v.animate().alpha(1f).setDuration(500).setInterpolator(AnimationUtils.loadInterpolator(this, android.R.interpolator.fast_out_slow_in)).start();getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);};private final OnColorsChangedListener mColorsChangedListener = new OnColorsChangedListener() {@Overridepublic void onColorsChanged(WallpaperColors colors, int which) {if (colors != null) {final View decorView = getWindow().getDecorView();decorView.setSystemUiVisibility(updateVisibilityFlagsFromColors(colors, decorView.getSystemUiVisibility()));mWallManager.removeOnColorsChangedListener(this);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Set ourselves totally black before the device is provisioned so that// we don't flash the wallpaper before SUWmProvisioned = Settings.Global.getInt(getContentResolver(),Settings.Global.DEVICE_PROVISIONED, 0) != 0;final int flags;if (!mProvisioned) {setTheme(R.style.FallbackHome_SetupWizard);flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;} else {flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;}mWallManager = getSystemService(WallpaperManager.class);if (mWallManager == null) {Log.w(TAG, "Wallpaper manager isn't ready, can't listen to color changes!");} else {loadWallpaperColors(flags);}getWindow().getDecorView().setSystemUiVisibility(flags);// 增加背景
+ getWindow().setBackgroundDrawableResource(R.drawable.background);registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));maybeFinish();}@Overrideprotected void onResume() {super.onResume();if (mProvisioned) {mHandler.postDelayed(mProgressTimeoutRunnable, PROGRESS_TIMEOUT);}}
}
第二种改法
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"- android:background="#80000000"+ android:background="@drawable/bg"android:forceHasOverlappingRendering="false"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_gravity="center"android:layout_marginStart="16dp"android:layout_marginEnd="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:textColor="?android:attr/textColorPrimary"android:text="@*android:string/android_start_title"/><ProgressBarstyle="@android:style/Widget.Material.ProgressBar.Horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="12.75dp"android:colorControlActivated="?android:attr/textColorPrimary"android:indeterminate="true"/></LinearLayout>
</FrameLayout>
总结:这三种情况目前是开发中,遇到常见的情况,具体情况可以根据开机日子分析来解决相关的问题
相关文章:

Android 12首次开机启动Launcher前黑屏问题解析
在工作中,对于系统开发确实有些难度,特别是在开机阶段遇到的问题,比如开机动画播放完毕进入锁屏界面黑屏几秒然后进入 锁屏界面,这就需要根据开机日志来分析问题所在,在工作中遇到的几种黑屏情况做下记录首次开机进入L…...

使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 LSSVM的特性 1) 同样是对原始对偶问题进行求解,但是通过求解一个线性方程组(优化目标中的线性约束导致…...

动态规划-背包问题
文章目录一、背包问题1. 背包问题简介2. 背包问题解决方法二、01 背包问题1. 实现思路2. 实现代码三、完全背包问题1. 实现思路2. 实现代码四、多重背包问题(一)1. 实现思路2. 实现代码五、多重背包问题(二)1. 实现思路2. 实现代码…...

计算24点与运算符重载
十几年前写过一个算24点的程序。记得当时有点费劲,不过最后总算捣鼓出来了。前几天突然想再写一次,结果轻松地写出来了。C,总行数不多,带命令行界面和注释共200行不到;利用了面向对象和运算符重载来简化代码。 首先谈…...

MES系统智能工厂,搭上中国制造2025顺风车
MES在电子制造业中的应用日益广泛,越来越多的厂商已经购置或自行开发了MES,并将其作为“智能化工厂”。国内大大小小、各行各业都有上百个MES系统,还有很多的国外MES系统,怎么才能在MES系统公司中找到适合自己的MES?希…...

【LeetCode】每日一题(1)
目录 题目: 解题思路: 代码: 写在最后: 题目: 这是他给出的接口: class Solution { public:int fillCups(vector<int>& amount) {} }; 作为一个数学学渣,我想不出厉害的数学算法…...

SpringCloud-Netflix学习笔记11——Hystrix实现服务降级
服务降级 是什么? 整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。 如下图,在某一个时间段,访问服务A的请求特别多,而访问服务B和服务C的请求特别少,这时我们可以把…...

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作
Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作 / 本专栏详细讲解 Oracle Dataguard(Oracle 版本为11g,主库为双节点 Oracle rac 集群)的配置…...

零代码做分析报表的bi软件才是好软件
有些数据分析软件对IT的依赖比较重,在制作报表的过程中需要用到SQL,这就导致了IT人员懂技术不懂业务,业务人员懂业务不懂技术,数据分析做来做去总是差点什么的局面。要是遇到了IT部门相对较弱的情况,还会加重IT负担&am…...

linux ALSA 驱动架构
一、kernel Audio驱动架构主流有两大类,一类是SOC Machine架构,另一类是simple-card架构。 MTK、QCom主要采用machine架构,rockchip采用simple card架构。 二、Machine架构驱动介绍 machine 架构每家平台实现并不完全相同,mach…...

JDK 8 JVM内存结构详解
前言 本文所介绍的是 JDK 1.8 版本,其他版本的 JDK 在这里并不一定正确;内容主要摘自周志明的《深入理解Java虚拟机》一书的关键点,并根据自身的理解进行记录。感兴趣的同学可以去阅读原著。 JVM 的内存结构,主要包括以下 5 个区…...

黑马程序员 Linux 教程
目录Linux 简介不同应用领域主流操作系统Linux 系统历史Linux 系统版本Linux 安装安装方式网卡设置安装 SSH 连接工具使用 FinalShell 连接到 LinuxLinux 和 Windows 目录结构对比Linux 目录介绍Linux 常用命令Linux 命令初体验Linux 命令使用技巧Linux 命令格式文件目录操作命…...

文件操作 -- IO
文章目录文件操作 -- IO文件 :文件路径 :文件的类型java 中的文件操作文件内容的相关操作字节流的读和写操作字符流的读和写操作代码案例代码案例一 :代码案例二 :代码案例三 :文件操作 – IO 文件 : 文件相比大家都不陌生把 , 打…...

FPGA解析串口协议帧3.0版本,增加了错误重发功能,提供仿真文件以及源码
FPGA解析串口协议帧已经发布2个版本了,分别如下: 版本1:点击查看版本1 版本1详细介绍了串口协议帧的帧组成和设计思想,但设计粗糙,注释不详细; 版本1:点击查看版本2 版本2优化了代码,…...

365天深度学习训练营 第P6周:好莱坞明星识别
🍨 本文为🔗365天深度学习训练营 内部限免文章(版权归 K同学啊 所有)🍦 参考文章地址: 🔗第P6周:好莱坞明星识别 | 365天深度学习训练营🍖 作者:K同学啊 | 接…...

一文读懂 Zebec Chain 的“先行网络” Nautilus 链
最近,Zebec 上线了 DAO 治理系统后,上线并通过了关于 Nautilus 链的提案,这也是DAO系统上线后通过的首个提案。 Nautilus 链可以被看作是Zebec Chain上线前的“先行”链,并且是目前行业内为数不多的以“Layer3”作为特点的模块化通…...

FuzzyMathematicalModel模糊数学模型-2-多目标模糊综合评价案例分享
主函数:clc, clear% 输入模糊矩阵的原型x [4700 6700 5900 8800 76005000 5500 5300 6800 600004.0 06.1 05.5 07.0 06.80030 0050 0040 0200 01601500 0700 1000 0050 0100];r muti_objective_fuzzy_analysis(x);% 各指标在决策中占的权重(专家系统,自…...

单链表--C语言版(从0开始,超详细解析,小白一看就会)
目录 一、前言 🍎 为什么要学习链表 💦顺序表有缺陷 💦 优化方案:链表 二、链表详解 🍐链表的概念 🍉链表的结构组成:节点 🍓链表节点的连接(逻辑结构与物理结构的区…...

cv2-特征点匹配(bf、FLANN)
cv2-特征点匹配(bf、KNN、FLANN) 文章目录cv2-特征点匹配(bf、KNN、FLANN)1. 暴力匹配法(bf)1.1 bf.match()1.2 bf.knnMatch()3. FLANN匹配法4. 总结1. 暴力匹配法(bf) (…...

基于matlab多功能相控阵雷达资源管理的服务质量优化
一、前言此示例说明如何为基于服务质量 (QoS) 优化的多功能相控阵雷达 (MPAR) 监控设置资源管理方案。它首先定义必须同时调查的多个搜索扇区的参数。然后,它介绍了累积检测范围作为搜索质量的度量,并展示了…...

立创eda专业版学习笔记(6)(pcb板移动节点)
先要看一个设置方面的东西: 进入设置-pcb-通用 我鼠标放到竖着的线上面,第一次点左键是这样选中的: 再点一次左键是这样选中的: 这个时候,把鼠标放到转角的地方,点右键,就会出现对于节点的选项…...

Java面试——MyBatis相关知识
目录 1.什么是MyBatis 2.MyBatis优缺点 3.MyBatis工作原理 4.MyBatis缓存模式 5.MyBatis代码相关问题 6.MyBatis和hibernate区别 1.什么是MyBatis MyBatis是一个半ORM持久层框架(对象关系映射),基于JDBC进行封装,使得开发者…...

Cortex-M0编程入门
目录1.嵌入式系统编程入门微控制器是如何启动的嵌入式程序设计2.输入和输出3.开发流程4.C编程和汇编编程5.什么是程序映像6.C编程:数据类型7.用C语言操作外设8.Cortex微控制器软件接口标准(CMSIS)简介标准化内容组织结构使用方法优势1.嵌入式…...

字符串函数能有什么坏心思?
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:夏目的C语言宝藏 💬总结:希望你看完之…...

Vue3 组件之间的通信
组件之间的通信 经过前面几章的阅读,相信开发者已经可以搭建一个基础的 Vue 3 项目了! 但实际业务开发过程中,还会遇到一些组件之间的通信问题,父子组件通信、兄弟组件通信、爷孙组件通信,还有一些全局通信的场景。 …...

多路查找树
1.二叉树与 B 树 1.1二叉树的问题分析 二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就 存在如下问题:问…...

Mybatis——注入执行sql查询、更新、新增以及建表语句
文章目录前言案例dao和mapper编写XXXmapper.xml编写编写业务层代码,进行注入调用额外扩展--创建表语句前言 在平时的项目开发中,mybatis应用非常广泛,但一般都是直接CRUD类型sql的执行。 本片博客主要说明一个另类的操作,注入sq…...

即时通讯系列-4-如何设计写扩散下的同步协议方案
1. 背景信息 上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅. 本文Agenda: (How)如何同步(How)如何设计同步位点如何设计 Gap过大(SyncGapOverflow) 机制如何设计Ack机制总结 提示: 本系列文章不会单纯的给出结论, 希望能够分享的是&…...

tui-swipe-action组件上的按钮点击后有阴影的解决方法
大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 目录 前言问题描述问题解决前言 一直未敢涉足电商领域,总觉得这里面的道道很多,又是支付、又是物流的,还涉及到金钱,所以我们所做的项目,一直都是XXXX管理系统,XXX考核系统,移动端的也是,XX健康管理平台…… 但…...

【大数据Hadoop】Hadoop 3.x 新特性总览
Hadoop 3.x 新特性剖析系列11. 概述2. 内容2.1 JDK2.2 EC技术2.3 YARN的时间线V.2服务2.3.1 伸缩性2.3.2 可用性2.3.3 架构体系2.4 优化Hadoop Shell脚本2.5 重构Hadoop Client Jar包2.6 支持等待容器和分布式调度2.7 支持多个NameNode节点2.8 默认的服务端口被修改2.9 支持文件…...