您的位置:首页 > 移动开发 > Android开发

Android 智能手机企业项目

2012-09-07 20:20 495 查看
原创作品:http://write.blog.csdn.net/postedit/7956383

欢迎大家一起交流学习,知识在与分享。

希望结交一些志同道和之士

QQ: 474530676

longguopeng168@163.com

Android 智能手机企业项目

一、 安卓系统的组成

a. 应用层

b. 应用程序框架

c. 库和运行环境

d. 内核

e. 硬件

二、 移植的主要步骤

/*************************************************************************************/

1)安装sun JDK

开发环境:ubuntu 12.04 32位

a. 卸载系统中的open JDK,为了标准我们先把系统中的open JDK卸载掉,

把从网上下载的jdk-1_5_0_22-linux-i586.bin(47M)安装下就可以了.

b. 软件放在" /home/up6410/android/jdk-1_5_0_22-linux-i586.bin "目录下

// root@ubuntu-longguopeng:/home/up6410/android# ./jdk-1_5_0_22-linux-i586.bin

一直按回车,到底输入"yes" 安装好后,接下来就是要对这个配置文件进行配置。

配置的路径是/etc/profile.d/java.sh (这里要说明的一点是java.sh要临时创建),

里面配置的信息是:

// root@ubuntu-longguopeng:/# gedit /etc/profile.d/java.sh //ubuntu

// root@ubuntu-longguopeng:/# vim /etc/bashrc //rehl6

// root@ubuntu-longguopeng:/# sudo gedit ~/.bashrc

/*---------------------------------------------------------

//添加如下内容:

export JAVA_HOME=/home/up6410/android/jdk1.5.0_22

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

----------------------------------------------------------*/

c. 如何检测是否安装好jdk 在命令行输入:java –version

// root@ubuntu-longguopeng:/home/up6410/android# source ~/.bashrc

// root@ubuntu-longguopeng:/home/up6410/android# java -version

/*--------------------------------------------------------------------

//显示如下:

java version "1.5.0_22"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)

Java HotSpot(TM) Server VM (build 1.5.0_22-b03, mixed mode)

注意:

root@longguopeng:~/桌面# java -version

root@longguopeng:~/桌面# java –version // –号错了

Exception in thread "main" java.lang.NoClassDefFoundError: –version

---------------------------------------------------------------------*/

若看到这个则说明成功。

d. 查看环境变量修改成功与否

在命令行中输入:

// root@ubuntu-longguopeng:/home/up6410/android# echo $JAVA_HMOE

// root@ubuntu-longguopeng:/home/up6410/android# echo $CLASSPATH

2) 编译android 2.2 froyo

文件存放在:/home/up6410/android/android-2.2_froyo

a. 对其进行解压:

// root@ubuntu-longguopeng:/home/up6410/android# tar –xvf android-2.2_froyo.tar.gz

//这是把这个解压到当前目录

b. cd 进入到这个目录中去:

// root@ubuntu-longguopeng:/home/up6410/android# cd android-2.2_froyo

c. 安装各种包

//   root@ubuntu-longguopeng:/home/up6410/android# sudo aptitude install \

// git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev \

// build-essential zip curl libncurses5-dev zlib1g-dev

d. 编译

// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# source build/envsetup.sh

// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# lunch

// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# make -j2

//双核双线程编译

首次编译非常耗时,取决于机器配置,大约需要2-3小时。

有可能会出现:“Permission denied (权限拒绝的提示)”

请命令赋予权限:$cd 无权限文件的当前目录 回车; $sudo chmod -R +rwx * 回车

完成后镜像生成在/root/mydroid/out/target/product/generic下:android源码编译后得到

system.img,ramdisk.img,userdata.img映 像文件。

-->ramdisk.img是emulator的文件系统,

-->system.img包括了主要的包、库等文件,

-->userdata.img包括了一些用户数 据,emulator加载这3个映像文件后,

会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。

主要一点是要把上步的那个JDK装好后遇到的问题就比较的少,我在编译个过程中遇到的问题也就是一些命令

提醒说没有安装而已,我用apt-get install xxx安装下就可以了。

编译完后再会告诉你编译的东西出来东西在哪,而且也不会报错,也不会报警告。

/*******************************************************************************************************/

// 第六章 编译完成,模拟器运行Android

1)编译完成后,模拟器的实现与运行

a.模拟器的实现

把类文件系统目录下out/target/product/generic/system复制到out/target/product/generic/root下面去

// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo#

// cp -rf out/target/product/generic/root/* /home/up6410/nfsroot

// cp -rf out/target/product/generic/data /home/up6410/nfsroot

// cp -rf out/target/product/generic/system /home/up6410/nfsroot

设置环境变量

在 /etc/profile.d/java.sh最后加入那么一句

// root@ubuntu-longguopeng:/# vim /etc/profile.d/java.sh

/*-------------------------------------------------------------------------------------

//添加如下内容:

export JAVA_HOME=/home/up6410/android/jdk-1_5_0_22-i586.bin

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export PATH=$PATH:/home/up6410/android/android-2.2_froyo/out/host/linux-x86/bin //这里

--------------------------------------------------------------------------------------*/

b.模拟器运行

命令行中输入:emulator –shell

// root@ubuntu-longguopeng:/# emulator -skin 800x600



// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo/out/target/product/generic# which emulator

ANDROID_PRODUCT_OUT='pwd'/out/target/product/generic emulator

4)实现编译器的静态链接

先下载一个软件:arm-none-linux-gcc的软件,先对它进行解压后进入/bin目录下就有这条命令(arm-none-linux-gnueabi-gcc),arm-none-linux-gnueabi-gcc –static test.c –o test,

Cp test out/target/product/generic/system/bin

Mkyaffs2image system system.img

Emulator –shell

#test 这就会出现刚才你新建的命令中写的东西

5)实现android自带的编译器

cd <android home>

. build/envsetup.sh //点后面记得要有空格

mmm <你想编译的目录>

在做上几步之前要先做这步:

首先要先创建Android.mk文件,里面填写内容如下:

LOCAL_PATH := $(call my-dir)

include $(BUILD_JAVA_SHARED_LIBRARY)

LOCAL_SRC_FILE := test.c

LOCAL_MODULE := test

LOCAL_SHARED_LIBRAYR := libc

include $(BUILD_EXECTALE)

//=========================================================================================

// 第十四章 烧写Bootloader开发板

编译定制 u-boot:

第一步:

// [root@longguopeng:/#] tar -vxf /home/up6410/src/u-boot-1.1.6.tar.bz2

// [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6

第二步:

进到u-boot-1.1.6 定制u-boot 文件

1. 删除不需要的文件

留下:

arm-config.mk

config.mk

Makefile

MAKEALL

mkconfig

mknand //没有

mkmovi //没有

write-sd //没有

tags //没有

README

rules.mk

System.map

u-boot

u-boot.map

u-boot.bin

u-boot.dis

u-boot.sre.c

board //进到samsung,留下smdk6410,其他的全部删除

common

cpu

disk

drivers

dtt

examples

fs

include

lib-arm

lib-generic

nand-spl

net

post

rtc

tools

2. 删除完毕,改u-boot-1.1.6_smdk6410 下的Makefile

// [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6/

// [root@ubuntu-longguopeng:/home/up6410/src/u-boot-1.1.6#] vim Makefile

---------------------------------------------------------------------------

将193行改为

193: ARCH := arm

CROSS_COMPILE := arm-linux-

(记得最后面不要加空格!)

-----------------------------------------------------------------------------

// [root@longguopeng:/home/up6410/src/u-boot-1.1.6#] gedit include/configs/up6410_sd.h

3. 增加run 命令:

171: CFG_CMD_RUN| \ 调到 165: CFG_CMD_RUN| \

ubuntu@longguopeng # set wnf .......

4. 可以修改环境变量:

---------------------------------------------------------------------------------------------

182: #define CONFIG_BOOTARGS"root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot ip=10.1.0.168:10.1.0.167:10.1.0.255:255.255.255.0:www.longguopeng.com:eth0:off
console=ttySAC0,115200 mem=128M"

183: #define CONFIG_ETHADDR 00:16:41:AA:90:48 //max地址

#define CONFIG_NETMASK 255.255.255.0

#define CONFIG_IPADDR 10.1.0.167//开发板

#define CONFIG_SERVERIP10.1.0.168 //pc机

#define CONFIG_GATEWAYIP10.1.0.255 //网关

203:PTF-PROMPT "ubuntu@longguopeng #" 改工作环境的显示的名称

---------------------------------------------------------------------------------------------

// SD启动

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_sd_config

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp u-boot.bin /home/up6410/tftpboot/

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cd /home/up6410/tftpboot/

[root@longguopeng:/home/up6410/tftpboot/#] cp u-boot.bin u-boot-sd.bin



// NVND启动

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_nand_config

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make

[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp u-boot.bin /home/up6410/tftpboot/

[root@longguopeng:/#] cd /home/up6410/tftpboot/

[root@longguopeng:/home/up6410/tftpboot#] cp u-boot.bin u-boot-nand.bin cd

写u-boot到nand flash:

uboot下操作:

ubuntu@longguopeng # nand erase 0 0x40000

ubuntu@longguopeng # tftp 0x50000000 u-boot-nand.bin

ubuntu@longguopeng # nand write 0x50000000 0 0x40000

//=====================================================================================================

第十五章 构建Android系统到S3C6410开发板

编译内核

修改makefile

191 ARCH ?= arm //平台

CROSS_COMPILE ?= ...eabi- //交叉编译器的前缀

//android-kernel-2.6.35.tar

[root@longguopeng android-kernel-2.6.35]# rm up6410_config* //删除

[root@longguopeng android-kernel-2.6.35]# cp .config android_config

[root@longguopeng android-kernel-2.6.35]# make

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

bootm 50008000

构建NFS 修改方便

[root@longguopeng android-kernel-2.6.35]# vim /etc/export

--------------------------------------------------------

//写入:

/home/up6410/nfsroot *(rw,no_root_squash)

---------------------------------------------------------

生成根文件系统

//android-2.2_froyo.tar

在这个文件里 /home/android/android-2.2_froyo

[root@longguopeng /]# mkdir /home/android/nfsroot

[root@longguopeng/]# cd /home/android-2.2_froyo/out/target/product/generic/

拷贝文件

[root@longguopeng generic]# cp -rf root/* /home/android/nfsroot

[root@longguopeng generic]# cp -rf system /home/android/nfsroot

[root@longguopeng generic]# cp -rf data /home/android/nfsroot

下载内核

将编译好的内核拷贝到tftpboot

[root@longguopeng android-kernel-2.6.35]# cp arch/arm/boot/zImage /tftpboot

启动uboot (在uboot下)

longguopeng @ # bootm

出现企俄说明内核没有问题

filesystem could mount //没有文件系统 死机强行启动

内核启动出现的问题

======================================================================

Freeing init memory: 164k

kernel panic - not syncing: no init fount.....

// 同步

// 默认启动在 [root@longguopeng nfsroot]# /sbin/init

// /etc/inittab 其他的

/init.rc 安卓的

======================================================================

在uboot下设置

setenv bootargs console=ttySAC0 root=/dev/nfs root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot ip=10.1.0.167:10.1.0.168:10.1.0.1:255.255.255.0:www.longguopeng.com:eth0:off init=/init

//开发板不显示文字 ( 添加init进程)

重启ip

bootm 50008000

在 [root@longguopeng nfsroot]# rm -f int.rc

//android_patch.tar

[root@longguopeng nfsroot]# cp /home/android_patch/init.rc ./

比较区别

[root@longguopeng nfsroot]# vimdiff init.rc /home/android-2.2_froyo/out/target/product/generic/root/init.rc

重新启动内核 第一次启动比较久 ,要写数据

# test

#

#

#

/**************************************************************************************************/

第十六章 视频驱动触摸屏部分

// 在文件夹 android-2.2_froyo.tar

LCD 分辨率 480 272

原始坐标

-->公式

-->lcd 新的坐标

现在比较常用的是: tslib 它是一个库

-->在 android_patch/tslib_android/

vim Android.mk

配置

./configure

vim Android.mk

-------------------------------------------------------

去掉这行LOCAL_PRELINK_MODULE=false

/system/lib/ts/plugins/input.so

//打开应用程序动态库

dlopen("input.so")

顺序执行编译

LOCAL_PATH:= $(call my-dir) //只能编译一次

名字

TSLIB PLUGINDIR := /system/lib/ts/plugins

//存放路径

LOCAL_MODULE :=ts/plugins/input

编译多个使用

include $(CLEAR_VARS) //开始

.......

.......

.......

include $(BUILD_SHARED_LIBRARY) //结束

--------------------------------------------------------

[root@longguopeng android-2.2_froyo]# . build/envsetup.sh

[root@longguopeng android-2.2_froyo]# mmm /android/android_patch/tslib_android //编译

//拷贝文件系统

[root@longguopeng android-2.2_froyo]# cp -rf out/target/product/generic/system /home/up6410/android/nfsroot

启动minicom

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

// android触摸屏的校正

启动起来后点击下屏却没有反应,我这个开发板用的是tft电阻屏,虽然在内核中有触摸屏驱动,

但是没校正屏幕的驱动,依然无法使用,linux中有一款开源的软件软件,名字是tslib,能够为触摸

屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

步骤为:

首先先要从网上下载一个tslib的软件,对其进行解压。

tar –xvf xxx.tar.gz2(这是解压到当前文件夹)。

解压完之后进入到目录中:cd xxx/,

用编辑器vim打开里面的一个叫Android.mk文件,在他的第几行处加入这么一行,保存退出。

执行 ./configure,在回到<android home>目录中,把刚才解压出来的目录编译进android内核中去,执行命令:

. bulid/envsetup.sh

mmm <你所执行文件的目录>

先把/nfsroot中的system删除,在从文件系统中的system复制到删的位置。

先把<kernel home>/driver/input/touchscreen/s3c2410.c中的第几行注解掉

接着就把开发板和pc机连接起来,把android启动起来,启动后再android shell中输入ts_calibrate,

你会发现会报说没有ts.conf这个文件,接下来我们就来讲下怎样得到这个文件。

执行完后再接着做这个步骤:

cp tslib/etc/ts.conf /nfsroot/system/etc -rf

这个文件复制完后在执行ts_calibrate这条命令时就不会保错了,在开发板上会出现要你校屏的界面

你就用手或其他对屏进行校正,校正完后参数保存在 system/etc/pointercal下,在把这个参数复制到

<kernel home>/driver/input/touchscreen/s3c2410.c下,把

刚才注解掉的参数中这边新复制过来的替换掉。(这里要重新编译内核,这要记得不然是没效的)。

读取设备

目录 frameworks/base/libs/ui/EventHub.cpp

-----------------------------------------------------------------------

opend device

读取函数int EventHub::read_notify(int nfd)

------------------------------------------------------------------------

//JAVA代码

目录 frameworks/base/services/java/com/android/server/InputDevice.java

--------------------------------------------------------------

//self

783:final int pointtercal[]={

-11996, 12, 40642976, -6, -11296,31608176, 65536

}; // 从 /work/android/nfsroot/system/etc/pointercal 获取的

generateAbsMotion()

-------------------------------------------------

编译

[root@longguopeng android-2.2_froyo]# mmm frameworks/base/services/java/ //从这里开始编译

[root@longguopeng android-2.2_froyo]# cp out/target/product/generic/system/framework/services.jar /android/nfsroot/system/framework

启动内核

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

在内核里 矫正: 比较常用

drivers/input/touchscreen/s3c2410_ts.c

input_report_key(ts.input, BIN_TOUCH, 0)

input_report_abs(ts.input, ABS_PRESSURE, 0)

24课 android 烧写到nandflash

查看大小

du -sh

128M

磁盘镜像

只支持yaffs文件系统

编译 busybox --》终端命令不够用

在up6410里

在busybox里 make menuconfig

先将文件系统 nfsroot拷到/home/up6410/nfsroot

root@longguopeng:/home/up6410/# cp nfsroot android_nfsroot

root@longguopeng:/home/up6410/# mv android_nfsroot nfsroot/

进入nfs文件系统里运行:

# /busybox mount -t yaffs2 /dev/block/mtdblock3 /mnt/

# /busybox cp nfsroot/ mnt/ -rf

链接到bosybox

拷贝到

0

1

2

代表

地址代表什么

挂载

/busybox cp -rf

错误怎么会是??

重启一下

拔掉网线--

********************************************

19课

u-boot的启动过程

分两个阶段:

1.a.硬件初始化

b.为加载bootloader的第二阶段准备RAM空间。

要准备的东西有:汇编指令手册,uboot代码详细分析,书,makefile手册。

汇编指令:

mrs:这条指令的意思是用来读取psr(cpsr,spsr)中的数据读到Rn中。

str:把寄存器的值放到内存中

ldr:把内存中的值加载到寄存器中

reset:

mrs r0,cpsr //这段代码的意思是把cpu的模式改为管理员模式

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0 //把r0中的值读回cpsr中

第十五章 构建Android nfs文件系统到开发板

11)、内核的编译

Tar –xvf xxx.tar.gz2

Cd xxx

在makefile中改下编译工具的路径,然后就可以开始编译了。在命令行输入make –j4

编译完就可以了。编译完后把编译出来的zImage复制到/tftproot下就行了。现在还差个android系统,之前在前面我们已将把它编译完成了。

12)、android系统的构建

<android home>/out/target/product/generic/下的root、data、

System组成一个nfsroot文件夹,操作演示如下:

cp –rf <android >/out/target/product/generic/root/* /nfsroot/

cp –rf <android >/out/target/product/generic/system /nfsroot/

cp –rf < android >/out/target/product/generic/data/ /nfsroot/

/nfsroot/这个就是类似linux中的文件系统,这个就是安卓系统。

在电脑与开发板之间连线和设置开发板的环境,开发板的主要环境还是先装下minicom 这个软件和tftp、nfs服务等,装好这些之后就可以开始下载了。

13)、android 系统的下载

先在命令行中输入minicom –s,设置端口参数,这里就不在多说了。在这之前要把arm板与pc电脑相连接好,进入了u-boot界面后,就要开始设置一些环境参数了。开发板的IP,电脑的IP,gatewayip,bootargs等,如下所示:

setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=2.2.2.254:/nfsroot ip=2.2.2.20

setenv serviceip=2.2.2.254

setenv ip=2.2.2.20

下载过程:

tftp 50008000 zImage bootm 50008000

在u-boot界面下输入这两条命令后就行了,系统就能启动起来了,要记得在这个期间,串口线和网线不能段,应为我们只是把内核和文件系统放到arm板的内存中去运行的还没保存到硬盘(nandflash)中,所以在运行中数据在通信是不能断开的,而且断电后又要重新烧写。

14)、android触摸屏的校正

启动起来后点击下屏却没有反应,我这个开发板用的是tft电阻屏,虽然在内核中有触摸屏驱动,但是没校正屏幕的驱动,依然无法使用,linux中有一款开源的软件软件,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: