简介 RefBase是Android中所有对象的始祖,类似MFC中的CObject及Java中的Object对象.在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对象生命周期的机制.RefBase的子类在构造一个实际对象的同时,还会悄悄地构造一个影子对象. sp是strong pointer, wp是weak pointer, LightRefBase是轻量级的引用计数类,只有一个引用计数,为0就删除. RefBase,sp,wp中的引用计数 · RefBas…
首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似 这个类中存在一个私有成员: weakref_impl* const mRefs;(weakref_impl是weakref_type的子类) 这个mRefs是“影子对象”,是管理一个对象的引用计数的关键 RefBase的构造中mRefs(new weakref_impl(this)),new一个weakref_impl对象,weakref_impl的构造形参是RefBase的指针 同时会初…
简介 Binder是Android系统提供的一种IPC(进程间通信)机制.由于Android是基于Linux内核的,因此,除了Binder外,还存在其他的IPC机制,例如管道和socket等.Binder相对于其他IPC机制来说,就更加灵活和方便了.Android系统基本上可以看作是一个基于Binder通信的C/S架构.Binder就像网络一样,把系统各个部分连接在了一起,因此它是非常重要的. 什么是Binder Binder是android在内核中专门用于完成进程间通信而设置的一个虚拟设备(/…
简介 Zygote本身是一个Native的应用程序,和驱动.内核等均无关系.Zygote是由init进程根据init.rc文件中的配置项而创建的. zygote最初的名字叫“app_process”,这个名字是在Android.mk文件中被指定的,但app_process在运行过程中,通过Linux下的pctrl系统调用将自己的名字换成了“zygote”,所以我们通过ps命令看到的进程名是“zygote”. 通过JNI调用Java函数,注意调用的是com.android.internal.os.…
init是一个进程,确切地说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程,它的进程号是1.作为天字第一号的进程,init被赋予了很多极其重要的工作职责. · 挂载设备 · 解析两个配置文件,中一个是系统配置文件init.rc,另外一个是和硬件平台相关的配置文件,以HTC G7手机为例,这个配置文件名为init.bravo.rc. · 执行各个阶段的动作,创建Zygote的工作就是在其中的某个阶段完成…
简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityManagerSystemService(AmS). PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中. SS是由Zygote通过Zygote.forkSystemServer函数fork诞生出来的.与Zygote生死与共.SS…
官方文档: http://source.android.com/source/requirements.html  Requirements The Android build is routinely tested in-house on recent versions of Ubuntu LTS (14.04), but most distributions should have the required build tools available. Before you download…
简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityManagerSystemService(AmS). PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中. SS是由Zygote通过Zygote.forkSystemServer函数fork诞生出来的.与Zygote生死与共.SS…
简介 Windows平台上有一个叫注册表的东西.注册表可以存储一些类似key/value的键值对.一般而言,系统或某些应用程序会把自己的一些属性存储在注册表中,即使下次系统重启或应用程序重启,它还能够根据之前在注册表中设置的属性,进行相应的初始化工作. Android平台也提供了一个类型机制,可称之为属性服务(property service).应用程序可通过这个属性机制,查询或设置属性. 可以用adb shell登录到真机或模拟器上,然后用getprop命令查看当前系统中有哪些属性. init…
以模块角度 以Java,native,kernel角度…
用MediaPlayer说明sp的实现.sp是一个模板类,T是RefBase的子类.仅仅要继承于RefBase的类都能够使用sp. binder类也继承RefBase类,binder的实现离不开RefBase. 用例如以下代码说说我遇到的疑惑. 201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)  202 {                                                  …
经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下. 相关的代码: frameworks/base/include/utils/RefBase.h frameworks/base/libs/utils/RefBase.cpp sp和wp都是一个模板类,看一下sp类的定义: template <typename T> class sp { publ…
(1)在Android中,RefBase结合了sp和wp,实现了一套通过引用计数的方法来控制对象声明周期的方法. RefBase的定义在/frameworks/base/include/utils/RefBase.h,实现在/frameworks/base/libs/utils/RefBase.cpp.wp的定义在/frameworks/base/include/utils/RefBase.h,sp的定义在/frameworks/base/include/utils/StrongPointer.…
Android中通过引用计数来实现智能指针,并且实现有强指针与弱指针.由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理. 要达到所有对象都可用引用计数器实现智能指针管理的目标,可以定义一个公共类,提供引用计数的方法,所有对象都去继承这个公共类,这样就可以实现所有对象都可以用引用计数来管理的目标,在Android中,这个公共类就是RefBase,同时还有一个简单版本LightRefBase. RefBase作为公共基类提供了引用计数的方法,但是并不去维护引用计数的…
<深入理解Android内核设计思想> 基本信息 作者: 林学森 出版社:人民邮电出版社 ISBN:9787115348418 上架时间:2014-4-25 出版日期:2014 年5月 开本:16开 页码:687 版次:1-1 所属分类:计算机 > 软件与程序设计 > 移动开发 > Android 更多关于>>><深入理解Android内核设计思想> 编辑推荐 基于Android SDK最新版本 全面细致地剖析了进程/线程模型.内存管理.Bind…
Android的px.dp和sppx: 即像素,1px代表屏幕上一个物理的像素点:偶尔用到px的情况,是需要画1像素表格线或阴影线的时候. dp: 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素…
Android的px.dip.sp的区别 我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼. 在Android中支持的描述大小区域的类型有以下几种:   px(pixels)——像素:不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. dip(device independent pixels)——设备独立像素:这个和设备硬件有关,一般哦我们为了支持WCGA.HVGA和QVGA推荐使用这个,不依赖于像素.等同于dp.是一种与密度无关…
注意:涉及的代码为android内核代码而不是android源码. 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计, 截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有 率,终端设备的多样性亟需更多的移动…
Android内核sysfs中switch类使用实例 最终在这个周末,能够干点自己想要干的事了. 由我这个二流的内核驱动开发人员来解析一下sysfs中的switch类.先猜測一下来历,在普通的嵌入式Linux平台上.通常是各自为战,全然不须要遵循什么规则.在Android中Google定义了一些潜移默化的规范,你能够全然不遵守. 可是依照规则总归是好的. 先从直观的来看一下/sys/class/switch类中都有些什么吧. watermark/2/text/aHR0cDovL2Jsb2cuY3…
<深入理解Android内核设计思想>已陆续在全国各大书店上市,电子书店也在陆续上架中(不断添加): 1. China-Pub 2. 京东 3. s=books&ie=UTF8&qid=1399447860&sr=1-1" rel="nofollow">Amazon 4. 当当 5. 淘宝网 6. 比比看哪边购书廉价 书本文件夹和一些章节内容将陆续与各位亲爱的读者们分享.感谢大家一直以来的支持和鼓舞~~…
1.Android系统层面的底层是Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库.每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例.为了支持多个虚拟机在同一设备上高效运行,dalvik被改写过.Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)-该格式经过优化,以将内存好用降到最低. Android内核和Linux内核的差别主要体现在如下11个方面: 1.Android Binder Andr…
前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是arm汇编以及环境的搭建方面.本文对我最近的实践做一个分享,其实很简单. 内核调试环境搭建 搭建平台: ubuntu 16.04 这里使用 android 模拟器来进行内核调试.首先下载内核代码 git clone https://aosp.tuna.tsinghua.edu.cn/kernel/g…
首先,要分清楚,android的源代码和android的内核代码一般是分开的,要分别进行下载. 1.先下载android的源代码.(这里不包括android的内核代码)      下载最新的源代码,一般上官网下载.网址: http://source.android.com/source/downloading.html 注意:当遇到 1 error:Exited due to gc error 的错误时,执行 1 repo sync -j1:      每当下载停止的时候,可以用 repo sy…
1.下载Android内核 source.android.com/source->Downloading and Building Building Kernels 大概要花2个小时,其源码在培训软件里面的 Android模拟器使用的Linux-3.10版本内核源码 复制到Ubuntu,并解压之.进入该目录 这是Android源代码已经自带好的交叉工具链,只需要把它加入到path环境变量即可. sudo gedit /etc/profile source /etc/profile 测试: 2.编…
Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小.在有些情况下,用户界面可能会小到难以看清内容.由此我们采用与分辨率无关的度量单位来开发程序就能够解决这个问题.Android应用开发支持不同的度量单位. 2.度量单位含义 dip: device independent pixels(设备独立像素).…
本文转载自:http://ticktick.blog.51cto.com/823160/1653304 由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚repo是什么东西,它该怎么使用?作为<Android内核开发>系列文章的第二篇,我们首先谈谈对repo工具的理解和使用. 1. repo是什么? repo是一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库. 2. 为什么要用repo? 因…
Linux的启动过程 开机上电执行bootloader,将内核的前n条指令加载到系统内存中------>系统内核的初始化----------->启动应用程序. bootloader的位置装载在每个CPU要执行的第一条指令的内存地址处,该地址对于不同的CPU是相同的.所以称为引导程序.目的为装载真正的用户程序,而装载的目标位置和device可能不同,因此共同的需要知道: - 从哪里读取用户程序 - 用户程序的长度是多少 - 装载完用户程序后跳转多少,入口程序在哪儿 Android和Android…
Android内核(4.9)集成最新版MPTCP---成功…
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70500488 一.Android内核源码的选择 Android手机设备内核源码的调试需要外部硬件设备的支持,调试步骤比较麻烦.相对来说,Android模拟器内核源码的调试就比较简单了,这里以Android模拟器内核源码的调试为例.首先创建一个Android API 19(Android 4.4.x版本)的Android模拟器,然后运行该Android模拟器.在 ubuntu 14…
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54880488 前面的博客中已经记录了Nexus 5手机的Android 4.4.4 r1源码的编译基于 ubuntu 14.04.5,后面在该编译环境下来学习一下Android内核源码的编译基于Nexus 5手机. 一.Android内核源码的下载和编译 有关Android内核源码的下载信息可以参考谷歌官网的地址https://source.android.com/source/…