自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

朝花夕拾

Android 系统学习总结

  • 博客(23)
  • 资源 (2)
  • 收藏
  • 关注

原创 Binder 驱动源码分析

app 进入 loop,并阻塞读。其中 write_buffer 前面四个字节表示 binder 命令:BC_REPLY其中 BC_TRANSACTION、BC_REPLY 会触发进程间数据交换。从上述代码可知,此命令只是修改了 thread 的 looper 状态为 BINDER_LOOPER_STATE_ENTERED。thread 是从哪里定义的呢?

2023-04-13 18:50:20 953

原创 Android 系统软解码方案实现

高通平台默认不支持avi格式的视频文件播放,如果需要播放avi视频,则需要自定义媒体提取器插件库。解封装后的视频数据是H.264H.265等格式,还不能直接显示到屏幕,需要通过解码器,将其还原成yuv或rga图片才能显示。由于授权和硬件限制,平台能支持的视频解码格式有限,可以通过自定义软解码器支持更多的解码格式。Android 原生多媒体框架如下:自定解码器在OpenMAX集成层 (IL) 实现。OpenMAX IL提供了一种标准化的方式识别和使用基于硬件的自定义多媒体编解码器(称为组件)。

2023-04-12 15:13:51 1834 2

原创 vsomeip 协议栈总结

Scalable service-Oriented middlewarE over IP,基于 IP 的可扩展的面向服务的中间件。SOME/IP于2011年由BMW设计,2014年纳入AUTOSAR规范。该中间件是为典型的汽车用例而设计的。帧结构IP 网络上的两个设备,可以通过 SOME/IP 消息通信进行通信,传输层可基于 TCP 或 UDP。

2023-04-09 14:25:48 2245

原创 匿名共享内存 C++ 实现

一、Ashmem C 语言接口通常可以使用 libcutils 库中的 ashmem_create_region 函数创建一块共享内存区域:#define ASHMEM_DEVICE "/dev/ashmem"/** ashmem_create_region - creates a new ashmem region and returns the file* descriptor, or <0 on error** `name' is an optional label to g

2022-02-07 20:53:37 3660 1

原创 以模块方式加载 UVC 驱动

以模块方式加载 UVC 驱动配置模块编译修改 kernel 的默认 config 文件:CONFIG_USB_VIDEO_CLASS=m高通平台通过 BOARD_VENDOR_KERNEL_MODULES 变量安装 ko 文件到文件系统。BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/uvcvideo.ko修改 init.target.rc 脚本,配置开机自动插入模块。on fs insmod /vendor/lib/module

2022-01-21 10:13:42 1663

原创 USB 调试开关设置项

打开 “USB 调试” 开关流程在开发者模式中打开 “USB调试” 开关,程序会调用如下代码: public void onAdbDialogConfirmed() { writeAdbSetting(true); }其中 writeAdbSetting 在 com.android.settingslib.development.AbstractEnableAdbPreferenceController 类中定义: protected void writeAdb

2022-01-18 22:09:23 6214

原创 视频解码测试程序

1、获取系统支持的编解码器列表Log.d(TAG, "getVideoCodecList:");final MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);for (MediaCodecInfo info : list.getCodecInfos()) { for (String type : info.getSupportedTypes()) { Log.d(TAG, "codec

2021-06-08 17:08:47 524

原创 异步通道(AsyncChannel)工作原理

异步通道,工作原理在分析 connectivity 服务过程中,会遇到大量的 AsyncChannel 使用。网上不乏有关于 AsyncChannel 实现原理分析的文章,本人觉得部分分析过于复杂,毕竟 AsyncChannel 代码实现不过几百行而已。因此作此小总结。一、功能:实现两个线程间消息的发送与回复。发送同步消息。跨进程消息传递。二、使用方法使用 AsyncChannel 功能依赖于 framework,其实现代码主要是以下文件:frameworks/base/core/ja

2021-05-27 10:40:46 738 1

原创 Android 10 路由添加原理

以 WiFi 连接网络的过程为例分析路由表添加原理WiFi 工作在 client 模式时会调用 ClientModeImpl 状态机,进入 ConnectModeState 状态,从而调用 setupClientMode 函数:[ClientModeImpl.java]private void setupClientMode() { ... updateDataInterface(); ...}updateDataInterface 函数的实现:private void

2021-05-21 11:22:51 2618

原创 init.rc 中使用 socket 命令

一、服务端创建以 netd 为例,其启动脚本如下:service netd /system/bin/netd class main socket dnsproxyd stream 0660 root inet socket mdns stream 0660 root system socket fwmarkd stream 0660 root inet onrestart restart zygote onrestart restart zygote_se

2021-05-17 19:41:52 1389

原创 Netd 服务注册过程(Android 10)

在 SystemServiceRegistry 类中,将 netd 注册成系统服务:registerService(Context.NETD_SERVICE, IBinder.class, new StaticServiceFetcher<IBinder>() { @Override public IBinder createService() throws ServiceNotFoundException { return ServiceManager.get

2021-05-13 20:59:32 1008

原创 开关WiFi和开关热点代码实现

1 WiFi开关仅系统APP可以操作WiFi开关,同时还需要声明以下权限:<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />1.1 打开WiFi通过WifiManager的setWifiEnabled可以打开WiFi:mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);mWifiManager.setWifi

2021-05-08 16:29:31 1406

原创 内置 APP 如何访问隐藏 API

Android P 之后,Android.mk 必须定义 LOCAL_SDK_VERSION 和 LOCAL_PRIVATE_PLATFORM_APIS 变量中的一个。如果不需要使用系统隐藏 API 则可以定义 LOCAL_SDK_VERSION:LOCAL_SDK_VERSION := currentor LOCAL_SDK_VERSION := system_currentor LOCAL_SDK_VERSION := test_currentor LOCAL_SDK_VERSION := c

2021-04-27 19:52:11 1817

原创 Android 10 DHCP server 工作原理

Google 官方变更说明:已更新 DHCP 服务器为了更好地构造“IP 服务器”服务体系,我们删除了 dnsmasq。Android 10 将其 DHCPv4 服务器功能替换为单独的组件,该组件主要使用 Java 编写,以便更好地与 Java 框架控制平面集成。这提高了 DHCP 服务器的安全性和可更新性。如需了解详情,请参阅 packages/modules/NetworkStack/src/android/net/dhcp/DhcpServer.java。此更改无需任何操作即可实现:默认情

2021-04-13 11:04:33 4229 7

原创 AudioFlinger 实现原理分析

本次分析基于 Android 1.6 源码,虽然随着 Android 版本的不断迭代更新,很多类和函数有很大变化,但是基本原理没有变。一、服务启动AudioFlinger 服务是驻留 system_server 进程中的,system_server 的入口函数如下:[system_main.cpp]int main(int argc, const char* const argv[]){ ... system_init();}main 函数中主要是调用 system_in.

2021-04-03 16:00:22 1300

原创 AudioTrack 实现原理分析

本次分析基于 Android 1.6 源码,虽然随着 Android 版本的不断迭代更新,很多类和函数有很大变化,但是基本原理没有变。一、构造函数分析一个类,首先看它的构造函数:[AudioTrack.java]public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)throws Illega.

2021-04-03 15:34:36 871

原创 AudioTrack 使用

一、AuidoTrack 使用步骤1、获取最小缓存区大小使用 AudioTrack 的静态成员,获取音频缓存区最小尺寸:static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)sampleRateInHz:音频采用率,常用的采样率有 8k、16k、44.1K、48k。channelConfig:声道配置,常用配置有 CHANNEL_IN_MONO (单声道)、CHANNEL

2021-04-03 15:12:54 1550

原创 Alarm 工作原理(C++)

概叙Native Alarm 承担了两部分功能:实现定时唤醒功能设置系统时间(包括 RTC 时间)定时唤醒是通过 timerfd 和 epoll 配合完成。设置 RTC 时间则是操作 rtc 驱动完成。定时实现首先调用 android_server_AlarmManagerService_init 函数实现 timerfd 和 epoll 初始化:static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject){

2021-03-22 21:27:40 1318

原创 Android Alarm 工作原理(java)

一、APP 使用闹钟设置步骤:定义一个 PendingIntent,用户闹钟到期时触发相应动作(发送广播、启动服务等);调用 AlarmManager 的 set 函数设置闹钟;对于第一步使用广播方式,需要定义广播接收器,捕捉闹钟到期广播;1、时钟类型Android framework 中定义的时钟类型:public static final int RTC_WAKEUP = 0;public static final int RTC = 1;public static final i

2021-03-22 16:38:09 1376

原创 Android 键盘 Layout 文件加载过程分析

对于输入设备,如键盘鼠标,linux 都是通过输入子系统,将键值的形式上报给应用层。Android 在处理键盘设备的键值时,并不会直接使用 kernel 上报的键值,而是通过 KeyLayoutMap 映射成 Android 系统能识别的键值。这样做可以有效的屏蔽,硬件设备厂商键对值定义的差异。那么具体的按键映射过程是怎么样的呢?下文将进行简要分析。按键设备是没有 hal 层的,在 framewok 层通过 native 类直接对应的数据设备节点。其中直接与设备进行 io 操作的就是 EventHub 类

2020-07-14 19:25:05 839

原创 Mtk Sensor 驱动框架变更简要分析

Mtk Android 8.0 以后版本,Sensor 部分主要修改了 data path 框架,原来数据通过输入子系统传递到应用层,现在采用 misc dev + poll 实现数据上报。下面以 GSensor 为例,分析数据上报过程。首先注册混杂设备驱动:acc_register_control_path --> acc_misc_init --> sensor_attr_register其 file_operation 定义如下:static const struct file_o

2020-07-13 11:57:51 1948

原创 Android MessageQueue 底层实现(C++)

文章目录java 层忽略的 native 函数通过 nativePollOnce 打开 native 世界的大门MessageQueue 向 native 层的延伸native 层的 Loopereventfd 和 epoll 推动消息流转等待超时mWakeEventFd 唤醒mRequests 列表中文件发生 IO 事件发送一个 Native 消息添加一个文件描述符监控请求java 层忽略的 native 函数Looper 在取消息时,我们提到 nativePollOnce 可能会阻塞线程。而在发送消

2020-06-22 17:13:12 1094

原创 Android MessageQueue 底层实现(java)

文章目录如何使用消息队列消息队列的工作原理2.1 首先是创建 Looper2.2 创建 Handler2.3 Looper 进入消息循环2.4 Handler 发送消息2.5 Handler 处理消息如何使用消息队列使用消息队列需要准备如下三个类:类名功能Handler负责发送和接收消息Looper负责从消息队列取消息,然后派发消息Message用于承载消息要理解消息队列的底层工作原理,首先要知道怎么在程序中使用消息队列。由于消息队列是 Android 系统

2020-06-16 15:46:21 608

MessageQueueTest.zip

Android 消息队列示例程序,演示从子线程发送消息,到主线程通过 Looper 接收消息,最后回调 Handler 处理函数的过程。以此范例为模板,深入分析 Android 消息队列实现原理。

2020-06-16

精灵虚拟光驱(Daemon Tools Lite )

精灵光驱可以在电脑上虚拟一个光驱,能很方便的打开ISO等镜像文件。

2010-11-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除