- 博客(15)
- 资源 (2)
- 收藏
- 关注
原创 编写一个Android应用程序测试HelloService
在经历了驱动层的窒息,Native层的缺氧,Framework层的束缚之后,我们终于来到了熟悉应用层,可以自由呼吸了。这篇文章的目的是写一个Android应用,通过getSystemService方法拿到HelloManager,然后调用readVal和writeVal方法,验证上篇文章写的JNI方法和服务能否正常运行。 打开Android Studio新建一个Android项目,Activit...
2018-03-18 22:52:08
559
原创 为设备hello增加JNI方法并在Frameworks层增加硬件访问服务
我们编写的hello设备驱动是运行在内核层的。我们写的测试程序运行在用户空间,但却是用C语言编写。Android应用使用JAVA编写,想要在Android中实现应用和驱动的交互,也就是实现JAVA代码和c语言的交互,这其中必然会使用到JNI技术。 由于服务单独运行在一个进程中,而且会为运行在不同进程的服务或者应用提供接口。那么他们之间的交互,必然会用到IPC,具体到Android中,就是Bind...
2018-03-17 22:51:48
778
原创 编写一个Android Linux内核驱动并用C可执行程序测试
罗升阳博客里是典型的字符型设备的驱动实现,但是我打算实现一个misc设备驱动。misc设备本质上还是一个字符设备,主设备号为10,但是它实现起来比较简单。 我们驱动要实现的功能是,用户空间调用设备的write函数写入一个int类型的值,然后再调用read函数把它读出来。功能简单,但这一来一往足以让我们了解驱动的写法。 驱动编写 驱动是内核层面的事情,所以我们先进入到内核源码的dr...
2018-03-11 23:50:57
765
原创 在Ubuntu16.04上下载并编译Android内核源代码
上一篇文章提到,启动模拟器使用的Android内核镜像是AOSP提前编译好的。而AOSP中又不包含Linux Kernel的源码。为了能全方位立体化的搞懂Android那就自己下载并编译Linux Kernel for Android吧。 1.下载 Linux Kernel for Android的源代码使用Git管理 首先我们新建一个文件夹用来装即将下载的代码 mkdir ker...
2018-02-26 22:54:30
726
原创 在Ubuntu16.04上下载并编译Android源代码
Android源代码位于Google的Git代码库中,由于Android源代码工程过于复杂庞大,所以Google以Git为基础用Python脚本,写了一个管理工具Repo。 1.安装Repo 在安装Repo之前,假定已经安装好了git。 mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-down...
2018-02-22 19:07:24
2657
原创 Android系统的启动过程
init是Linux用户空间的第一个进程,Kernel启动后会调用/system/core/init/Init.cpp的main()方法.int main(int argc, char** argv) { ... init_parse_config_file("/init.rc"); //解析init.rc文件 //执行rc文件中触发器为 on early-init的语句
2017-03-14 20:31:59
255
原创 DiskLruCache源码分析
简介上篇文章介绍了LRUCache它的思想是把一部分常用的对象存在内存里,以便下次使用的时候快速提取。 但是内存容量也就三G两G的,早期的或者低端一点的也就几百M,能分给自己的APP用来缓存数据的空间实在不多。 但是别忘了,我们还有Disk这个后花园。磁盘缓存的速度虽然不然不及内存缓存,但是容量很大,是典型的用时间换空间思想。简单使用DiskLruCache mDiskLruCache = Di
2017-02-08 22:02:44
256
原创 LRUCache的实现原理
简介LRU(Least Recently Used)最近最少使用,最近有时间和空间最近的歧义,所以我更喜欢叫它近期最少使用算法。它的核心思想是,如果一个数据被访问过,我们有理由相信它在将来被访问的概率就越高。于是当LRU缓存达到设定的最大值时将缓存中近期最少使用的对象移除。LRUCache内部使用LinkedHashMap来存储key-value键值对,并将LinkedHashMap设置为访问顺序来
2017-02-06 14:57:30
2599
原创 WeakHashMap的Weak原理
WeakHashMap简介不同于HashMap的是,WeakHashMap的key是弱引用,当key是弱可达的时候,在GC时这条数据就被移除了。弱的key被移除之后,它就会被VM放到ReferenceQueue里,我们就可以通过Queue的poll方法把key拿出来,并找到key对应的Entry,然后把这个Entry从Map中移除掉,从而真正达到清除内存的目的。WeakHashMap的数据结构Wea
2017-02-03 09:38:11
543
原创 JAVA中的四种Reference
简介在JAVA中我们平时使用的引用方式叫做强引用。其实在JAVA.Lang.ref包下还定义了SoftReference、WeakReference和PhantomReference三种引用。这几种引用依次减弱这个“弱”指的是,当GC来的时候,它更容易被回收。可达性定义为了正确的理解和使用这三种引用,理解他们的可达性非常重要。强可达:从根节点,至少有一个强引用路径可达。并且没有其他三种引用。 软可
2017-02-02 20:54:37
404
原创 常见GC算法
在C/C++中是由程序员自己去申请、管理和释放内存的,因此没有GC的概念。而在Java中,专门有一个用于垃圾回收的后台线程来进行监控、扫描,自动将一些无用的内存进行释放。下面介绍几种常见的GC算法。引用计数法 Reference Counting给对象添加一个引用计数器,每过一个引用计数器值就+1,少一个引用就-1。当它的引用变为0时,该对象就不能再被使用。它的实现简单,但是不能解决互相循环引用的问
2017-02-01 19:26:11
7167
原创 LinkedHashMap是如何组织数据的
内部是基于双向循环链表,也就是数组+双向链表 如果有三个参数的构造器的第三个参数为true,那么其内部顺序就是访问顺序。 put和get都会影响这个顺序对链表进行最近最远算法的实现,其实是自相矛盾的。 因为链表的存在是为了解决冲突,HashMap为了保证存取的速度是不希望存在冲突的。 而LRU又依赖这个冲突。header放在哪个table里? 还是每个table里都有一个header? p
2016-12-29 20:42:58
343
原创 HashMap是如何组织数据的
HashMap简介HashMap存储数据采用了key-value形式,采用数组存储key的HashCode,来实现对数据的存储,这样每提供一个key就能知道它在数组中的位置,而不用像ArrayList一样去遍历。但是不同的key算出的HashCode在一个很小的概率上可能相同,即发生了Hash冲突。HashMap采用了链表法来解决这个冲突。所以HashMap的底层数据结构是数组加链表,链表是单链表。
2016-12-23 10:29:33
410
原创 LinkedList源码分析
LinkedList简介LinkedList是List接口的一种实现,底层数据结构基于双向链表。除了List接口,它还实现了Queue和Deque接口。可能是因为以上特点,在代码的注释中才出现了这样饶有意味的嘱托。This class is primarily useful if you need queue-like behavior. It may also be useful as a lis
2016-12-21 21:01:10
268
原创 ArrayList是如何组织数据的
ArrayList简介ArrayList是我们十分常用的一个类,它的底层是由数组实现。不同于基本数组的是,它的容量能自动增长。数据结构如上所述,ArrayList其实是对数组的包装,无论是add方法,亦或是remove,都是操作一个全局的数组。 这个全局数组定义如下Object[] array;JAVA中所有所有对象都继承自Object,所以array可以装下所有对象。初始化要把刚刚声明的arra
2016-12-19 21:25:18
624
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人