S3C6410板子构建安卓2.2
安卓android系统简介:
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
底层以Linux内核工作为基础,由C语言开发,只提供基本功能;
中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。
最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。
android系统结构:
1)应用程序层(apk)
Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是 用Java语言编写的,并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个 性化。
2)应用程序框架层(framwork)
应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提 供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。
a) Activity Manager(活动管理器)
管理各个应用程序生命周期以及通常的导航回退功能
b) Window Manager(窗口管理器)
管理所有的窗口程序
c) Content Provider(内容提供器)
使得不同应用程序之间存取或者分享数据
d) View System(视图系统)
构建应用程序的基本组件
e) Notification Manager(通告管理器)
使得应用程序可以在状态栏中显示自定义的提示信息
f) Package Manager(包管理器)
Android系统内的程序管理
g)Telephony Manager(电话管理器)
管理所有的移动设备功能
h)Resource Manager(资源管理器)
提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
i)Location Manager(位置管理器)
提供位置服务
j)XMPP Service(XMPP服务)
提供Google Talk服务
3)系统运行库层(NDK,so)
从图中可以看出,系统运行库层可以分成两部分,分别是系统库和Android运行时,分别介绍如下:
a)系统库
系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。其主要分为如下几个:
Ø Surface Manager:
执行多个应用程序时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。
Ø Media Framework:
多媒体库,基于PacketVideo OpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。
Ø SQLite:
小型的关系型数据库引擎
Ø OpenGL|ES:
根据OpenGL ES 1.0API标准实现的3D绘图函数库
Ø FreeType:
提供点阵字与向量字的描绘与显示
Ø WebKit:
一套网页浏览器的软件引擎
Ø SGL:
底层的2D图形渲染引擎
Ø SSL:
在Andorid上通信过程中实现握手
Ø Libc:
从BSD继承来的标准C系统函数库,专门为基于embedded linux的设备定制
b)Android运行时
Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。
Ø 核心库
核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等等。
Ø Dalvik虚拟机
Android程序不同于J2me程序,每个Android应用程序都有一个专有的进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一 个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化 以及支持多个虚拟机的特点。需要注意的是,不同于J2me,Android程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具dx将Java字节码转成dex格 式的中间码。
4)Linux内核层 (linux内核)
Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。
项目框架流程:
准备:
1.配置yum源,卸载open JDK ,设置环境变量:
vim /etc/yum.repos.d/Centos-Base-
[base]
name=CentOS-$releasever - Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#released updates
[updates]
name=CentOS-$releasever - Updates - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/contrib/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
yum clean all
yum install 测试
卸载open jdk
yum remove *openjdk*
yum remove gcc-java
安装jdk1.5 为了支持android上层
find ./* -name *jdk*
rpm -ivh ******jdk1.5.rpm
设置环境变量
vim /etc/profile
加入:
PATH=$PATH:/usr/local/arm/4.5.1/bin
export JAVA_HOME=/usr/java/jdk1.5.0_22
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASS_PATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_PATH}:$PATH
vim /etc/bashrc
加入:
export JAVA_HOME=/usr/java/jdk1.5.0_22
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASS_PATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_PATH}:$PATH
2.软件及安装包:
andorid,teacher_liu
1.安装gperf软件:
cd /android/android_patch/tools
tar xvf gperf-
./configure
make
make install
2.编译生成文件系统
cd android-2.2_froyo
make
3.修改内核中的编译器,生成zImage镜像
cd android-kernel-2.6.35
vim Makefile
192gg
ARCH ?= arm
CROSS_COMPILE ?= /home/hongzhunzhun/hong/android/android/android-2.2_froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
make
在编译的同时,来制作bootloader
一.烧写bootloader
1.设置sd卡启动,烧写sd卡:
(前提是需要找一张2G的SD卡,格式化,新建一个分区)
cd /teacher_liu/smdk6410_resource/tools
./write /dev/sdb ../image/u-boot-move.bin
看到指示灯闪烁了一下说明烧写成功,再烧就烧不进去说明正常
板子上设置为SD卡启动,开机。
2.安装好minicom,配置minicom
minicom -s
no no save as de..
3.安装设置好tftp,烧写 nand启动。
yum install *tftp/xinted*
vim vi /etc/xinetd.d/tftp
disable = no
重启 tftp
service xinted restart
cp /android/teacher_liu/smdk6410_resource/images/u-boot-nand.bin
/var/lib/tftpboot/
在minicom 中 tftp nand u-boot 到板子
tftp 52000000 u-boot-nand.bin
nand erase clean
nand write 52000000 0 30000
设置为nand启动
4.安装nfs构建文件系统:
yum install nfs
vim /etc/export
/work/android/nfsroot *(rw,no_root_squash)
service nfs restart
mount -t nfs 192.168.x.x:/work/android/nfsroot /mnt
umount /mnt
cd android/android-2.2_froyo/out/target/product/generic
cp root/* /work/android/nfsroot -rf
cp system/ /work/android/nfsroot/system -rf
cp data/ /work/android/nfsroot/data -rf
cp /android/android/android_patch/init.rc /android/android/android_patch
vim init.rc
27gg
注释
setenv bootargs console=ttySAC0 init=/init root=/dev/nfs nfsroot=192.168.1.10:/work/android/nfsroot ip=192.168.1.20
tftp 50008000 zImage
bootm 50008000
启动模拟器
ANDROID_PRODUCT_OUT=`pwd` emulator -shell
<library name="cow"
file="/system/framework/cow.jar"/>
三.写一个app程序来点亮LED灯.
1.直接写一个led裸板内核程序内核模块
/home/androidproject/android/src/8th_led/ko 先看这个目录下的文件
led.c先看,然后make 把led.ko放到/home/androidproject/android/tftproot/
然后启动板子,启动好后,insmod led.ko
ls /dev/s3c6410_led,就能看到设备。
2.写一个内核模块,写一个应用程序来执行来控制灯的开关
JNI
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互
调用其他语言的库
JAR
JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR
用来打成一个包,方便供java程序使用,
MMM Android.mk
安卓内部的makefile ,用于快速编译项目工程,使用方法是 设置环境之后 mmm 加含有Android.mk文件的目录。
然后看/home/androidproject/android/src/8th_led/exe目录下的test.c
然后再android-2.2_froyo目录下 mmm /home/androidproject/android/src/8th_led/exe
会在/home/androidproject/android/android-2.2_froyo/out/target/product/generic/system/bin 目录下生成test
把test移到/home/androidproject/android/nfsroot/system/bin/目录下
在板子这边命令行输./test /dev/led_misc on led就亮了
./test /dev/led_misc off led就灭了
3.用app程序来控制灯的亮和灭(8th,mmm在android目录下编译
mmm是android 下的一个makefile
上层apk点灯
流程 文件jar->apk->so
按到顺序mmm ,
把生到的system目录拷贝到tftproot 下,然后重启
在/home/androidproject/android/nfsroot/system/etc/permissions/platform.xml
里加一句
<library name="cow"
file="/system/framework/cow.jar"/>
开发板insmod led.ko
chmod 777 /dev/led_misc
给权限
安卓就能控制灯亮,灯灭