自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

flagstaff's blogs

read/write/fack the code

  • 博客(53)
  • 资源 (8)
  • 收藏
  • 关注

原创 MAC OS X--使用TUNA仓库下载指定部分的Android源码

背景 近期的冠状病毒在国内肆虐,当真是国之不幸,好在时至今日大有好转的迹象,致敬奋斗在前线的白衣天使。白衣天使正在前线与病毒大战,咱们身为程序猿暂时也帮不上什么忙,也只能在家操练技艺了。原本这个假期准备全家旅游的,所以也就没有带工作电脑在身边了,一些源码资料也没法看咋办?那就看现在还能看的呗。工具准备 对于工具就直接下载最新的就好了。源码的下载主要用到git、python及repo,repo...

2020-02-10 22:30:29 231

原创 Linux inotify 接口使用

概述 inotify系列接口是为了实现监听文件系统的变化而开发的。inotify功能可以监听文件夹或者文件,如果被监听的对象是文件夹,那么除了可以监听文件夹本身的事件外(例如IN_DELETE_SELF),也会监听位于其内部的文件事件(例如IN_CREATE)。基本概念 对于大脑来说还是具象化的东西容易理解容易和记忆。但是生活中为了更加高效的传递信息就必须去冗余也就是抽象化,因为越抽象其所能...

2020-02-06 18:19:09 638

原创 MAC OS X--如何在大局域网内安装Homebrew

 由于国内大长城的存在导致国外一些好的工具或者资源不是被墙就是访问速度奇慢。对于Homebrew也是如此。如果使用官方给出的安装办法安装homebrew则是非常的简洁,如果网络"给力"的同学请直接使用官方所给出的方法进行安装即可,下面给出友情连接/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/in...

2020-02-03 21:45:57 376

原创 你真的理解Android Handler吗

讲解原理前先看看Handler一般是如何在activity中使用的,如下为简单的例子private MyHandler myHandler = new MyHandler(); 1.1重写Handler中的handleMessage方法private class MyHandler extends Handler{        @Override        public...

2018-12-08 21:05:49 335

原创 Android T(13) -- system_server 虚拟机中的 Watchdog

Watchdog 在初始化完后,用户就可以使用它提供的接口来设置各种喂狗操作(monitor)了,注意了,此处的喂狗操作是并的关系,即任何一个喂狗操作(monitor)的失败都会造成system_server进程被 kill,它支持两种喂狗操作的的添加。这是添加一个喂狗操作的实例,它的作用则是监控当前进程的可用binder线程是否大于进程的最大支持的binder 线程数,即如果在看门狗的超时时间内依然没有可用的binder线程,那么也会触发系统重启。下面来看看 HandlerChecker 的类结构。

2023-06-11 10:48:05 1348

原创 AndroidT(13) init 进程 -- second stage init 中的 Epoll (三)

可见使用了 Epoll 后,只要简单的几个步骤即可,作为框架使用还是相当方便的,其中隐藏了 epoll 的数据构造,用户只要提供 监听对象和对于的触发方法即可。不过值得注意的是,这是单线程的,如果注册太多的监听对象,或者某一个处理方法中耗时过长,还是相当影响其他监听事件的处理的。

2023-06-11 10:30:38 1019

原创 AndroidT(13) init 进程 -- first stage init 的初始化 (二)

走到 kernel 启动 init 进程这一阶段时,内存中的 ramdisk 内容则是由 vendor_boot ramdik 和 init_boot ramdisk 组成的,下面是官网给出的示意图,这部分工作则是在 bootloader 阶段完成的,在此不做赘述。execv的关键点则是会使用 path 指向的可执行程序替换当前进程已在执行的程序,用人话讲就是 first init 被 /system/bin/init 替换了,下面就会执行 /system/bin/init 中的 main 入口方法了。

2023-06-11 10:28:38 3128 2

原创 AndroidT(13) init 进程 -- first stage init 的启动(一)

第一阶段的 init 工作主要用于读取系统启动阶段需要的配置信息(例如 linux的bootconfig,cmdline等配置信息)、挂载文件系统、安装 kernel 中的模块驱动,最后就是启动第二阶段的 init 来进行 Android 系统相关的组件。此处的 init 是由 linux kernel 启动的,它也是 kernel 的第一个用户程序,至于它是如何被 linux kernel 拉起来的则不在此处讨论。在init_boot中,是没有 linux kernel 的,从它的大小也能看出。

2023-06-11 10:24:38 2289

原创 AndroidT(13) Log 系统 -- logd 服务的初始化(七)

至此整个 logd 至此也准备完成了,其中的各种 unix domain socket 节点都可以使用了,例如客户端写 log 内容到 logdw,客户端同 logdr 注册log监听。

2022-12-10 13:39:20 1462

原创 AndroidT(13) Log 系统 -- SocketListener 帮助类详解(六)

1) onDataAvailable 需要用户实现。2) onDataAvailable 不在调用者线程中,而是在 SocketClient 所管理的线程。3) stopListener 可以用于请求 onDataAvailable 所在线程退出,但是如果它在处理客户端的数据则是无法响应的。例如在 onDataAvailable 中block了,那么该线程也就无法退出了。

2022-12-10 13:35:52 1070

原创 AndroidT(13) Log 系统 -- logd的编译及启动(五)

在 Android 中系统服务的启动,是 init 根据所给的 rc 配置文件 fork 而来的。logd同样也不例外,其对应的rc文件则是 logd.rc,定义如下上面rc主要做了如下几件事a)创建socket logd,用于接收控制 logd 本身的请求。b)创建socket logdr,用于client来读取由 logd 管理的log,例如logcat显示的log则是通过该节点获得。

2022-12-10 13:35:04 1440

原创 AndroidT(13) Log 系统 -- logger_write 库实现解析(四)

  经过上及章节的分析可见,不论是那种风格的LOG接口实现,最终调用的都是logger_write库中过提供的一些列接口来处理log内容的。下面就来看看 logger_write 库的实现,本章节会随着后续涉及接口的不断增加而动态更新。2.1 log tag确定 – code 1  一般使用Android 的LOG系统前,会先定义LOG_TAG宏的。但是如果没定义的话,总不能null吧,所以Android LOG系统贴心的使用程序的简称作为在用户没有设置LOG_TAG场景下的TAG值,对于代码如下  

2022-12-04 16:57:48 796

原创 AndroidT(13) Log 系统 -- logger_write 库实现解析(四)

  经过上及章节的分析可见,不论是那种风格的LOG接口实现,最终调用的都是logger_write库中过提供的一些列接口来处理log内容的。下面就来看看 logger_write 库的实现,本章节会随着后续涉及接口的不断增加而动态更新。2.1 log tag确定 – code 1  一般使用Android 的LOG系统前,会先定义LOG_TAG宏的。但是如果没定义的话,总不能null吧,所以Android LOG系统贴心的使用程序的简称作为在用户没有设置LOG_TAG场景下的TAG值,对于代码如下  

2022-12-04 16:37:22 812

原创 AndroidT(13) Log 系统 -- natvie LOG 输出的实现(三)

  前两章涉及的是LOG系统的使用方法,本章则是深入的分析这些LOG接口的实现原理,如此在使用时能够更加的得心应手的。下面给出粗略的关系图  上面的概览图中,黄色的圈代表logd的一个socket客户端,他们属于不同的进程,因为在Android的Log子系统中一个进程只允许创建一个logd的客户端。  至于logd,这里先将其理解为一个带网络功能的log储存器即可,它和它的客户端是通过socket进行通讯的。  此处就不对每一个接口进行说明了,以 RLOGD 接口为例子进行讲解,希望能起到抛砖引玉的作用

2022-12-04 16:35:50 1320

原创 AndroidT(13) Log 系统 -- C plus plus 语言格式的LOG输出(二)

kmsg大家应该更加的熟悉,因为linux存在时间可比Android悠久的多,它属于linux kernel的log子系统,Android系统是基于linux,所以除了Android系统本身规划的这些log外。在 Android 中,有着非常多的子系统,所以 Android 的 LOG 系统是支持多个buffer的,即不同类型的log写入不同的buffer中。打印到logd中的log和C语言形式的log一样,也是支持根据log级别做有选择的方式进行输出的。同样的,我们也可以将log定向到标准输出中。

2022-11-28 21:06:10 2075 2

原创 AndroidT(13) Log 系统 -- C 语言格式的LOG输出(一)

前半部分 format 指向的字符串用于描述最终输出内容的格式,而后半部分则是被前面 format 所解析的各种变量/常量,这两部分则是构成输出的内容。在 Android 中,有着非常多的子系统,所以 Android 的 ALOG 系统是支持多个buffer的,即不同类型的log写入不同的buffer中。main类型的的buffer用来打印一般的log信息,注意了,虽然是一般,但是也不要打印垃圾内容,毕竟log系统的buffer是很紧俏的。手头需要做的事有轻重缓急,log中的信息所代表的事项也同样如此。

2022-11-28 21:05:10 1949

原创 AndroidT(13) -- 根据 native appliction 的crash报告定位源码位置(一)

本小节聚焦如何根据 crash 所给的报告来定位在源码中具体的行数,使用的工具就是 addr2line。AOSP编译系统的功能非常的晚上,在对于的out目录下可以找到编译过程中的所以日志,对于编译工具链可以在文件 verbose.log 中找到。实际上,此处符号表的位置并不是编译工具链生成的,而是脚本拷贝过来的,编译工具链编译生成的也可以从 verbose.log 中获取。下面先看下crash的报告信息,这部分信息可以从logd中获取,也可以从对应的tombstone文件中获取。

2022-11-28 20:50:53 846

原创 AndroidT(13) --ActivityTaskManagerService 和 ActivityManagerService 的初始化(一)

ATMS在我看来属于AMS的一个辅助类,剥离了AMS中的一些功能到ATMS,下面引用官方的简单说明。

2022-09-27 21:38:00 1564

原创 SystemServiceManager 详解

通过 SystemServiceManager 启动的服务流程如下a)使用其单入参Context的构造函数进行实例构造。b)记录类实例及类名,方便内部查找。c)调用类实例中的onStart方法。d)返回实例化类。

2022-09-27 21:32:51 1504

原创 Android T(13)-- Looper 的实现(二)

上一章关注的时Looper的应用,本章则聚焦于其实现。诚然AOSP是开源的,且它的文档相较其他个人开源项目来说已经够有诚意了,但还是不如API文档那般事无巨细的说明。所以使用Android提供的轮子前,还是要扒开看看它内部的。...

2022-07-29 22:07:59 1685 2

原创 Android T(13)-- Looper 的使用(一)

addFd接口可以将给定的fd和对应fd数据产生时的callback注册到Looper中去,如此才能监听给定fd的状态,并调用对应的处理回调方法。对于此处BitTube实例的接收端fd,在3.3中事件投递过来后,BitTube.getFd对应的处理回调类会被回调,其实现如下。b)直接投递Message,对于Message的处理是支持延迟处理和立即处理的两种方式的,实际上前者是对后者的封装。通过接口sendObjects可以投递任意类型的数据,此处的MyData就是自定义的,类型如下。......

2022-07-29 22:07:00 1519 2

原创 AndroidT(13)--支持MultiHal 的 SensorHal 的初始化--HIDL(六)

  这部分是SensorHal部分的二阶段初始化,不放在SensorDevice中一起,主要是想强调下这俩所在进程的不同。所以在程序调用流程上也不应该柔和在一起。看起来无缝调用,只不过Android中的binder在默默耕耘罢了。  initialize 接口是在 ISensors.hal 中定义的,意味着本次从SensorDevice调用到 HalProxyV2_0::initialize是跨进程的。  eventQueueDescriptor Fast Message Queue descriptor

2022-07-03 09:54:20 1610 2

原创 AndroidT(13)支持 SensorDevice中对SensorHal(HidlSensorHalWrapper)的初始化(五)

  上一章详细的描述了SensorHal是如何启动的,其中包括了 SensorHal 相关类的实例化,从类关系上看还是比较复杂的,因为引入了各种包装类以兼容各种版本的SensorHal以及子SensorHal的支持,毫无疑问这部分也是属于SensorHal的初始化的。只不过在SensorHal启动后,SensorFrameork会明确调用SensorHal提供的initialize方法进行二阶段的初始化操作。二阶段的初始化让SensorHal有了灵魂,因为它明确了 EventQueue、wakelock以及

2022-07-03 09:51:05 1536

原创 AndroidT(13)--支持MultiHal 的 SensorHal启动--HIDL(四)

  The Sensors Multi-HAL is a framework that allows sensors HALs to run alongside other sensor HALs. The Sensors Multi-HAL dynamically loads sensors sub-HALs stored as dynamic libraries on the vendor partition and gives them a callback object that can handl

2022-06-16 22:35:57 3512

原创 Android T(13)--SensorDevice 的初始化(三)

  上一章提到过,SensorDevice如其名,用于管理Sensor的硬件操作,将SensorService和Sensor HAL很好的隔离开来。像Android这种需要大量人员同时维护的项目,通过适当的分层以及解耦让各个功能的开发可以并行进行,如此能提高开发效率和降低维的难度。  先放上整体的流程图,方便查看。去掉了一些细枝末节的部分。  SensorService中的部分 HardwareSensor是依赖硬件sensor的,所以对SensorHal的调用是不可避免,既然这部分被SensorDevi

2022-06-16 22:32:53 2435 3

原创 Android T(13)--Native 层的SensorService的启动(二)

  前面提到过java SensorService的主要实现则是由native SensorService来完成的,而后者则是由前者启动的。这里java层和native层之间相互调用的技术则是通过JNI(JAVA Native Interface)来实现的。这种方式打破了java 语言跨平台的特性,但也因此获得了高性能的特性。  前面提到 SystemServer 是运行在system_server进程的虚拟机之中的,在虚拟机运行的时候JNI_OnLoad方法也会被运行,SensorService JNI的

2022-06-11 17:00:33 2288 2

原创 Android T(13)--java层的SensorService初始化(一)

  sensorService的实现代码主要在native层,其是使用c++实现的。native sensorService 并没有作为独立的进程启动,而是由 java SensorService通过JNI代码拉起来的,而 java SensorService 则在 system_server 的虚拟机中运行。本章仅仅介绍 java SensorService的启动。  下面是对应的实现代码  mSystemServiceManager为类 SystemServiceManager 的实例,其类名和功能完

2022-06-11 16:57:07 1629

原创 java 线程池(ThreadPool)的应用--ExecutorService(一)

  很多时候为了提高效率,会提前将一些没有强关联的任务做好。例如经营一家菜馆,配菜师傅会将菜事先切好并按份分开,而不是在客人下单后才开始配菜。另一个,如果是一家能容下百十号人的菜馆,往往也是需要提前招多个厨师来同时制作不同客户所点的菜的。在java的并行编程中也是如此,为了提高效率也会提前分配好必要的资源例如,提前创建好线程池,如此在使用线程时则无需进行分配的操作。本章所说的的ExecutorService则类似于一家餐厅,其中也有配菜师傅(thread)、厨师(thread),非24小时营业的餐厅则会有关

2022-06-11 16:50:23 663

原创 VFS(Virtual filesystem)在linux kernel中的应用(七)

1.概览  VFS全称为 virtual file systemfile 即虚拟文件系统,它被设计出来的目的则是为了将文件系统抽象化及标准化。抽象的过程其实就是归纳总结的过程,需要提炼出一套适用于所有文件系统的共性来,既然是适用所有文件系统的那么也就可以称之为标准了。使用虚拟文件系统可以为用户层屏蔽掉各式各样的文件系统,例如基于内存的procfs、sysfs,基于磁盘的Ext文件系统家族以及来自于微软的NTFS、VFAT,还有来自华为的EROFS等。总之一句话,抽象而出的VFS就是为了屏蔽具体不同文件系统

2022-05-08 09:21:03 783

原创 红黑树(red black tree)在linux中的应用(六)

1. 概览  红黑树的实现原理还是比较复杂的,本章不打算涉及。下面是内核文档对红黑树的简单介绍。 Red-black trees are a type of self-balancing binary search tree, used forstoring sortable key/value data pairs. This differs from radix trees (whichare used to efficiently store sparse arrays and thus

2022-04-27 21:03:24 1652

原创 linux中的内存分配接口简析(五)

1.概览  那内存分配对于驱动工程师来说就是指的DRAM,不包括iROM/SRAM/CPU cache等SOC内部的内存。下面提到的内存管理,其所管理的主体就是DRAM。在linux中对内存的描述单位是页page,它对应的数据结构为struct page,定义如下//include\linux\mm_types.hstruct page { struct { /* Page cache and anonymous pages */ /* See page-flags.h fo

2022-04-14 22:34:48 1055

原创 linux kernel 中的推迟调用(defer callback)(四)

1.概览  推迟调用和延时的执行模型还是有些相似的,他们都是推迟某一些任务的执行,例如使用msleep时,其后面的代码也会在其返回后才能进行。但在我看来,他们的本质区别在于,推迟的这部分任务是交给第三方做还是自己亲力亲为的完成,因为使用延时方法推迟任务时,当前调用进程也就是什么也不做了,但对于推迟调用的方式是将任务抛出来,自己该干嘛还是干嘛。tasklets对于设备驱动开发者很少使用,故略过。2. Timer–定时器  定时器的概念也很好理解,为任务设置一个具体时间点让其被执行。在内核中也同样,只是这

2022-04-01 22:51:50 972

原创 linux kernel中的时间time(三)

1. 概览  你的百米记录是多少?你的千米赛跑记录是多少?你的爱车到达百公里每小时的时间是多少?在前一天晚上你就设置好了电饭煲,让其在第二天早上你醒来前就煮好粥。你的上下班点又是多少?你们又是如何和你的异性定好约会时间的?可见在人类社会中时间的概念是相当的重要。在linux的内核中也是如此,有时需要等待硬件一段时间以让其初始化完成。有时你需要在确定的几秒后来访问硬件,此时你的程序需要对比当前的时间点和开始等待的时间点间隔是否达到了要求值。2. 每秒系统滴答次数–HZ  HZ代表kernel的系统时钟每

2022-04-01 08:19:44 2423

原创 linux kernel中的延时(二)

1.概览  在设备驱动中,有时候在驱动中延迟执行一些指令以等待硬件完成。延时一般分为两大类,第一类为忙等待即CPU在此期间执行的指令目的地仅仅是为了消耗时间。第二类为休眠等待唤醒,即在延时点进入休眠,然后被唤醒,这也就实现了驱动的等待功能。2.CPU忙等待延时2.1 mdelay  代码过于简单,下面则是示例代码time_test_drv_init DELAY_TEST_INFO("start:%lld ns", ktime_get_boottime_ns()); mdelay(1

2022-04-01 08:17:24 5137

原创 linux kernel时钟获取

1. 概览  你的百米记录是多少?你的千米赛跑记录是多少?你的爱车到达百公里每小时的时间是多少?在前一天晚上你就设置好了电饭煲,让其在第二天早上你醒来前就煮好粥。你的上下班点又是多少?你们又是如何和你的异性定好约会时间的?可见在人类社会中时间的概念是相当的重要。在linux的内核中也是如此,有时需要等待硬件一段时间以让其初始化完成。有时你需要在确定的几秒后来访问硬件,此时你的程序需要对比当前的时间点和开始等待的时间点间隔是否达到了要求值。2. 每秒系统滴答次数–HZ  HZ代表kernel的系统时钟每

2022-04-01 08:11:28 9524

原创 linux kernel 中双向链表详解(一)

1.概览  list_head 在kernel代码中非常的常见,其本身则是一个双向链表,在使用时只需要将其嵌入到任意结构体中,就可以实现栈/队列的数据结构。并且删除,添加的操作时间复杂度都是O(1)。2.list_head之栈实现 前面提到过,嵌入list_head可以实现的栈(stack)数据结构。下面的代码实现很简单,其功能则是在驱动的初始化函数中将数据入栈并显示当前栈信息,在驱动的卸载函数中出栈数据并释放内存。随意定义个苹果数据结构,并将head_list嵌入其中,定义如下struct app

2022-03-23 23:28:59 3409

原创 Android R(11) 为HIDL服务添加观察者模式(Observer Pattern)的支持(十)

1.观察者模式(Observer Pattern)简介  当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。通俗的举个例子,以前没有电热水器的时候,我们需要将水壶放到炉灶上加热,并且守在旁边或者隔一段时间主动的来查看水壶中的水是否被烧开,如果烧开了就停止加热,反之则继续等待。但是现在我们有了电热水壶,此时我们可以给电热水壶设置一个指定的温度,让其达到这个温度时发出铃声来主动通知我。这里的设定温度(观

2022-02-15 22:51:50 1424

原创 Android R(11)为客户端添加HIDL服务的死亡通知( Death recipients)回调(九)

  一般HIDL服务的调用者(client)和其是不在同一个进程中(process)中的,HIDL service一般提供的是硬件功能,而调用者(client)则是基于此硬件功能来实现特色功能的。此处假设HIDL-light service只提供控制具体led的开和关的硬件功能,client 则是实现led每1秒进行闪烁的特色功能。从上面的假设可知client需要连续调用HIDL-light service所提供的led控制接口,并且其间隔为1秒。如果HIDL-light service意外退出了,那么cl

2022-02-05 18:15:40 4519 7

原创 Android R(11)跨进程调用自定义HIDL服务接口(八)

  幸苦添加的HIDL service是为了服务各个client请求的。在实际场景中,HIDL service一般对应某个硬件模块,其中的接口则对应硬件所具备的功能。各个client则是对该模块有具体需求的。例如 HIDL-Light中则会提供控制具体led的接口,那么client则可以通过HIDL-Light所提供的接口来控制led,来实现各种联动功能。1.Android.bp 说明  HIDL的服务是支持cpp/ndk/java方式调用的,这里选用cpp的方式进行调用。那么编译的模块则是cc_bin

2022-01-22 20:42:59 3087

原创 Android R(11)[How to download the full code.]完整代码下载

giteegiteehttps://gitee.com/solo-king/android-rhidl-about?_from=gitee_search

2022-01-19 21:20:33 1209

AirSync Manual

想在自己的蓝牙单板上实现AirSync,那就必须好好研究下这个协议了。

2016-03-19

Android serial port 1.1

最近公司项目需要用到安卓端串口,故顺便实现下Android端的串口工具,该有的功能都有。 开发环境:Android studio 2.2 +NDK 要求4.3以上机子 想直接运行: APK位置:NdkDevelper\app\build\outputs\apk ps:要是你的串口设备名字不是ttymxc打头的那就修改下源码里面driverName重新编译下即可,程序启动会自动搜索。 1积分相信都能下载的起,有问题直接评论,抽空会给予解答的,要是有必要的话会写下专题博客。开源万岁

2016-11-01

stc15xxxx单片机RFID RC 522 读写卡程序可直接用

stc15xxxx单片机RFID RC 522 读写卡程序可直接用

2015-05-12

NRF24L01+ 适配STC15F2K60S2中断实现收发

NRF24L01+ 适配STC15F2K60S2中断实现收发,对于刚刚开始玩无线模块的新手调试肯定是相当头疼的,这个是我专门为STC15系列单片机移植的,接收和发送函数分开写了,让新手容易看清楚。并且实现了串口中断的发送,方便调试。

2015-06-07

微信蓝牙airsync协议

基于赛普拉公司10系列,写的微信airsync,10积分不多毕竟调试不容易。而好的参考代码网上基本没有。注释比较详细

2016-06-05

空空如也

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

TA关注的人

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