Mstar理论及实践篇(8)

2020-04-03 12:16

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负责:


Mstar理论及实践篇(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[解析版]全国普通高等学校2017届高考数学二模试卷(文科)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: