Framework
文章平均质量分 75
翻滚吧香香
这个作者很懒,什么都没留下…
展开
-
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 · 883 阅读 · 0 评论 -
匿名共享内存 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 · 3566 阅读 · 1 评论 -
USB 调试开关设置项
打开 “USB 调试” 开关流程在开发者模式中打开 “USB调试” 开关,程序会调用如下代码: public void onAdbDialogConfirmed() { writeAdbSetting(true); }其中 writeAdbSetting 在 com.android.settingslib.development.AbstractEnableAdbPreferenceController 类中定义: protected void writeAdb原创 2022-01-18 22:09:23 · 5861 阅读 · 0 评论 -
视频解码测试程序
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 · 509 阅读 · 0 评论 -
异步通道(AsyncChannel)工作原理
异步通道,工作原理在分析 connectivity 服务过程中,会遇到大量的 AsyncChannel 使用。网上不乏有关于 AsyncChannel 实现原理分析的文章,本人觉得部分分析过于复杂,毕竟 AsyncChannel 代码实现不过几百行而已。因此作此小总结。一、功能:实现两个线程间消息的发送与回复。发送同步消息。跨进程消息传递。二、使用方法使用 AsyncChannel 功能依赖于 framework,其实现代码主要是以下文件:frameworks/base/core/ja原创 2021-05-27 10:40:46 · 714 阅读 · 1 评论 -
Android 10 路由添加原理
以 WiFi 连接网络的过程为例分析路由表添加原理WiFi 工作在 client 模式时会调用 ClientModeImpl 状态机,进入 ConnectModeState 状态,从而调用 setupClientMode 函数:[ClientModeImpl.java]private void setupClientMode() { ... updateDataInterface(); ...}updateDataInterface 函数的实现:private void原创 2021-05-21 11:22:51 · 2535 阅读 · 0 评论 -
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 · 1315 阅读 · 0 评论 -
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 · 989 阅读 · 0 评论 -
开关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 · 1354 阅读 · 0 评论 -
内置 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 · 1704 阅读 · 0 评论 -
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 · 3955 阅读 · 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 · 1240 阅读 · 0 评论 -
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 · 822 阅读 · 0 评论 -
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 · 1455 阅读 · 0 评论 -
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 · 1286 阅读 · 0 评论 -
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 · 1343 阅读 · 0 评论 -
Android 键盘 Layout 文件加载过程分析
对于输入设备,如键盘鼠标,linux 都是通过输入子系统,将键值的形式上报给应用层。Android 在处理键盘设备的键值时,并不会直接使用 kernel 上报的键值,而是通过 KeyLayoutMap 映射成 Android 系统能识别的键值。这样做可以有效的屏蔽,硬件设备厂商键对值定义的差异。那么具体的按键映射过程是怎么样的呢?下文将进行简要分析。按键设备是没有 hal 层的,在 framewok 层通过 native 类直接对应的数据设备节点。其中直接与设备进行 io 操作的就是 EventHub 类原创 2020-07-14 19:25:05 · 804 阅读 · 0 评论 -
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 · 1077 阅读 · 0 评论 -
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 · 591 阅读 · 0 评论