framework工作中遇到陌生窗口怎么高效找代码?-vip学员疑问解答

背景:

经常在实际开发过程中会遇到系统中各个不同的窗口,特别是系统中的各个窗口,种类非常非常多,不同应用不同场景等,有时候需要对相关的窗口进行修改等需要,就需要找到对应的窗口代码,然后修改相关的需求。所以第一步需要解决问题是如何找到窗口的正确代码在整个复杂的系统代码中?

比如学员如下场景的窗口为案例:
在这里插入图片描述

输入法时候对输入文字进行选中,有剪切,赋值这个悬浮窗口,如何在源码中找到它?难道对窗口字符串进行grep??那估计系统中这样的多如牛毛,如同大海捞针,下面来详细介绍方法

探索步骤1

只要是窗口相关的一般最开始都是按照马哥wms/ams专题课程讲解方法进行dumpsys window windows
比如我们拿

dumpsy的情况如下:

在这里插入图片描述

上面从window名字线索只获取了个popupwindow名字,这个window名字线索平时对于一些系统窗口有自己独特名字的是非常有作用的哈,但是今天这个明显不太行啊,因为popupwindow太多了,没办法靠window的名字就准确找到窗口的源码位置。
这里大家可能还会注意到另一个线索,那就是这个窗口属于com.android.launcher进程,那么是不是可以只去Launcher3的代码中,这样popwindow数量就很少?
哈哈哈想法很美好,其实肯定是不行的,因为window属于Launcher进程的,不代表他的窗口代码一定在Launcher3的代码,因为完全还是有可能在系统的framework代码中。
那么接下来该怎么办呢?

探索步骤2

基于上面想直接根据Window Name进行grep代码方式不行,但是上面的线索还是很有作用的,主要有以下两个线索:

1、属于popupwindow类型窗口
2、属于桌面launcher进程的窗口

有了这两点,是否可以考虑去popwindow这个类里面加打印堆栈等,然后从日志中只过滤出桌面进程的日志呢?
那么说干就干:
PopupWindow的对应源码位置

frameworks/base/core/java/android/widget/PopupWindow.java
找到对应的构造函数加入堆栈日志打印
在这里插入图片描述

注意这里可以看到PopupWindow的构造函数还是有很多方法重载,为了保险起见建议对每个都进行添加堆栈打印哈。
接下来在对重新操作输入法展示出PopupWindow,然后看看日志堆栈:

<init>:423, PopupWindow (android.widget)
<init>:407, PopupWindow (android.widget)
<init>:377, PopupWindow (android.widget)
createPopupWindow:1484, LocalFloatingToolbarPopup (com.android.internal.widget.floatingtoolbar)
<init>:200, LocalFloatingToolbarPopup (com.android.internal.widget.floatingtoolbar)
createInstance:94, FloatingToolbarPopup (com.android.internal.widget.floatingtoolbar)
<init>:113, FloatingToolbar (com.android.internal.widget.floatingtoolbar)
createFloatingActionMode:2083, DecorView (com.android.internal.policy)
createActionMode:1932, DecorView (com.android.internal.policy)
startActionMode:915, DecorView (com.android.internal.policy)
startActionModeForChild:872, DecorView (com.android.internal.policy)
startActionModeForChild:1037, ViewGroup (android.view)
startActionModeForChild:1037, ViewGroup (android.view)
startActionModeForChild:1037, ViewGroup (android.view)
startActionModeForChild:1037, ViewGroup (android.view)
startActionModeForChild:1037, ViewGroup (android.view)
startActionMode:7863, View (android.view)
startActionModeInternal:2583, Editor (android.widget)
startActionMode:304, SelectionActionModeHelper (android.widget)
startSelectionActionMode:285, SelectionActionModeHelper (android.widget)
lambda$startSelectionActionModeWithSmartSelectAnimation$0:341, SelectionActionModeHelper (android.widget)
$r8$lambda$PZStX4cKkPCuDWShyq4BlMwoihY:-1, SelectionActionModeHelper (android.widget)
run:-1, SelectionActionModeHelper$$ExternalSyntheticLambda9 (android.widget)
startSelectionActionModeWithSmartSelectAnimation:349, SelectionActionModeHelper (android.widget)
$r8$lambda$LnuIaG_b46mDjNxD4dDUnF4R3K4:-1, SelectionActionModeHelper (android.widget)
accept:-1, SelectionActionModeHelper$$ExternalSyntheticLambda11 (android.widget)
onPostExecute:1054, SelectionActionModeHelper$TextClassificationAsyncTask (android.widget)
onPostExecute:1002, SelectionActionModeHelper$TextClassificationAsyncTask (android.widget)
finish:771, AsyncTask (android.os)
-$$Nest$mfinish:-1, AsyncTask (android.os)
handleMessage:788, AsyncTask$InternalHandler (android.os)
dispatchMessage:106, Handler (android.os)
loopOnce:205, Looper (android.os)
loop:294, Looper (android.os)
main:8248, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:552, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:971, ZygoteInit (com.android.internal.os)

从上面的日志堆栈是不是准确定位出来了窗口对应代码类是LocalFloatingToolbarPopup

在这里插入图片描述

导致就顺利找到代码啦

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
### 回答1: 您好,关于在.NET Framework 1.1下的多线程管理代码,可以使用System.Threading命名空间提供的类和方法来实现。具体实现方法如下: 1. 创建一个线程对象: Thread t = new Thread(new ThreadStart(MethodName)); 2. 启动线程: t.Start(); 3. 等待线程执行完成: t.Join(); 4. 设置线程的优先级: t.Priority = ThreadPriority.AboveNormal; 5. 止线程: t.Abort(); 6. 使线程休眠指定的时间: Thread.Sleep(1000); 7. 设置线程的名称: t.Name = "ThreadName"; 8. 判断线程是否还在运行: if (t.IsAlive) { // 线程还在运行 } 希望以上信息能够对您有所帮助。 ### 回答2: 在.NET Framework 1.1下,编写多线程管理代码需要以下步骤: 1. 使用System.Threading命名空间:在代码文件开头添加`using System.Threading;`以引入System.Threading命名空间,该命名空间提供了多线程编程所需的类和方法。 2. 创建线程实例:使用Thread类的构造函数创建线程实例。例如,可以通过`Thread thread = new Thread(new ThreadStart(MethodName));`来创建一个新线程,其`MethodName`是在新线程要执行的方法。 3. 启动线程:调用线程实例的Start方法启动线程。例如,使用`thread.Start();`启动前面创建的线程。 4. 线程同步:在多线程环境下,为了避免出现数据竞争和不一致的情况,需要使用线程同步机制。在.NET Framework 1.1,可以使用Monitor类或lock语句实现线程同步。例如,可以使用`Monitor.Enter(object)`和`Monitor.Exit(object)`来获取和释放一个锁,进而保护共享资源的访问。 5. 线程间通信:多个线程之间可能需要进行通信,可以使用Monitor类或lock语句的对象作为通信的依据。例如,可以使用Monitor类的`Wait(object)`、`Pulse(object)`和`PulseAll(object)`方法来实现线程间的等待和唤醒。 6. 线程终止:可以使用Thread类的Abort方法来终止一个线程的执行。但是要注意,在.NET Framework,强制终止线程可能会导致资源泄漏和应用程序崩溃,因此请谨慎使用Abort方法。 需要注意的是,由于.NET Framework 1.1是相对较旧的版本,其多线程编程的功能和性能可能相对较弱。建议考虑升级到较新的.NET Framework版本(如4.x)以获得更好的多线程编程支持。 ### 回答3: 在.NET Framework 1.1下,可以使用以下步骤编写多线程管理代码: 1. 创建线程:使用Thread类创建新线程。可以通过创建Thread对象,并传递一个方法作为参数来实现。例如:Thread myThread = new Thread(new ThreadStart(MyMethod)); 2. 启动线程:使用Start方法来启动线程。例如:myThread.Start(); 3. 同步线程:使用Monitor类实现线程同步。通过使用Monitor类的Enter和Exit方法来创建临界区域,确保在同一时间只有一个线程可以访问临界资源。例如: Monitor.Enter(lockObject); // 访问临界资源的代码 Monitor.Exit(lockObject); 4. 等待线程完成:使用Join方法来等待其他线程的完成。例如:myThread.Join(); 5. 暂停和恢复线程:使用Thread类的Suspend和Resume方法来暂停和恢复线程的执行。但是需要注意,这些方法已经在后续版本的.NET Framework被弃用,因为它们可能导致死锁和其他线程安全问题。 6. 取消线程:使用Thread类的Abort方法来取消正在执行的线程。例如:myThread.Abort(); 需要注意的是,.NET Framework 1.1的多线程管理相对于后续版本而言较为基础和简单。对于更复杂的多线程操作,建议升级到较新的.NET Framework版本,如.NET Framework 4.0+,以利用更强大和更安全的多线程管理功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值