Android嵌入式系统软件开发_第1页
Android嵌入式系统软件开发_第2页
Android嵌入式系统软件开发_第3页
Android嵌入式系统软件开发_第4页
Android嵌入式系统软件开发_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android嵌入式系统软件开发AndroidEmbeddedSystemSoftwareDevelopment周庆国〔〕兰州大学126.26.3第六章BootChart、Dalvik及Bootloader6.1BootChartDalvikBootloader336.1Bootchartbootchart本是一个开源工具,用可视化的方式对GUN/LINUX的开机启动过程进行性能分析,包括资源的使用,如CPU,磁盘等,各进程的执行时间等信息。Ubuntu系统上执行的命令 sudoaptitudeinstallbootchart编译支持Bootchart的INIT初始化程序 (1)与其他嵌入式Linux系统一样,INIT是Androlid系统的第一个用户空间程序,它位于Android文件系统的根目录〔”/”〕中。INIT被Linux内核调用执行,完成一些初始化步骤和启动所有的其他用户空间程序的工作。 (2)在Android中,INIT读取并执行/init.rc和/init.<machine_name>.rc初始化脚本配置文件里的相关命令来完成相应的初始化工作。 (3)INIT可以编译成支持或不支持Bootchart数据收集的,当然默认是不支持该功能的。为了在Android中使用Bootchart数据收集功能,必须确保Bootchart支持已经编译进INIT程序中。 这里提供了两种方式来重新编译INIT:44Bootchart(a)设置INIT_BOOTCHART标志为真,重新编译整个Android平台 exportINIT_BOOTCHART=true make-j4(b)设置INIT_BOOTCHART标志为真,重新编译init模块 touchsystem/core/init/init.c mINIT_BOOTCHART=true55Bootchart安装新的INIT到系统镜像中 emulator-avd@AVDName-ramdiskout/target/product/generic/ramdisk.img在系统启动的时候触发Bootchart功能 adbshell#echo60>/data/bootchart-start从系统中获取收集到的数据 adbshell#lsdata/bootchart header kernel_pacct proc_diskstats.log proc_ps.log proc_stat.log66Bootchart根据收集到的数据生成图表 bootchartbootchart.tgz lsbootchart.pngbootchart.tgzBootchart将生成PNG格式的图片。当然,可以指定为其他格式的图片。如果有打印用途,那么可以指定为EPS格式的;如果有放大、查看细节等需求,那么可以指定为SVG格式的。77BootchartBootchart中使用到以下一些/proc文件: ①一次性使用的文件〔用来生成Bootchart图表头的信息〕有:/proc/version、/proc/cmdline、/proc/cpuinfo②周期性使用的文件有: /proc/uptime 该文件保存系统正常运行和空闲的时间,以10毫秒为单位 /proc/stat 保存到/data/bootchart/proc_stat.log文件中 /proc/diskstats保存到/data/bootchart/proc_diskstats.log文件中 /proc/[pid]/cmdline保存/data/bootchart/proc_ps.log文件中 /proc/[pid]/stat 保存到/data/bootchart/proc_ps.log文件中返回首页886.2DalvikDalvik是基于存放器,而JVM却是基于栈的,Dalvik移植技术可以将Java.class转换成.dex格式一个dex档通常会有多个.class。由于dex有时必须进行最正确化,会使档案大小增加1-4倍,以ODEX结尾DVM的运行库绝大局部都是用portableC编写的99JNICallBridge作用是把一系列的整型值转变成各种类型的函数参数,并且调用函数。这个调用过程必须符合C函数调用的约定。为了简化移植,JNICallBridge在新平台上通常会使用开源的FFI库,但是,Dalvik移植技术运行不够快,也没有对平台做专门优化,所以,移植JNICallBridge首先应该重新写一个FFI库。JNICallBridge代码位于dalvik/vm/arch/*1010Dalvik编译为了能够更方便的调试dalvik,我们需要编译一个在X86上运行的dalvik和相关工具。编译步骤如下:

a.首先进入到Android源码根目录

b.sourcebuild/envsetup.sh(不是网上有些文章写的只输入build/envsetup.sh)

c.lunch2在此之后可以看到TARGET_PRODUCT为sim。TARGET_ARCH为x86

d.make或者makedalvikvm和makedexdump(make为编译所有程序,比较耗时,有时甚至某些模块编译不过,如为节省时间,可使用makedalvikvm直接编译dalvik,makedexdump直接编译dexdump)

1111Gdb调试dalvik准备在用gdb启动dalvik时,需要设置一些环境,比较繁琐,这里创立一个脚本来简化这些过程,脚本名为grund.sh,放于Android源码根目录。下面为脚本内容。

#!/bin/sh

base=`pwd`

root=$base/out/debug/host/linux-x86/pr/sim/system

exportANDROID_ROOT=$root

bootpath=$root/framework

exportBOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.police.jar

exportANDROID_DATA=/tmp/dalvik_test

mkdir-p$ANDROID_DATA/dalvik-cache

execgdb$root/bin/dalvikvm1212Gdb调试dalvika.准备一个简单的java程序,如hello.java,编译后将hello.jar拷贝至Android源码根目录。〔hello.java与makefile见附录〕b.进入到Android源码根目录c../grund.sh〔执行上述脚本,之后会看到gdb提示符〕d.在gdb提示符后输入“setargs–cphello.jarhello”e.这个时候就可以设置断点,单步跟踪了!如有对gdb不熟的同学,请google之。main()函数为入口函数,先在main.c212行设置断点〔在gdb提示符后输入“b212”〕f.在gdb提示符后输入”r”,OK,我们会看到dalvik被gdb启动执行,然后停于212行,执行JNI_CreateJavaVM函数前先看看gDvm的内容〔输入pgDvm〕。然后执行JNI_CreateJavaVM函数〔输入“n”〕,再看看gDvm的内容。比照执行前后的变化,可大概知道JNI_CreateJavaVM函数所做的事情。1313Gdb调试dalvikg.main.c249行代码用于加载hello.class,在249行设置断点。在此中断后,看下slashClass的内容(输入“pslashClass“),slashClass正是”hello”字符串。接下来单步进入执行之(输入”s”),然后查看下函数调用栈(输入”bt”)。可知现在正在执行的是jni.c中的FindClass函数。通过此方法,可知函数指针指向的是何函数。h.main.c255行代码用于取得hello.java中main函数编译后的字节码。类似于g步骤,可知此时执行的函数为jni.c中的GetStaticMethodID函数i.main.c273行代码执行main函数编译后的字节码,类似于g步骤,可知此时执行的函数为jni.c中的2681行。此处为宏定义,不容易找到。但通过gdb调试,可以准确的定位。如此时继续运行程序,”helloworld”就会出现在我们的眼前!1414dexdump查看jar文件Dexdump可执行文件放于out目录下,可使用”findout/-namedexdump”命令来找到dexdump。

“dexdump–fhello.jar”命令可打印jar文件的头部信息。

“dexdump–dhello.jar”可打印所编译的字节码。返回首页15156.3BootLoaderu-boot的编译及配置U-Boot,全称为UniversalBootLoader,即通用Bootloader。通用有两层含义:可以引导多种操作系统、支持多种架构的CPU。针对使用的开发板board/<board_name>,执行:

1、make

<board_name>_config

2、make

all通过分析顶层Makefile和mkconfig两个文件,配置简述过程如下: make<board_name>_config相当于执行./mkconfig<board_name>$2$3$4$5$6 ARCH=$2

CPU=$3

BOARD=$4 VENDOR=$5 SOC=$61616uboot的编译及配置一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。例如: #define

CONFIG_ARM920T

1 #define

CONFIG_DRIVER_CS89001另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。例如: #define

CFG_FLASH_BASE

0x00000000 #defineCFG_PROMPT

"=>"文

称说

明文

称说

明System.mapU-Boot映像的符号表u-boot.binU-Boot映像原始的二进制格式u-bootU-Boot映像的ELF格式u-boot.srecU-Boot映像的S-Record格式1717uboot的编译及配置其中mkimage是很常用的一个工具,Linux内核映像和ramdisk文件系统映像都可以转换成U-Boot的格式。工

称说

明工

称说

明bmp_logo制作标记的位图结构体img2srec转换SREC格式映像envcrc校验u-boot内部嵌入的环境变量mkimage转换U-Boot格式映像gen_eth_addr生成以太网接口MAC地址updaterU-Boot自动更新升级工具1818u-boot启动过程1919u-boot启动过程2020ARM-Linux的启动要求本质上讲,bootloader程序应提供〔最小限度〕如下几个方面: 1、设置和初始化RAM(强制性的) 2、初始化一个串口(可选的) 3、检测机器类型(可选的/强制性的) 4、设置内核启动需要的标记列表(强制性的) 5、调用内核镜像(强制性的)2121ld-script分析ld,GNU连接工具,用于将各目标文件合并在一起,并重新安排他们的数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论