Android系统零碎知识整理

转自:http://hi.baidu.com/donghaozheng/home

Android Runtime

Android includes a set of core libraries that provides most of the functionality available in the core libraries of the Java programming language.

Every Android application runs in its own process, with its own instance of the Dalvik virtual machine. Dalvik has been written so that a device can run multiple VMs efficiently. The Dalvik VM executes files in the Dalvik Executable (.dex) format which is optimized for minimal memory footprint. The VM is register-based, and runs classes compiled by a Java language compiler that have been transformed into the .dex format by the included "dx" tool.

The Dalvik VM relies on the Linux kernel for underlying functionality such as threading and low-level memory management.


Eclipse工具集

Eclipse中window - show window - android 下有许多很好用的工具窗口:

Emulator control 可以向Emulator发起电话,发短信等。
LogCat可以查看设备输出的log,类似于串口的log。
Devices显示正在运行的进程,可以设置查看某个进程的线程,堆信息,停止进程,捕获图片、进行debug等。
File Explorer显示手机存储器上的文件列表,并提供从PC导入文件,导出文件到PC,删除手机上文件等功能。
Threads查看线程信息,需要在Devices窗口中设置查看哪个进程。
Heap 查看内存分配信息,需要在Devices窗口中设置查看哪个进程。


Android专有驱动

Android添加了许多驱动,他们一般不操作实际的硬件,只是辅助系统的运行。

主要的Android专有驱动如下:

Ashmem(Anonymous Shared Memory):匿名共享内存驱动,为Android系统提供了内存分配功能,实现类似malloc的功能。
Logger:轻量级的log驱动。logcat程序调用此驱动。logger有三个设备节点:/dev/log/main, /dev/log/events, /dev/log/radio
Binder:基于OpenBinder系统的驱动,为Android平台提供IPC支持。
Android Power Management(PM):电源管理模块。
Low Memory Killer:在缺少内存时,杀死进程。
Android PMEM:物理内存驱动。


Android源代码结构

源代码的工程分为3部分:

(1)核心工程:建立Android系统的基础。

包含以下目录:
bionic、bootable、build、dalvik、development、frameworks、hardware、kernel、prebuilt、system

(2)扩展工程:使用其他开源项目扩展的功能,在external文件夹中。

(3)包(package):提供Android的应用程序和服务,在package文件夹中。

包括应用程序(Applications)、内容提供器(ContentProviders)和输入法(inputmethods)三部分。Launcher是Andorid的主屏幕。

Android的源码目录如下:
    –repo –主要是同步管理所用到的一系列文件
    –bionic –Android编译过程所需要的一些库
    –bootable –负责启动和备份的一些文件
    –build –最主要的一些makefile和编译配置文件
    –dalvik –经过Google优化了的java虚拟机
    –development –开发用的一些文件夹,包括模拟器和工具等
    –external –Android工程中引入的外部功能库
    –frameworks –中间件部分
    –hardware –和硬件有关的一些支持文件,包括wifi,电信模块等
    –kernel –经过了优化和修改的linux内核
    –packages –所有的上层应用包
    –prebuild –Android编译工具所在目录
    –system –一些系统级文件


编译方法:

android系统根目录下有一个Makefile,直接执行make即可。make过程将递归找到各个目录中的Android.mk文件进行编译。

Android的kernel需要单独配置和编译,编译过程和通常的linux内核相同。

编译结果都在根目录下的out目录中。结果包含以下内容:(1)主机工具(2)目标机程序(3)目标机映像文件(4)目标机Linux内核(需要单独编译)

其中out/target/product目录是目标产品的目录,在默认情况下使用generic作为目标产品的名称。

单模块编译

mm命令用来在Android源码中编译单个模块
mm命令运行前在Android根目录下执行一下 . build/envsetup.sh
然后进入待编译的模块目录,执行mm即可。
mm -B (强制重编)


文件系统

编译android源码之后,在out/target/product/generic一些文件:ramdisk.img、system.img、userdata.img、 system、 data、root

其中root、system、data三个目录分别是目标根文件系统、主文件系统和数据文件系统的目录。

ramdisk.img 根文件系统映像
system.img 主文件系统映像
userdata.img数据映像


其中,system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。
系统启动时先挂载ramdisk.img,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。

根文件系统:系统启动时第一个mount的文件系统,其下可能会继续挂载其他的文件系统。
/out/target/product/generic/root包括以下目录: data、dev、proc、sbin、sys、system、init/init.rc等。

主文件系统
/out/target/product/generic/system包括以下目录:app、bin、etc、fonts、framework、lib、usr、xbin

=> ramdisk.img is gziped archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.

=> system.img is a partition image that will be mounted as /system and thus contains all system binaries.

=> userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data

obj 是中间目标文件目录,其下面的APPS是java应用程序包的目录,EXECUTABLES 是可执行程序的目录,SHARED_LIBRARIES STATIC_LIBRARIEs分别是动态库和静态库的目录。

编译出来的应用程序就是放在system/app下的;用户安装的程序则是放在data/app下。


Android系统进程

Android几个重要的系统进程为/init、/system/bin/servicemanager、/system/bin/mediaserver、zygote及system_server。
init通过解析init.rc,启动对应的服务程序。servicemanager、zygote、mediaserver就是通过这种方式启动;
出来system_server则通过zygote孵化。这几个进程是Android系统运行的基础。

(1)servicemanager是Binder的服务管理守护进程,也是Binder机制的核心,所有Binder服务都会通过它进行注册,客户端再通过它获取服务接口。

(2)zygote是Android java部分的孵化器,也就是Android java框架的基础。zygote首先孵化出system_server,这是Android绝大多数系统服务的守护进程。之后system_server与zygote一起完成其他所有Android的应用程序进程的启动。

(3)mediaserver是多媒体服务的守护进程,负责多媒体、照相机、音频三项服务。


多媒体服务进程 MediaServer

多媒体服务的守护进程路径是frameworks/base/media/mediaserver,只有一个源文件main_mediaserver.cpp将被编译成一个可执行程序mediaserver,负责多媒体、照相机、音频三项服务。

在Android的init.rc中具有如下定义:
service media /system/bin/mediaserver
user media
group system aduio camera graphics inet net_bt net_bt_admin

由于没有定义oneshot,因此这个进程将一直存在,一旦这个进程被杀死,init进程会将其重新启动。


Modem与RIL

实现电话功能的主要硬件是通信模块(modem),modem通过与通信网络进行沟通,传输语音及数据,完成呼叫、短信等相关电话功能。

modem硬件上一般提供两个通道:一个用于AT命令,另一个用于数据传输。也有的并不区分,只提供了一个通道,这就需要实现MUX(多路复用)协议,
在软件层将其分离开,以供AT和数据连接分别使用。

复杂的AT相关处理一般不放在Modem驱动层,而是通过其上的RIL层完成。RIL负责AT命令的发送及响应解析,这是电话服务的实现基础,另外,RIL还负责数据的可靠传输。


权限相关

apk应用是有权限上线的,也就是说有一些权限apk应用无论如何也获取不到,即使该apk属于root账号。
另外,android中权限是可传递的,也就是说子进程的权限不会超过父进程的权限。
也就是说,虽然某个单独的linux程序有权限对某个文件进行操作,但如果这个程序的调用者权限不足,
也还是不行的。

另外,system/app下的应用程序的权限高于adb install安装的应用程序。
有些权限,只有系统程序才能获取,并不是说只要声明了就可以获取的。
比如:WRITE_SECURE_SETTINGS,Only system software can modify these settings.

adb install安装的apk程序是安装到了/data/app目录下,adb并没有一个有效的卸载的命令(adb uninstall貌似无效),如果要卸载的话可手动到/data/app目录下删掉(rm)对应的应用。

你可能感兴趣的:(android)