aosp新增窗口层级 Type 完整实现方案(有源码)-wms需求和面试题

Android Framework面试核心:Binder机制与系统级问题排查 Binder机制作为Android系统进程间通信(IPC)的核心组件,其设计原理与性能优化是Framework工程师必须掌握的底层知识。从内核空间的Binder驱动实现到应用层的接口定义,理解线程池管理、数据传输优化等关键技术点,能够有效解决跨进程通信中的ANR、死锁等稳定性问题。在系统服务架构设计中,ActivityManagerService、WindowManagerService等核心模块的交互机制,以及Native崩溃分析、锁竞争检测等实战技能,都是大厂面试的高频考察方向。通过源码级深度剖析和真实 阅读详情

一、背景需求

经常在公司里面会有添加自定义层级的一个窗口需求,比如公司里面要求你创建一个窗口属于系统的最顶层,或者创建一个窗口位于App之上,StatusBar之下等这样添窗口需求。
也是很多同学在framework系统开发窗口显示高级工程师的面试真题。

在 AOSP 14 窗口层级体系中新增两种窗口类型:

窗口类型Type 常量值定位目标 Policy Layer
TYPE_SYSTEM_TOP2042最顶层,完全独立,不隶属于任何现有 Feature 分组37
TYPE_ABOVE_APPLICATION2043应用窗口之上、StatusBar 之下9

那么这些需求到底应该如何实现呢?

二、AOSP 窗口层级体系原理

这块其实在马哥的wms课程的中已经讲解。

  • WindowManagerPolicy.getWindowLayerFromTypeLw(): 将每个 Window Type 映射为一个 policy layer(小整数)
  • WindowManagerPolicy.getMaxWindowLayer(): 返回最大 layer 号,DisplayArea 为 0~max 每层分配一个 Leaf

三、代码修改详情(4 个文件)

3.1 WindowManager.java — 窗口类型定义

core/java/android/view/WindowManager.java

新增两个窗口类型常量:

// --- 插入到 TYPE_STATUS_BAR_ADDITIONAL 之后 ---

/**
 * Window type: a window that displays at the very top of the window hierarchy,
 * above all other system windows (just below the rounded corner overlay).
 * This window type is positioned at the max layer of the current window hierarchy + 1.
 * In multiuser systems shows only on the owning user's screen.
 * @hide
 */
public static final int TYPE_SYSTEM_TOP = FIRST_SYSTEM_WINDOW + 42;  // 2042

/**
 * Window type: a window that displays between the application layer (desktop)
 * and the StatusBar. This window type is positioned at a specified layer,
 * e.g., layer 9, which sits above TYPE_SYSTEM_ALERT and below TYPE_STATUS_BAR.
 * In multiuser systems shows only on the owning user's screen.
 * @hide
 */
public static final int TYPE_ABOVE_APPLICATION = FIRST_SYSTEM_WINDOW + 43;  // 2043

注册到 @WindowType IntDef:

              TYPE_STATUS_BAR_ADDITIONAL,
+             TYPE_SYSTEM_TOP,
+             TYPE_ABOVE_APPLICATION
      })

注册到 isSystemAlertWindowType():

              case TYPE_VOLUME_OVERLAY:
+             case TYPE_SYSTEM_TOP:
+             case TYPE_ABOVE_APPLICATION:
                  return true;

3.2 WindowManagerPolicy.java — Policy Layer 映射

services/core/java/com/android/server/policy/WindowManagerPolicy.java

添加 import:

+ import static android.view.WindowManager.LayoutParams.TYPE_ABOVE_APPLICATION;
+ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_TOP;

Layer 映射:

              case TYPE_POINTER:
                  return  35;
+             case TYPE_SYSTEM_TOP:
+                 return  37;
+             case TYPE_ABOVE_APPLICATION:
+                 return  9;

Bump getMaxWindowLayer()(圆角覆盖层独占 38):

      default int getMaxWindowLayer() {
-         return 37;
+         return 38;
      }

3.3 DisplayAreaPolicy.java — Feature 层级修改

services/core/java/com/android/server/wm/DisplayAreaPolicy.java

添加 import:

+ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_TOP;

HideDisplayCutout 排除 TYPE_SYSTEM_TOP:

  .all()
  .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR,
-         TYPE_NOTIFICATION_SHADE)
+         TYPE_NOTIFICATION_SHADE, TYPE_SYSTEM_TOP)

3.4 PhoneWindowManager.java — 权限豁免

services/core/java/com/android/server/policy/PhoneWindowManager.java

checkAddPermission() 中添加权限豁免,让新 type 只需 SYSTEM_ALERT_WINDOW(而不是 INTERNAL_SYSTEM_WINDOW 签名权限):

- if (appInfo == null || (type != TYPE_APPLICATION_OVERLAY
-         && appInfo.targetSdkVersion >= O)) {
+ if (appInfo == null || ((type != TYPE_APPLICATION_OVERLAY && type != TYPE_SYSTEM_TOP
+         && type != TYPE_ABOVE_APPLICATION) && appInfo.targetSdkVersion >= O)) {

四、修改后的 DisplayArea 层级结构(来自实际 dumpsys)

最顶层的窗口层级结构树的情况

ROOT type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
  #1 Display 0 name="Built-in Screen" type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][1440,2960] bounds=[0,0][1440,2960]
   #2 Leaf:37:38 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
    #2 WindowToken{598e4e1 type=2024 android.os.BinderProxy@7d7e48} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
     #0 1a350c7 ScreenDecorOverlayBottom type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
    #1 WindowToken{eb81f18 type=2024 android.os.BinderProxy@7fef2fb} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
     #0 26ebd71 ScreenDecorOverlay type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
    #0 WindowToken{f6a3469 type=2042 android.os.BinderProxy@d5bb6f0} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
     #0 e667eee DemoTopOverlay type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]

在app上面的层级结构树情况

#0 HideDisplayCutout:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
     #0 OneHanded:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
      #1 ImePlaceholder:13:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
       #0 ImeContainer type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
        #0 WindowToken{94294b type=2011 android.os.Binder@a06ca1a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
         #0 daed721 InputMethod type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
      #0 FullscreenMagnification:0:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
       #2 Leaf:3:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
        #1 WindowToken{6dc97ed type=2038 android.os.BinderProxy@37a6a55} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
         #0 e252696 ShellDropTarget type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
        #0 WindowToken{7f7ef38 type=2043 android.os.BinderProxy@9596f9b} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
         #0 cc41b11 DemoMiddleOverlay type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
       #1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
        #3 Task=1 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
         #0 Task=29 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
          #0 ActivityRecord{97232e6 u0 com.android.launcher3/.uioverrides.QuickstepLauncher t29} type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
           #0 1722cc4 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]

关键点:TYPE_SYSTEM_TOP (layer 37) 和圆角覆盖层 (layer 38) 合并到同一个 Leaf:37:38 中。这是因为 layer 37 被 3 个 Feature exclude 后,与 layer 38(max 层,同样不在任何 Feature 中)相邻,DisplayAreaPolicyBuilder 算法会自动合并连续的无 Feature 层为单个 Leaf。

在这里插入图片描述

五、 Demo App 关键点

Demo 使用原始 int 值

由于 @hide 类型无法在 SDK 中引用,demo 代码使用原始 int 值:

private static final int TYPE_SYSTEM_TOP = 2042;
private static final int TYPE_ABOVE_APPLICATION = 2043;

添加窗口

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT,
        200,  // height
        type,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
params.y = yOffset;
windowManager.addView(overlayView, params);

Broadcast 触发

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ("com.example.testae.ADD_TOP".equals(action)) {
            addTopOverlay();
        } else if ("com.example.testae.ADD_MIDDLE".equals(action)) {
            addMiddleOverlay();
        }
    }
};
registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);

运行效果

可以看到两个窗口都位于App之上
在这里插入图片描述
最顶层窗口看看是不是在最顶层,覆盖了通知锁屏栏,但是了一个窗口确实位于通知栏下面:

在这里插入图片描述
原文地址:
https://mp.weixin.qq.com/s/Uqy8J7MC7OmvGQxXhLd9zA

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

相关推荐

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7450

小满Android研发岗笔试复盘:从四组件到构建工具链的思维升级

Android开发的核心不只在于UI编写,更涉及组件生命周期、进程优先级、Binder跨进程通信等系统级原理。理解Activity和Service的运行机制,以及AMS/WMS如何协同管理界面与任务,是进阶的基础。在工程化层面,构建工具链中的AGP版本兼容、R8混淆与资源适配直接影响发布质量,而android ota、APEX等系统组件更新机制则成为中大型公司考察的新热点。从文件分享的FileProvider权限设计,到蓝牙音频焦点联动,再到CoordinatorLayout嵌套滚动实战,这些场景均在检验开

weixin_34072637的博客 412

AI人工智能全模态大模型架构:推动智能交通发展的架构设计

本文旨在阐述全模态大模型在智能交通领域的架构设计原理和应用方法。我们将探讨如何利用多模态AI技术解决交通流量预测、事故预警、路线优化等关键问题。文章将从基础概念入手,逐步深入技术细节,最后探讨实际应用和未来发展方向。全模态大模型:能够处理和理解多种数据模态(如图像、文本、语音等)的大型AI模型智能交通系统(ITS):利用先进技术优化交通流量和安全性的综合系统多模态融合:将不同数据源的信息整合处理的技术核心概念回顾全模态大模型是能够处理多种数据类型的强大AI系统。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 834

Voltius新手入门教程:如何快速建立第一条SSH连接并高效管理你的服务器

Voltius 是一款轻量快速的本地优先(Local-first)SSH/SFTP 客户端,也是 Termius 的开源替代品。本教程面向新手,带你从零安装 Voltius,三分钟建立第一条 SSH 连接,并掌握文件夹整理、命令面板、分屏终端与 SFTP 文件传输等高效管理服务器的实用技巧。 ## Voltius 是什么?为什么推荐它 🤔 Voltius 用 Rust + Tauri 构建,

gitblog_00918的博客 223

从零开始:用Python实现AlphaZero五子棋AI(附完整代码)

本文详细介绍了如何从零开始使用Python实现AlphaZero五子棋AI。通过工程化实践,逐步构建蒙特卡洛树搜索(MCTS)、轻量化残差网络(ResNet)以及自博弈训练循环,并提供完整可运行的代码。文章旨在帮助开发者绕过复杂理论,聚焦实战,最终打造一个能够自我学习与对弈的智能体,是深度强化学习在游戏AI领域的一次完整项目实战。

weixin_29081703的博客 416

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 675

Android Framework面试核心:Binder与Handler机制深度解析

Binder机制作为Android跨进程通信的核心技术,其线程池管理与内存引用机制直接影响系统稳定性。通过分析Binder线程池的同步阻塞特性与RemoteCallbackList的自动清理机制,可以解决跨进程回调中的内存泄漏问题。Handler消息队列模型则涉及ThreadLocal存储原理,合理使用HandlerThread与LifecycleObserver能有效避免内存泄漏。这些Framework层核心技术在大厂面试中常以实际架构问题形式考察,如设计跨进程通知系统或分析Native内存泄漏。掌握Bi

weixin_30412167的博客 443

Python爬虫实战:爬取ETF基金持仓变化

在python复制编辑本文详细介绍了如何使用Python的Scrapy框架爬取ETF基金的持仓变化信息,包括项目的搭建、数据的提取与存储、以及数据的可视化分析。通过本项目,读者可以掌握基本的网页爬虫技术,并应用于实际的财经数据采集与分析中。

2201_76125261的博客 629

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 288

代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南

本教程介绍了如何使用 R 语言中的 tidymass 包进行代谢组学数据分析。tidymass 是一个专为液相色谱-质谱(LC-MS)数据设计的开源工具,提供从数据准备到统计分析的全流程支持。教程详细讲解了数据准备、数据处理、数据探索、数据清洗、代谢物注释、统计分析及结果输出的步骤。用户需准备 MS1、MS2 数据和样本信息表,并通过 tidymass 进行峰识别、峰分组、保留时间校正等操作。数据处理后,用户可进行数据探索、清洗和代谢物注释,最终通过统计分析发现潜在的生物标志物,并输出结果。教程还提供了代码

专注生信领域 1635

Google Cameraserver 看门狗CameraServiceWatchdog超时crash原理分析

本文分析了Android CameraServiceWatchdog机制的工作原理。该看门狗用于监控相机服务关键操作(如close、flush)的超时情况,通过定时器线程检测阻塞问题。文章详细讲解了Watchdog的初始化流程、使能方式、内部定时器机制(默认周期100ms,650次循环触发超时),并提供了configureStreams阶段的客制化实现方案。当检测到超时,Watchdog会触发abort生成tombstone日志,便于调试分析。

1130

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 397

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 894

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 318

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 201

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 322

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 371

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 542

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 220

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 332

Android 顶点上传:Heap 到 Direct 的零拷贝,省的是 JNI 次数

一帧数十万次putFloat的性能瓶颈源于频繁跨JNI边界,每次开销远超传输字节数。通过将写入与上传解耦:用堆内ByteBuffer高速写入,最后一次性put(writeBuf)批量传至堆外DirectByteBuffer,将数百万次边界调用压缩为一次,实现近10倍性能提升。关键在于复用堆外缓冲区、统一端序,并结合“更新-绘制”分离,仅在数据变更时上传顶点,平移缩放时零开销重绘,彻底释放CPU瓶颈。

mmsx990的博客 477

谷歌相机9.2下载(GCam 安卓通用版 安装与使用说明)

谷歌相机9.2版移植自Pixel原生相机,支持Camera2 API的Android 10+设备安装,凭借多帧合成技术在夜景、HDR+与人像模式表现优异。可提升暗光画质、优化动态范围与背景虚化效果,支持视频防抖及配置文件自定义。安装需确认机型兼容性,建议备份原相机,避免冲突。资源可通过kuake链接获取,仅限学习测试使用。

2611_96675819的博客 155

Android 系统启动与调试中的日志抓取方式全解析

│ 用户操作/系统事件 ││ │▼ ▼│ (驱动/硬件/内存管理) │ │ (App/SystemServer) ││ │ │ ││ │▼ ▼│ dmesg 命令 │ │ logd daemon ││ cat /proc/kmsg │ │ (分类存储到分区) ││ │▼ ▼│ 串口 UART │ │ logcat 命令 ││ (硬件直连,最早输出) │ │ adb logcat ││ │▼│ (汇总所有日志+系统状态) │工具最佳用途关键优势主要局限dmesg。

zhaoshuzhaoshu的专栏 265

【Android】听写播放器改版:中英文书写速度拆项与「正在读」高亮

现象:把播放页主体抽成后,里面给LazyColumn加想让它占满剩余高度,编译报错(weight 不可用)。原因weight不是通用修饰符,是RowScope的扩展函数。是个普通函数,函数体里没有接收者,自然调不到。解决private fun ColumnScope.PlaybackBody(...) { /* 这里就能用 Modifier.weight(1f) */ }调用处仍在原来的Column { }里,无需改动。预防:Compose 的布局修饰符都是作用域绑定。

木头大左的博客 241

Android 开发入门实践(十):用 Kotlin 协程完成模拟加载、取消与异常处理

本文记录第118—125课对NewsApp的协程改造:从viewModelScope.launch启动协程,逐步加入delay模拟等待、suspend函数封装、withContext(Dispatchers.IO)切换线程并观察上下文恢复机制。通过日志验证withContext完成后恢复原执行上下文(非自动回主线程),纠正了初始理解偏差。引入Job管理任务,实现加载取消与重复点击防护,结合异常处理与状态管理,完成可观察、可中断的异步流程。

Easyhood的博客 390

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 180
上一篇: aosp16 r4版本的Launcher原生自带2个crash问题分析汇总
下一篇: 系统app开发之桌面调试Launcher3 Dumpsys信息解析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值