Android
文章平均质量分 87
Lud_
积累点滴
展开
-
android 开机动画执行流程
android开机动画原理,进程启动流程,动画播放原理。原创 2024-06-05 14:04:19 · 1357 阅读 · 2 评论 -
AudioManager 相关功能实现
当插入有线耳机时,系统默认会自动将音频路由到有线耳机进行播放,此时如果想要切换到手机扬声器播放音频,可以使用 AudioManager 的 setWiredDeviceConnectionState() 方法来模拟拔出有线耳机的操作,从而将音频路由切换到手机扬声器。先获取 AudioManager,然后获取device列表,里面根据type区分device 类型,我这里选择的蓝牙协议。然后根据不同的 api 版本选择对应的方法设置device,我这里用的api31以上的。原创 2023-05-08 12:41:58 · 1199 阅读 · 1 评论 -
Android 原生播放音频有哪些方式
使用 MediaPlayerMediaPlayer特点关于 SoundPool关于 AudioTrack关于 AudioRecordAudioRecord 降噪原创 2023-05-07 18:05:31 · 1806 阅读 · 4 评论 -
Android TTS播报音频并且配合AudioManager压低其他音频声音
TTS播放音频,AudioManager 和 AudioFocusManager 控制音频播放音量和焦点。原创 2023-05-07 16:21:48 · 4826 阅读 · 0 评论 -
Android P以后为什么有的系统方法通过反射也调用不到了?
Android P以后对反射做了什么限制?有没有什么解决方案。原创 2023-03-11 18:21:54 · 1259 阅读 · 0 评论 -
android 怎样跨进程传递大图?Intent 也是采用 binder传递数据,为什么会被限制大小呢?直接使用 binder 呢?
跨进程传递大图有哪些方案TransactionTooLargeExceptionBitmap 是怎么传输的为什么 intent 带大图异常,但是 binder 传输就没有问题呢?原创 2023-02-16 20:44:16 · 1605 阅读 · 1 评论 -
深入理解 Handler(java 层 + native 层)
线程消息队列时怎样实现的消息是怎么传递的?Handle 的延迟消息是怎么处理的?IdleHandler 的原理主线程进入了 Looper 循环为什么没有 ANR?消息屏障是什么?原创 2023-02-14 21:32:02 · 1999 阅读 · 1 评论 -
Binder 跨进程传递对象的原理
1. binder 传递有哪些方式 2. binder 在传递过程中是怎样存储的 3. binder 对象序列化和反序列化的过程 4. binder 对象在传递过程中驱动做了什么原创 2023-02-08 01:05:19 · 995 阅读 · 0 评论 -
android一次完整的 IPC 通信流程是怎样的?
1. binder 整体的架构原理 2. 了解应用和binder驱动的交互原理(client 端和 Server 端与binder驱动的交互是不一样的) 3. 了解 IPC 过程中的通信协议原创 2023-02-04 17:19:10 · 900 阅读 · 0 评论 -
浅谈对 Binder 的理解
1. binder 是干嘛的 2. binder 的存在意义是怎样的 3. Android 为什么选择 binder 作为主要的 ipc 通信机制? 4. binder 的架构原创 2023-01-29 18:31:08 · 404 阅读 · 0 评论 -
android Framework 中用到了哪些跨进程通信方式?
我们常用的AMS,PMS 等都是通过Binder机制来完成跨进程通信的,那么除了Binder ,Linux 还有其他跨进程通信的方式可以选择?原创 2022-11-30 02:06:26 · 835 阅读 · 0 评论 -
Android Surface 是如何跨进程传递的?
也就是 SurfaceControl 中有一个 mGraphicBufferProducer 然后根据 mGraphicBufferProducer 创建了一个native 层 Surface 对象,然后将 native 层的 Surface 对象的指针,保存到 Java 层 Surface 对象中。因为Java层对象中保存了一个 native 层对象的指针。上面方法创建了 native 层的 surface 对象 并且和Java层的surface 层对象绑定一起,在创建对象的时候,原创 2022-11-17 21:48:32 · 1732 阅读 · 0 评论 -
Android UI 刷新机制
之前在中大概了解过 Android 的刷新机制,今天再带着问题了解一下 Android UI 的刷新机制。原创 2022-11-10 23:21:42 · 659 阅读 · 0 评论 -
Android 广播的注册和收发原理
静态广播和动态广播的分发接收原理原创 2022-10-29 17:40:22 · 1055 阅读 · 0 评论 -
Android 深入理解 Service 的启动和绑定
Android 深入理解 Service 的启动和绑定原创 2022-10-26 00:22:49 · 1773 阅读 · 0 评论 -
Android 应用的 UI 线程是怎么启动的?
- 什么是 UI 线程- UI 线程的启动流程,消息循环是怎么创建的- 连接 Android 的显示原理,UI 线程和 UI 之间是怎么关联的原创 2022-10-23 16:53:29 · 906 阅读 · 0 评论 -
谈一谈对 Android Context 的理解
Application、Activity、Service、BroadCastReceiver、ContentProvider 的 Context 有什么区别?原创 2022-10-22 02:13:13 · 939 阅读 · 0 评论 -
谈一谈 Android Application 的理解
Application的理解,作用,初始化原理等。原创 2022-10-19 20:43:25 · 959 阅读 · 0 评论 -
Android 应用是如何启动 binder 机制的?
应用启动binder机制的流程?原创 2022-10-18 14:36:48 · 757 阅读 · 0 评论 -
你知道怎样添加一个Android的系统服务么?它和binder应用服务有什么区别?
- 了解如何使用系统服务- 了解系统服务使用的基本原理- 了解服务的注册过程原创 2022-10-12 20:26:45 · 631 阅读 · 0 评论 -
跨进程通信--共享内存(ashmem)实例
提到过,ashmem 通信原理是每个进程打开同一个文件,所以文件描述符需要通过其他方式传递给其他进程,所以这里采用了 Service + aidl 的方式把共享内存的文件描述符传递过去。然后客户端获取到的文件描述符读取该内存下的内容具体步骤如下:其中 MemoryFile 是通过 ashmem 实现的。ParcelFileDescriptor 实现了Parcelable 所以可以通过binder传输。...原创 2022-08-17 20:02:48 · 765 阅读 · 0 评论 -
匿名共享内存 ashmem
mmap 是 Linux 中最为大家熟悉的共享内存方式。通过打开同一个文件,并且使用 MAP_SHARED 标志来调用 mmap() 函数,两个进程就能共享一片内存空间了。但是这种方式存在一个问题,如果分配的空间有一部分不需要了,不能单独释放这些不再使用的“物理内存”,为什么是物理内存呢,因为mmap分配的是地址空间,只有当进程存取某个页面时,才会去分配实际物理内存。这些物理内存只能通过 munmap() 一次性的释放掉。如果某个页面的物理内存不需要了,想把他单独释放,传统的 mmap 时无法做到的。...原创 2022-08-07 15:33:08 · 1683 阅读 · 0 评论 -
ServiceManager 的作用、启动流程和工作原理
ServiceManager 的架构非常简单,只有一个循环来处理消息。没有像 libbinder 中需要多线程去处理配合整个流程。从上面的代码来看 ServiceManager 主要提供 注册 binder 服务、查询 binder 服务 和 获取 binder 服务。do_add_service() 的流程主要是先检查进程是否有权限注册,接着查看是否已经注册过服务,如果已经存在则在驱动中引动计数器-1,不存在则创建一个svcinfo 的结构,把服务的名称存入结构中,...原创 2022-07-07 23:40:55 · 3531 阅读 · 1 评论 -
Android 进程间通信- Binder基础概述
Binder 基础概念原创 2022-06-04 15:37:18 · 619 阅读 · 0 评论 -
通过Intent查询组件
PMS 在系统运行过程中,很重要的一项工作就是通过 Intent 来查询组件信息。系统中响应 Intent 的组件有多个,所以返回的是列表而不是单个(比如 intent 启动的时候会让你自己选择启动哪个app,多个地图软件,多个邮箱软件等),查到的组件都是用类 ResolveInfo 来表示的,为了统一所有的组件都通过它来表示;PMS 中 Intent查询接口如下 @Override public @NonNull ParceledListSlice<ResolveInfo>.原创 2022-05-15 16:32:43 · 531 阅读 · 0 评论 -
android 卸载应用流程
文章目录如果在手机中卸载会有提示卸载页面等,这个一般是 UninstallerActivity;在这里点击卸载调用的是下面代码:ActivityThread.getPackageManager().getPackageInstaller().uninstall( new VersionedPackage(mDialogInfo.appInfo.packageName, PackageMan原创 2022-05-12 11:17:43 · 2620 阅读 · 0 评论 -
android 安装应用过程
文章目录管理会话的服务 - PackageInstallerService安装应用的开端应用安装的第一阶段-复制文件第二阶段-装载应用PMS 在创建的时候创建了PackageInstallerService,所以在安装应用之前先了解一下 PackageInstallerService :用于管理安装的服务附带的是 Android 9.0 的源码管理会话的服务 - PackageInstallerServicePackageInstallerService 主要用于管理安装会话服务,可以通过原创 2022-05-04 17:12:32 · 2397 阅读 · 0 评论 -
关于 PackageManagerService
文章目录了解 PackageManagerService了解 pm/Settings.java服务初始化过程处理 permission 文件扫描应用目录的过程当发出 Intent 时,如果系统中应用有多个相应,会弹出一个对话框让你选择?解析 APKAndroid 中的应用简单可以分为两大类:系统应用和普通应用。系统应用:系统应用是指 /system/app 或者 /system/priv-app 目录下的应用。priv-app 是4.4以后出现的,用来存放一些系统底层应用,比如 Setting、原创 2022-04-30 15:41:52 · 740 阅读 · 0 评论 -
SystemServer 中的 WatchDog
文章目录启动 WatchDogWatchDog 监控的服务和线程WatchDog 实现原理对于系统而言,大家都希望一直不出问题,但是很难保证一点不出问题。一但出问题,重启可以解决大部分的问题,因此最简单的办法是检测到了系统不正常了重启设备就好了。WatchDog 看门狗就是用来监测系统是否出问题而诞生的。工作原理是:软件系统必须定时像看门狗硬件中写入值来表示自己没出故障,俗称喂狗;否则超过了时间没有写入数据则重启设备。Android 的SystemServer 是一个复杂的进程,它启动了几十种服务,是最原创 2022-04-07 00:31:19 · 1161 阅读 · 0 评论 -
Zygote 启动应用程序流程
注册 Zygote 的 socket请求启动应用处理启动应用请求fork() 应用进程子进程初始化原创 2022-03-27 17:00:11 · 3873 阅读 · 0 评论 -
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 · 4171 阅读 · 0 评论 -
Android Framework学习目录
Framework 积累学习原创 2022-03-14 20:16:04 · 2230 阅读 · 2 评论 -
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 · 4863 阅读 · 0 评论 -
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 · 142 阅读 · 0 评论 -
androidNDK 交叉编译+静态编译和动态编译 .a和 .so库的引用
文章目录配置观景变量新建.h .c 文件并交叉编译出静态库和动态库AS加载使用静态库和动态库Android Studio mk方式加载静态库Android Studio 通过 CMake加载静态库和动态库我是在 Linux 上编译的方式配置观景变量下载好 NDK 我这里学习采用的是 R17版本 gcc 方式编译 后面的版本采用 cLang编译配置环境变量。我直接添加到了 .bash_profile 结尾export NDK_ARM_GCC="/root/ndk/android-ndk-r17c原创 2020-06-10 22:07:32 · 1749 阅读 · 0 评论 -
Android JNI 开启子线程后调用 Activity 方法更新UI
MainActivity 代码点击按钮调用 native 方法,开启线程,调用MainActivity 方法更新UIclass MainActivity : AppCompatActivity() { companion object { private const val TAG: String = "MainActivity"; init { System.loadLibrary("native-lib") }.原创 2020-05-26 02:31:14 · 1280 阅读 · 0 评论 -
Android JNI cpp文件创建 java bean 对象并返回
具体的使用方式都在代码里面了。首先准备一个 Student 和 Personclass Student { var name: String? = null; var age: Int? = 0;}class Person { constructor(){ Log.e("Person", "无参构造器"); } constructor(age: Int) { Log.e("Person", "age = $age");原创 2020-05-25 19:27:00 · 504 阅读 · 0 评论 -
Android Application创建到Activity启动(launcher启动和startActivity启动)
文章目录点击桌面应用程序创建application和activity流程点击 startActivity() 时的调用流程问题: 为什么启动时会先调用栈顶activity的onPause()点击桌面应用程序创建application和activity流程首先从APP程序入口启动 main 函数开始。看下 ActivityThread 的 main 方法。main方法中做了一些 Loop 的初始化,Application绑定流程的调用等,具体看代码:代码中有备注,省略了部分代码 public原创 2020-05-10 15:08:27 · 5447 阅读 · 0 评论 -
Android 插件化入门 (插桩原理)
文章目录插桩方式实现插件化插桩方式实现插件化项目机构如下:app为宿主application ,pluginstand为中间连接作用,负责定义主app和插件之间组件传递规则。shop用来打包插件apk。主app和shop同时依赖 pluginstand为了模拟实现网络下载插件这里采用文件拷贝的方式将apk存储到内存卡,拷贝到/data/data/目录下。app 中,首先定义 Plu...原创 2020-04-17 17:44:26 · 1208 阅读 · 0 评论 -
Android 组件化-Gradle配置
组件化 Gradle 配置1. 项目基本业务结构如下图。新建项目结构如下:2. 抽取 gradle 基本配置到 config.gradleext { // 是否开启组件化开发 true -> 开启 false -> 不开启 isOpenComponent = false android = [ compileSdkVers...原创 2020-04-13 17:35:40 · 328 阅读 · 0 评论