原創作品:http://write.blog.csdn.net/postedit/7956383
歡迎大家一起交流學習,知識在與分享。
希望結交一些志同道和之士
QQ: 474530676
一、 安卓系統的組成
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中有一款開源的軟件軟件,能夠爲觸摸屏驅動獲得的採樣提供諸如濾波、去抖、校準等功能,通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。