Android Framework概述
这里顺便讲下android开发的类型,有3种: 1. 系统移植。系统移植就是将android移植到其他的硬件平台,需要掌握Linux内核层
和系统运行库层。
2. 系统开发。系统开发就是完善android系统本身,需要掌握系统运行库层和
framework层,一般是在本地编写C/C++代码,然后通过JNI向上层提供调用接口。 3. 应用开发。应用开发就是开发应用程序,即利用framework层提供的API实现应用
的开发。
Framework为应用开发提供API,如下框图:
Android常用的一些make命令
1.make -jXX
XX表示数字,这个命令将编译Android系统并生成镜像,XX表示可以使用到的CPU核数,这在配置好的电脑上特别有用,公司的16核ubuntu服务器执行make -j16只要不到20分钟,而双核PC上需要4个小时!
2.make snod
这条命令将重新生成镜像,消耗的时间很少,类似WinCE的makeimg过程,如果你修改了一些数据文件(如音乐、视频)等文件时比较有用。
3.make cts
这条命令将编译CTS套机,编译出的结果放在out目录对应版的data/app目录下面。CTS测试时有用
4.make installclean
这条命令清除out目录下对应板文件夹中的内容,也就是相当于make clean,通常如果改变了一些数据文件(如去掉),最好执行以下make installclean,否则残留在out目录下的还会被打包进去。
5.mm/mm -B
开发调试中最喜欢这条命令了,在修改了的目录下执行这条命令,就能智能地进行编译,输出的文件在通过adb推送到目标机,可以很方便地调试。
6.make sdk
这条命令可以生成可发布的SDK,目前还没试过,据说需要JDK1.5
7.make Setting
可以单独编译setting这个模块,目前还没试,猜想是不是可以单独编译Email、Music这些模块
8.make bootimage
用这条命令可以生成boot.img,这个镜像文件中包含Linux Kernel,Ram disk,生成的boot.img只能通过fastboot进行烧写,这在只修改了Linux内核的时候有用
Supernova概述
Supernova设计语言为C++,位于Android程序框架的系统运行库层。Supernova通过Android应用程序框架为App提供服务。Supernova提供TV方面的Service,比如底层的硬件的操作(Tuner,Backlight),以及一些TV常用的业务。这里可以思考一个问题:为什么选用C/C++作为Supernova的开发语言?C/C++跟硬件具有更好的交互性!java语言需要通过jvm解释执行,而C/C++编译后的直接是cpu指令集。系统运行java程序在同等条件下,差不多慢C++程序一倍。但如果java通过JNI调用.so文件内部函数就另当别论了。
Supernova启动流程
在Android Platform Flow里提到,系统的1号进程/init完成系统应用层的引导,加载init.rc和init.eagle.rc。在init.eagle.rc启动了Supernova的tv service,代码如下:
ics\\device\\mstar\\mstareagle\\init.eagle.rc
service结构如下:
service
首先启动了/system/bin/logwrapper service进程,然后通过/system/bin/logwrapper进程创建/lib/ld-linux.so.3子进程,代码如下:
Ics\\system\\core\\logwrapper\\logwrapper.c int main(int argc, char* argv[]) {
pid = fork(); if (pid < 0) {
fatal(\ } else if (pid == 0) {
child_ptty = open(child_devname, O_RDWR); if (child_ptty < 0) {
fatal(\ }
// redirect stdout and stderr close(parent_ptty); dup2(child_ptty, 1); dup2(child_ptty, 2); close(child_ptty);
child(argc - 1, &argv[1]);
} else {
// switch user and group to \ // this may fail if we are not root,
// but in that case switching user/group is unnecessary 在child()函数调用execvp()函数,execvp()函数会找到/lib/ld-linux.so.3文件并执行,然后把/lib/ld-linux.so.3 --library-path /applications/bin:/vendor/lib:/vendor/lib/utopia:/config /applications/bin/tvos参数传递给该欲执行的文件。
接着进入Supernova的main函数入口,在ics\\projects\\tvos\\main\\Main.cpp int main(int argc, char **argv)//Supernova主进程入口函数 {
//Linux下的进程资源限制描述,这里设置core dump file文件的最大值,core dump file是在一个程序崩溃时,在指定目录下生成一个core文件,主要是用来调试的。
struct rlimit limit; int resource;
resource = RLIMIT_CORE;
limit.rlim_cur = RLIM_INFINITY; limit.rlim_max = RLIM_INFINITY; setrlimit(resource, &limit);
……
//详见说明1
MSrv_Control::Build(); ……
//Initializaion of MUF System,详见说明2 MSystem::Initialize(argc, argv, false); MSystem::InitializeDFBLayer(); ……
//创建Service实例,并保存在m_pMSrvList[E_MSRV_MAX]数组 MSrv_Control::GetInstance()->Initialize(); ……
//创建ProcessState的实例,此实例负责操作Binder的一些动作 ProcessState::self();
//创建Android Service线程,并加入到线程池,Android Service是后台运行的线程,负责Service IPC通信的工作
int ret = pthread_create(&ASthread_id, &ASthr_attr, AndroidServiceInitThread, NULL);//1创建一个子线程,入口函数是AndroidServiceInitThread()
if (ret) {
printf(\ ASSERT(0); } //详见说明3 StartMsrv();
#if( AUTO_TEST == 1)
printf(\#endif
ret = pthread_join(ASthread_id, NULL);//1以阻塞方式等待Android Service线程结束
ProcessState::self()->startThreadPool(); //创建管理环境变量类的实例
IEnvManager* pEnvMan = IEnvManager::Instance(); if (pEnvMan) {
pEnvMan->SetEnv_Protect(\ pEnvMan->SaveEnv(); } …… }
说明1:
MSrv_Control::Build(); 主要是初始化硬件配置:
? 创建一个mapi_system类的实例,mapi_system负责: