- 博客(209)
- 资源 (15)
- 收藏
- 关注

原创 Bug Notes online
文章目录Kotlin调用Long类型的HashCode导致线上CrashKotlin调用Long类型的HashCode导致线上CrashCaused by: java.lang.NoSuchMethodError: No static method hashCode(J)I in class Ljava/lang/Long; or its super classes (declaration of ‘java.lang.Long’ appears in /system/framework/core-
2021-08-28 14:43:58
180
原创 AudioManager 相关功能实现
当插入有线耳机时,系统默认会自动将音频路由到有线耳机进行播放,此时如果想要切换到手机扬声器播放音频,可以使用 AudioManager 的 setWiredDeviceConnectionState() 方法来模拟拔出有线耳机的操作,从而将音频路由切换到手机扬声器。先获取 AudioManager,然后获取device列表,里面根据type区分device 类型,我这里选择的蓝牙协议。然后根据不同的 api 版本选择对应的方法设置device,我这里用的api31以上的。
2023-05-08 12:41:58
1602
原创 Android 原生播放音频有哪些方式
使用 MediaPlayerMediaPlayer特点关于 SoundPool关于 AudioTrack关于 AudioRecordAudioRecord 降噪
2023-05-07 18:05:31
2068
4
原创 Android TTS播报音频并且配合AudioManager压低其他音频声音
TTS播放音频,AudioManager 和 AudioFocusManager 控制音频播放音量和焦点。
2023-05-07 16:21:48
5517
原创 关于近期对项目性能和稳定性优化的总结
重构原因重构步骤代码结构卡顿优化CPU 线程相关内存优化其他优化序列化取消单例模式接口隔离的好处代码注释和命名规范并发引起的数据问题谋定而后动
2023-04-20 18:20:28
329
原创 android 怎样跨进程传递大图?Intent 也是采用 binder传递数据,为什么会被限制大小呢?直接使用 binder 呢?
跨进程传递大图有哪些方案TransactionTooLargeExceptionBitmap 是怎么传输的为什么 intent 带大图异常,但是 binder 传输就没有问题呢?
2023-02-16 20:44:16
1794
1
原创 深入理解 Handler(java 层 + native 层)
线程消息队列时怎样实现的消息是怎么传递的?Handle 的延迟消息是怎么处理的?IdleHandler 的原理主线程进入了 Looper 循环为什么没有 ANR?消息屏障是什么?
2023-02-14 21:32:02
2220
1
原创 Binder 跨进程传递对象的原理
1. binder 传递有哪些方式 2. binder 在传递过程中是怎样存储的 3. binder 对象序列化和反序列化的过程 4. binder 对象在传递过程中驱动做了什么
2023-02-08 01:05:19
1133
原创 android一次完整的 IPC 通信流程是怎样的?
1. binder 整体的架构原理 2. 了解应用和binder驱动的交互原理(client 端和 Server 端与binder驱动的交互是不一样的) 3. 了解 IPC 过程中的通信协议
2023-02-04 17:19:10
980
原创 浅谈对 Binder 的理解
1. binder 是干嘛的 2. binder 的存在意义是怎样的 3. Android 为什么选择 binder 作为主要的 ipc 通信机制? 4. binder 的架构
2023-01-29 18:31:08
445
原创 android Framework 中用到了哪些跨进程通信方式?
我们常用的AMS,PMS 等都是通过Binder机制来完成跨进程通信的,那么除了Binder ,Linux 还有其他跨进程通信的方式可以选择?
2022-11-30 02:06:26
899
原创 Android Surface 是如何跨进程传递的?
也就是 SurfaceControl 中有一个 mGraphicBufferProducer 然后根据 mGraphicBufferProducer 创建了一个native 层 Surface 对象,然后将 native 层的 Surface 对象的指针,保存到 Java 层 Surface 对象中。因为Java层对象中保存了一个 native 层对象的指针。上面方法创建了 native 层的 surface 对象 并且和Java层的surface 层对象绑定一起,在创建对象的时候,
2022-11-17 21:48:32
1960
原创 Android 应用的 UI 线程是怎么启动的?
- 什么是 UI 线程- UI 线程的启动流程,消息循环是怎么创建的- 连接 Android 的显示原理,UI 线程和 UI 之间是怎么关联的
2022-10-23 16:53:29
990
原创 谈一谈对 Android Context 的理解
Application、Activity、Service、BroadCastReceiver、ContentProvider 的 Context 有什么区别?
2022-10-22 02:13:13
983
原创 你知道怎样添加一个Android的系统服务么?它和binder应用服务有什么区别?
- 了解如何使用系统服务- 了解系统服务使用的基本原理- 了解服务的注册过程
2022-10-12 20:26:45
668
原创 跨进程通信--共享内存(ashmem)实例
提到过,ashmem 通信原理是每个进程打开同一个文件,所以文件描述符需要通过其他方式传递给其他进程,所以这里采用了 Service + aidl 的方式把共享内存的文件描述符传递过去。然后客户端获取到的文件描述符读取该内存下的内容具体步骤如下:其中 MemoryFile 是通过 ashmem 实现的。ParcelFileDescriptor 实现了Parcelable 所以可以通过binder传输。...
2022-08-17 20:02:48
837
原创 匿名共享内存 ashmem
mmap 是 Linux 中最为大家熟悉的共享内存方式。通过打开同一个文件,并且使用 MAP_SHARED 标志来调用 mmap() 函数,两个进程就能共享一片内存空间了。但是这种方式存在一个问题,如果分配的空间有一部分不需要了,不能单独释放这些不再使用的“物理内存”,为什么是物理内存呢,因为mmap分配的是地址空间,只有当进程存取某个页面时,才会去分配实际物理内存。这些物理内存只能通过 munmap() 一次性的释放掉。如果某个页面的物理内存不需要了,想把他单独释放,传统的 mmap 时无法做到的。...
2022-08-07 15:33:08
1801
原创 ServiceManager 的作用、启动流程和工作原理
ServiceManager 的架构非常简单,只有一个循环来处理消息。没有像 libbinder 中需要多线程去处理配合整个流程。从上面的代码来看 ServiceManager 主要提供 注册 binder 服务、查询 binder 服务 和 获取 binder 服务。do_add_service() 的流程主要是先检查进程是否有权限注册,接着查看是否已经注册过服务,如果已经存在则在驱动中引动计数器-1,不存在则创建一个svcinfo 的结构,把服务的名称存入结构中,...
2022-07-07 23:40:55
3967
1
原创 通过Intent查询组件
PMS 在系统运行过程中,很重要的一项工作就是通过 Intent 来查询组件信息。系统中响应 Intent 的组件有多个,所以返回的是列表而不是单个(比如 intent 启动的时候会让你自己选择启动哪个app,多个地图软件,多个邮箱软件等),查到的组件都是用类 ResolveInfo 来表示的,为了统一所有的组件都通过它来表示;PMS 中 Intent查询接口如下 @Override public @NonNull ParceledListSlice<ResolveInfo>.
2022-05-15 16:32:43
666
原创 android 卸载应用流程
文章目录如果在手机中卸载会有提示卸载页面等,这个一般是 UninstallerActivity;在这里点击卸载调用的是下面代码:ActivityThread.getPackageManager().getPackageInstaller().uninstall( new VersionedPackage(mDialogInfo.appInfo.packageName, PackageMan
2022-05-12 11:17:43
2793
原创 android 安装应用过程
文章目录管理会话的服务 - PackageInstallerService安装应用的开端应用安装的第一阶段-复制文件第二阶段-装载应用PMS 在创建的时候创建了PackageInstallerService,所以在安装应用之前先了解一下 PackageInstallerService :用于管理安装的服务附带的是 Android 9.0 的源码管理会话的服务 - PackageInstallerServicePackageInstallerService 主要用于管理安装会话服务,可以通过
2022-05-04 17:12:32
2519
原创 关于 PackageManagerService
文章目录了解 PackageManagerService了解 pm/Settings.java服务初始化过程处理 permission 文件扫描应用目录的过程当发出 Intent 时,如果系统中应用有多个相应,会弹出一个对话框让你选择?解析 APKAndroid 中的应用简单可以分为两大类:系统应用和普通应用。系统应用:系统应用是指 /system/app 或者 /system/priv-app 目录下的应用。priv-app 是4.4以后出现的,用来存放一些系统底层应用,比如 Setting、
2022-04-30 15:41:52
819
原创 SystemServer 中的 WatchDog
文章目录启动 WatchDogWatchDog 监控的服务和线程WatchDog 实现原理对于系统而言,大家都希望一直不出问题,但是很难保证一点不出问题。一但出问题,重启可以解决大部分的问题,因此最简单的办法是检测到了系统不正常了重启设备就好了。WatchDog 看门狗就是用来监测系统是否出问题而诞生的。工作原理是:软件系统必须定时像看门狗硬件中写入值来表示自己没出故障,俗称喂狗;否则超过了时间没有写入数据则重启设备。Android 的SystemServer 是一个复杂的进程,它启动了几十种服务,是最
2022-04-07 00:31:19
1295
原创 Android SystemServer 进程
SystemServer 是系统的核心之一,大部分android提供的服务都运行在这个进程中,SystemServer 中运行的服务大概有八十多种。为了防止应用进程对系统造成破坏,Android应用进程没有权限直接访问设备的底层资源,只能通过 SystemServer 中的服务代理访问。通过 Binder 用户进程使用 SystemServer 中的服务并没有太多不便之处。
2022-04-02 16:52:47
3762
原创 Android Framework- Zygote进程以及其初始化
文章目录Zygote 概述Zygote 进程的初始化app_process 的 main 函数main函数启动流程启动虚拟机 AndroidRuntime类启动虚拟机初始化工作 ZygoteInit 类Zygote 概述Zygote 时android中非常重要的一个进程,它和 init 进程、SystemServer 进程同为支持Android最重要的进程。、Linux 的进程时通过系统调用 fork 产生的,fork 出的子进程除了内核中的一些核心数据结构和父进程不同外,其余的内存影像都是和父进程
2022-03-20 14:46:54
4257
原创 Android Framework- Android 第一个用户进程:Init进程(概述)
文章目录概述Bootloader 引导装载和启动 Linux 内核启动 Init 进程(基于 Android9 源码)Init 进程的初始化过程main 函数执行流程解析启动 init.rcinit 文件格式介绍init 进程对信号的处理概述在介绍 Init 之前,先了解一下Android系统的启动过程。从系统角度看,android 系统启动大概分为三个大阶段:bootloader引导、装载,和启动Linux内核,启动Android系统三个大的阶段。其中Android系统的启动还可以分为 启动 Ini
2022-03-14 20:14:10
4970
原创 HashMap 源码细节解析
文章目录new HashMap<>(); 初始化过程首次 hashMap.put("key", "value"); 创建空间过程非首次调用 hashMap.put("key", "value"); 插入值和扩容的逻辑分析 get 流程:hashMap.get("key");分析 remove 流程:hashMap.remove("key");往红黑树中插入值将链表转换为红黑树:treeifyBin(tab, hash);从红黑树中读取操作HashMap 常被问到的问题分析JDK版本:15.0.
2021-12-19 19:16:18
474
原创 Android性能优化(总结优化点)
文章目录概述APP启动优化APP内存优化APP布局优化APP卡顿优化APP线程优化APP网络优化APP电量优化APP apk瘦身优化APP稳定性优化APP专项技术优化概述总结性的内容,总结了一些优化可以注意的点。APP启动优化启动优化思想APP内存优化内存检测 (查找内存泄漏和对象数量分配)Android Profile (直观,新版本可以直接查看最近一次GC Route路线,对查找内存泄漏问题很好用)Memory Analyzer(MAT):查找引用和内存泄漏比较方便Leak
2021-10-14 21:06:28
2036
原创 Android性能优化-启动优化思想
文章目录启动时间测量方式通过adb命令启动时间测量方式通过adb命令adb shell am start -W [PackageName]/com.[packageName].SplashActivity注意:前面部分时你的 applicationId 在 gradle中配置的 ,测试的就是debug的id,release的就是release的。后面是你对应启动activity的package+activity具体路径(必须是在AndroidManifest.xml中配置了如下配置)<in
2021-08-26 20:58:48
251
Component-based.zip
2020-04-13
底部列表Dialog.7z
2019-06-26
购物车数量加减,并统计选中数量和选中总价
2016-08-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人