Android Bugreport完全指南:系统诊断的瑞士军刀
Android Bugreport完全指南:系统诊断的瑞士军刀前言在Android开发和系统维护中,当遇到性能问题、崩溃或异常行为时,Bugreport是最重要的诊断工具之一。它包含了系统在特定时间点的完整状态快照,是Android系统调试的”瑞士军刀”。本文将深入介绍Bugreport的结构、作用和使用方法,帮助开发者更好地利用这个强大的诊断工具。 什么是Bugreport?Bugreport是Android系统提供的一个综合诊断工具,它会收集系统在特定时间点的各种状态信息,包括: 系统配置和版本信息 运行中的进程和服务状态 系统日志和错误信息 硬件状态和性能数据 网络配置和连接状态 应用状态和权限信息 生成Bugreport方法1:通过ADB命令12345678# 生成完整的bugreportadb bugreport# 生成并保存到指定文件adb bugreport bugreport.zip# 生成并保存到指定目录adb bugreport /path/to/save/directory/ 方法2:通过设备设置 进入 设置 → 关于手机 连续点击 版本号...
Android分屏功能实现机制深度解析:Task组织与管理
Android分屏功能实现机制深度解析:Task组织与管理副标题:从WindowContainer到Task Reparenting的完整技术剖析 日期:2025年10月目标读者:Android Framework开发者预计阅读时间:25-30分钟 第1章:引言想象这样一个场景:用户正在使用微信聊天,突然需要参考邮件中的信息,于是长按最近任务中的Gmail图标,拖拽到屏幕顶部,屏幕瞬间一分为二——微信占据下半屏继续显示对话,Gmail在上半屏展开邮件列表。整个过程行云流水,仿佛两个应用天生就该这样并存。 但在这个看似简单的交互背后,Android...
Test PlantUML Diagram
This is a test post to check PlantUML rendering. Another diagram:
关于Kotlin构造函数、init函数和变量初始化的顺序探究
Kotlin既有主构函数,又有次构函数,还有一个init函数,甚至还有属性的初始化,这些执行的顺序是怎么样的,一起来看看。 测试开始测试类怎么在主构函数,和属性初始化执行时,打印一个结果呢?毕竟这二者是没有函数体的。我的答案是Kotlin的also函数,这样就可以在执行的同时打印一个log了。 12345678910111213141516171819class ClassTest constructor( value: Int = 1.also { Log.d("test", "主构函数") } ) { constructor(value: String): this(3) { Log.d("test", "次构函数") } val value2 = 2.also { Log.d("test",...
Java的继承和组合
前言继承破坏封装Java有个三原则:封装、继承、多态。封装就是对外隐藏实现细节,提供简化接口。使用者不需要关心内部是怎么实现的,而且内部的实现细节是可以随时修改的,而不影响使用者。继承可能破坏封装是因为子类和父类可能存在着实现细节的依赖。导致子类在继承父类的时候,往往不得不关心父类的实现细节,而父类在修改其实现细节的时候,如果不考虑子类,也往往会影响子类。 封装是如何被破坏的考虑以下基类Base: 123456789101112131415public class Base { private static final int MAX_NUM = 1000; private int[] arr = new int[MAX_NUM]; private int count; public void add(int number){ if(count<MAX_NUM){ arr[count++] = number; } } public void addAll(int[] numbers){ for(int...
LiveData原理
LiveData的使用123456789val livedata = LiveData<Int>()//发送数据livedata.setValue()//立即生效,只能在主线程调用livedata.postValue()//通过Handler转到主线程,有丢失数据的风险,可以用来在子线程调用//观察数据void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)livedata.observe(this) {}//第一个参数是一个`LifecycleOwner`对象,这个让LiveData具有与生命周期绑定的能力。//第二个参数是一个`Observer`,是一个回调 LiveData的使用是十分的简单的,其原理也并不复杂。 observe方法123456789101112131415161718192021@MainThread //@MainThread...
ViewModel的研究
ViewModel的使用场景 Activity or...
SharedPreferences
SharedPreferences是以键值对的方式保存数据的,数据存放在xml文件中。 获取SharedPreferences Context类的getSharedPreferences()方法。参数一:指定文件名称;参数二:指定操作模式,Android4.2之后只有MODE_PRIVATE一种模式。 Activity类的getPreferences()方法。文件名称默认是当前Activity的类名,接受一操作模式参数。 PreferenceManager类中的getDefaultSharedPerferences()方法。这是一个静态方法,接受一个Context参数,并自动使用当前应用程序的包名作为前缀命名文件名。 SharedPreferences的使用SharedPreferences对象本身不支持存储和修改,只能获取数据,存储修改是通过SharedPreferences.edit()获取内部接口Editor对象实现。 12345678910111213141516171819202122232425 1)写入数据: ...
Activity的启动流程
Application的初始化从应用进程到系统进程ActivityThread在创建的时候,会将自己的ApplicationThread绑定到AMS中。 ActivityThread.main() ActivityThread.attach() IActivityManager.attachApplication(mAppThread) Binder.transact() 应用程序通过IActivityManager接口发起系统调用,调用attachApplication并传递IApplicationThread,执行流程从应用进程到了系统进程。 ActivityManagerService.onTransact() ActivityManagerService.attachApplication(IApplicationThread thread)AMS作为IActivityService的接口的服务端实现,会响应客户端的请求,最终attachApplication(IApplicationThread...