Android
This presentation is the property of its rightful owner.
Sponsored Links
1 / 23

Android 嵌入式系统软件开发 PowerPoint PPT Presentation


  • 150 Views
  • Uploaded on
  • Presentation posted in: General

Android 嵌入式系统软件开发. Android Embedded System Software Development 周 庆 国 ( [email protected] ) 兰 州 大 学. 6.2. 6.3. 6.1. 第六章 BootChart 、 Dalvik 及 Bootloader. BootChart. Dalvik. Bootloader. 6.1 Bootchart.

Download Presentation

Android 嵌入式系统软件开发

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Android

Android嵌入式系统软件开发

Android Embedded System Software Development

周 庆 国

[email protected]

兰 州 大 学


Android

6.2

6.3

6.1

第六章BootChart、Dalvik及Bootloader

BootChart

Dalvik

Bootloader


6 1 bootchart

6.1 Bootchart

bootchart本是一个开源工具,用可视化的方式对GUN/LINUX的开机启动过程进行性能分析,包括资源的使用,如CPU,磁盘等,各进程的执行时间等信息。

Ubuntu系统上执行的命令

sudo aptitude install bootchart

编译支持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:

3


Bootchart

Bootchart

(a)设置INIT_BOOTCHART标志为真,重新编译整个Android平台

export INIT_BOOTCHART=true

make -j4

(b)设置INIT_BOOTCHART标志为真,重新编译init模块

touch system/core/init/init.c

m INIT_BOOTCHART=true

4


Bootchart1

Bootchart

安装新的INIT到系统镜像中

emulator -avd @AVDName -ramdisk out/target/product/generic/ramdisk.img

在系统启动的时候触发Bootchart功能

adb shell# echo 60 > /data/bootchart-start

从系统中获取收集到的数据

adb shell# ls data/bootchart

header

kernel_pacct

proc_diskstats.log

proc_ps.log

proc_stat.log

5


Bootchart2

Bootchart

根据收集到的数据生成图表

bootchart bootchart.tgz

lsbootchart.png bootchart.tgz

Bootchart将生成PNG格式的图片。当然,可以指定为其他格式的图片。如果有打印用途,则可以指定为EPS格式的;如果有放大、查看细节等需求,则可以指定为SVG格式的。

6


Bootchart3

Bootchart

返回首页

Bootchart中使用到下列一些/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文件中

7


6 2 dalvik

6.2 Dalvik

Dalvik是基于寄存器,而JVM 却是基于栈的,Dalvik移植技术可以将 Java .class 转换成 .dex 格式

一个dex档通常会有多个.class。由于dex有时必须进行最佳化,会使档案大小增加1-4倍,以ODEX结尾

DVM的运行库绝大部分都是用portable C编写的

8


Jni call bridge

JNI Call Bridge

作用是把一系列的整型值转变成各种类型的函数参数,并且调用函数。这个调用过程必须符合C函数调用的约定。

为了简化移植,JNI Call Bridge在新平台上通常会使用开源的FFI库,但是,Dalvik移植技术运行不够快,也没有对平台做专门优化,所以,移植JNI Call Bridge首先应该重新写一个FFI库。

JNI Call Bridge代码位于dalvik/vm/arch/*

9


Dalvik

Dalvik 编译

为了能够更方便的调试dalvik,我们需要编译一个在X86上运行的dalvik和相关工具。编译步骤如下:a. 首先进入到Android 源码根目录b. source build/envsetup.sh (不是网上有些文章写的只输入 build/envsetup.sh)c. lunch 2 在此之后可以看到TARGET_PRODUCT 为sim。TARGET_ARCH为x86d. make 或者 make dalvikvm 和 make dexdump (make 为编译所有程序,比较耗时,有时甚至某些模块编译不过,如为节省时间,可使用make dalvikvm直接编译dalvik, make dexdump直接编译dexdump)

10


Gdb dalvik

Gdb调试dalvik准备

在用gdb启动dalvik时,需要设置一些环境,比较繁琐,这里创建一个脚本来简化这些过程,脚本名为grund.sh,放于Android源码根目录。下面为脚本内容。#!/bin/shbase=`pwd`root=$base/out/debug/host/linux-x86/pr/sim/systemexport ANDROID_ROOT=$rootbootpath=$root/frameworkexport BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.police.jarexport ANDROID_DATA=/tmp/dalvik_testmkdir -p $ANDROID_DATA/dalvik-cacheexec gdb $root/bin/dalvikvm

11


Gdb dalvik1

Gdb 调试 dalvik

a. 准备一个简单的java 程序,如hello.java,编译后将hello.jar拷贝至Android 源码根目录。 (hello.java与makefile见附录)

b. 进入到Android 源码根目录

c. ./grund.sh (执行上述脚本,之后会看到gdb提示符)

d. 在gdb提示符后输入 “set args –cp hello.jar hello”

e. 这个时候就可以设置断点,单步跟踪了!如有对gdb不熟的同学,请google之。 main()函数为入口函数,先在main.c 212行设置断点(在gdb提示符后输入 “b 212”)

f. 在gdb提示符后输入”r”, OK,我们会看到dalvik被gdb启动执行,然后停于212行,执行JNI_CreateJavaVM函数前先看看gDvm的内容(输入p gDvm)。 然后执行JNI_CreateJavaVM函数(输入“n”),再看看gDvm的内容。对比执行前后的变化,可大概知道JNI_CreateJavaVM函数所做的事情。

12


Gdb dalvik2

Gdb 调试 dalvik

g. main.c 249 行代码用于加载hello.class,在249行设置断点。在此中断后,看下slashClass的内容(输入“p slashClass“),slashClass正是”hello”字符串。接下来单步进入执行之(输入”s”),然后查看下函数调用栈(输入”bt”)。可知现在正在执行的是jni.c 中的FindClass函数。通过此方法,可知函数指针指向的是何函数。

h. main.c 255行代码用于取得hello.java 中main函数编译后的字节码。类似于g步骤,可知此时执行的函数为jni.c中的GetStaticMethodID函数

i. main.c 273行代码执行main函数编译后的字节码,类似于g步骤,可知此时执行的函数为jni.c 中的2681行。此处为宏定义,不容易找到。但通过gdb调试,可以准确的定位。如此时继续运行程序,”hello world” 就会出现在我们的眼前!

13


Dexdump jar

dexdump查看jar文件

返回首页

Dexdump 可执行文件放于out目录下, 可使用”find out/ -name dexdump”命令来找到dexdump。“dexdump –f hello.jar” 命令可打印jar文件的头部信息。“dexdump –d hello.jar” 可打印所编译的字节码。

14


6 3 boot loader

6.3 Boot Loader

u-boot的编译及配置

U-Boot,全称为Universal Boot Loader,即通用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 = $5SOC = $6

15


Uboot

uboot的编译及配置

一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。例如:

#define   CONFIG_ARM920T        1

#define   CONFIG_DRIVER_CS8900 1

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

#define     CFG_FLASH_BASE      0x00000000

#define CFG_PROMPT         "=>"

16


Uboot1

uboot的编译及配置

其中mkimage是很常用的一个工具,Linux内核映像和ramdisk文件系统映像都可以转换成U-Boot的格式。

17


U boot

u-boot启动过程

18


U boot1

u-boot启动过程

19


Arm linux

ARM-Linux的启动要求

本质上讲,bootloader程序应提供(最小限度)如下几个方面:

1、设置和初始化RAM(强制性的)

2、初始化一个串口(可选的)

3、检测机器类型(可选的/强制性的)

4、设置内核启动需要的标记列表(强制性的)

5、调用内核镜像(强制性的)

20


Ld script

ld-script分析

ld,GNU连接工具,用于将各目标文件合并在一起,并重新安排他们的数据以及符号的引用,程序编译的最后一步。

ld scripts 即ld脚本。ld 脚本的主要目的是要描述怎样将输入文件的各段印象到输出文件中去。它控制输出文件在内存的布局情况。

21


Sections

SECTIONS命令

返回首页

SECTIONS

{

sections- command

sections- command

...

}

其中的sections-command 可作如下选择:

* 程序入口点设置命令ENTRY

* 符号赋值

* 输出段描述

* 覆盖描述(overlay description)

22


Android

谢谢

23

23

23

23


  • Login