今天,开始学习Android底层的开发。(注:我是新手小白,纯粹学习笔记,大神们可以直接略过了)

第一部分 编译运行我的第一个Android system。

准备工作:

下载源码:包括u-boot源码,Linux-kernel源码,Android源码,

具体的版本对应关系,以及如何下载这些源码

可以参考这篇博客 http://blog.csdn.net/koozxcv/article/details/49932795

特别说明:我使用的开发板平台为fs210,使用其他平台的朋友请将fs210换成对应的平台即可。

开始编译:

第一步,编译u-boot

这里要说明一下,不同版本的的u-boot编译过程不相同,具体的编译方法,建议参考对应开发板的参考资料。

我使用的是三星公司s5pv210的开发板。

cd ~/src_210
tar  -xvf  uboot-fs210_V5.tar.bz2

a,设置交叉工具链--vim Makefile
150 CROSS_COMPILE = /opt/toolchain/toolchain-4.3.2-farsight/bin/arm-none-linux-gnueabi-
b,选择一个开发板
george@George-JI:~/src_210/uboot-fs210_V5$ make fs210_nand_config
Configuring for fs210_nand board...

c,编译
make -j2

生成u-boot.bin

第二步,编译内核

这里要说明一下,不同版本的的内核编译过程不相同,具体的编译方法,建议参考对应开发板的参考资料。

使用非开发板厂商提供的内核,编译过程中出问题概率很大,新手慎重。

先解压源码:

linux-3.0.8-FS210.tar.bz2

进入源码目录

a,设置交叉工具链 vim Makefile
195 ARCH            ?= arm
197 CROSS_COMPILE   ?= /opt/toolchain/toolchain-4.5.1-farsight/bin/arm-none-linux-gnueabi-

b,选择一个soc
cp config_for_FS210_Android_v1.0  .config

修改mac地址:(实际过程是类似于DM9000的网卡驱动的移植)
vim arch/arm/mach-s5pv210/mach-fs210.c

417 static struct dm9000_plat_data fs210_dm9000_platdata = {
418         .flags          = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
419         .dev_addr       = { 0x00, 0xa9, 0xb2, 0xcf, 0xdc, 0xe8 },//改成唯一的
420 };

c,make menuconfig

d,make uImage  -j2 //需要一个mkimage--uboot-fs210_V5/tools$ ls mkimage  ==》 /usr/bin

编译Linux内核实际大约需要30分钟到1个小时左右。

第三步 ,编译Android源码

首先都是解压源码,进入源码目录

注:

每次打开一个终端,进入Android源码目录都必须要执行一次这两个命令,后续的HAL,JNI等的编译都要在这个这个环境下运行。

大家如果觉得麻烦,可以自己写一个简单的shell脚本,自动执行这两个命令。(度娘有写脚本的方法,建议学一下,很实用的)

a,初始化编译环境--为编译提供的命令--lunch, m, mmm, croot,godir get_build_var...
//每次打开一个新的终端都要执行一次,或者 . build/envsetup.sh 
george@George-JI:~/src_210/android4.0-fs210_v2$ source build/envsetup.sh 
including device/farsight/fs210/vendorsetup.sh
including device/moto/stingray/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including sdk/bash_completion/adb.bash

b,选择一个产品--产品名为fs210
george@George-JI:~/src_210/android4.0-fs210_v2$ lunch full_fs210-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full_fs210
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
或者
george@George-JI:~/src_210/android4.0-fs210_v2$ lunch

You're building on Linux

Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_fs210-userdebug
5. full_fs210-eng
6. full_stingray-userdebug
7. full_wingray-userdebug

Which would you like? [full-eng] 5
或者:lunch 5

c,编译
george@George-JI:~/src_210/android4.0-fs210_v2$ make  
// 如果从头编译需要花很长--大概一个晚上

大概两个小时左右的时候,会有一个错误缺乏XXX库的支持之类的错误,只要百度就可以解决的,问题不大,

解决以后继续编译,回去睡一觉,早上应该就好了 。ps:我自己编译Android源码大概花了14个小时,大家参考一下。

第四步,制作根文件系统

Android底层开发也是使用挂载NFS的条件下进行的,所以必须要建立一个根文件系统,将文件传输到开发板上。

下面是关于Android的根文件系统的目录的作用简单的介绍:

android根文件系统目录结构:
data: //应用程序安装目录,已经存放内部文件数据目录
//  /data/data/包/files database...

dev            
proc
sys
sbin

init  //android祖先进程,类似于linuxrc
 //  set bootargs init=/init
init.rc  //启动脚本,类似于/etc/init.d/rcS
init.fs210.rc
init.fs210.usb.rc 
init.goldfish.rc

default.prop  // 属性文件--用于进程间通信
  
ueventd.rc // 用于自动创建设备节点,类似之前讲的mdev
ueventd.fs210.rc  
ueventd.goldfish.rc

system
|
app :内置的apk,开机的时候自动安装

bin
etc
lib
usr
xbin

build.prop // 属性文件--用于进程间通信   
fonts  //字体库
framework // framework层的java代码最终会编译成二进制文件  
//android系统的核心代码,在开机的时候会自动加载运行
media // 多媒体文件,开机的声音,动画
tts  //语言包--支持国际化  
vendor  //厂商提供的二进制文件,将不愿意开源的代码封装成so,bin文件

基本核心的制作根文件系统:

首先建立一个目录androidrootfs

关注out/target/product/fs210
cp -raf out/target/product/fs210/data/   androidrootfs/
cp -raf out/target/product/fs210/root/*  androidrootfs/                                              
cp -raf out/target/product/fs210/system  androidrootfs/

实际制作根文件系统的时候:

修改fs210_build.sh
33 #       make -j$CPU_JOB_NUM
80         chmod -R 777 rootfs_dir/system/vendor

然后执行:./fs210_build.sh
结果:
out/target/product/fs210/rootfs_dir

将生成的根文件系统拷贝到nfs的路径下面就可以了

到这里,就可以在开发板上面运行Android系统了;

运行android系统
u-boot.bin
uImage
rootfs_dir

tftp + nfs方式运行android系统:

1,uImage, u-boot.bin ==>  /tftpboot
cp -raf u-boot.bin  /tftpboot/
cp -raf arch/arm/boot/uImage  /tftpboot/

2,配置nfs:
george@George-JI:~/src_210/android4.0-fs210_v2$ cp -raf out/target/product/fs210/rootfs_dir/  /opt/

sudo vim /etc/exports
/opt/rootfs_dir           *(subtree_check,rw,no_root_squash,async)

重启nfs服务器:
sudo service nfs-kernel-server restart

3,在开发板中:
烧录uboot:
FS210 # tftp 0x40008000 u-boot.bin
FS210 # nand erase 0x0 0x100000
FS210 # nand write 0x40008000 0x0 0x100000

启动内核:
FS210 # set serverip 192.168.7.5
FS210 # set ipaddr 192.168.7.7
FS210 # set bootcmd tftp 0x40008000 uImage \; bootm 0x40008000
挂载rootfs:
FS210 # set bootargs console=ttySAC0,115200 init=/init root=/dev/nfs nfsroot=192.168.7.5:/opt/rootfs_dir ip=192.168.7.7

如果开发板没有配置有显示屏,或者还没移植显示屏驱动,可以用androidvncserver软件看到Android界面,用usb鼠标控制Android系统的方法来调试软件。

ps:不懂的多找度娘,度娘找不到就翻墙找谷哥,基本外国的网站上面这方面的知识还是很多的。(终于可以好好的学习英文了^_^,学好英文真的很重要,看不懂人家的网站会很尴尬的。)

Android底层开发学习笔记 第一天相关推荐

  1. Android 应用开发学习笔记(1 of 2,from hitwh)

    Android 应用开发 注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章开头提供了原版文章的 pdf 资源下载,推荐下载 pdf 后观看,或评论区 ...

  2. android NFC 开发学习笔记(1)

    由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程: 大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/d ...

  3. Android 应用开发学习笔记(2 of 2,from hitwh)

    Android 应用开发 注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章(1 of 2)开头提供了原版文章的 pdf 资源下载,推荐下载 pdf ...

  4. Android应用开发学习笔记之事件处理

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...

  5. Android底层开发学习开始上路

    1.Andriod系统架构与分层:uboot->Linux kernal---->Android OS 2.Android OS:hal层(c语言)---->framework(C+ ...

  6. Android游戏开发学习笔记(三):视频的播放

    一.在命令行下输入mksdcard 512M c:\sdcard.img命令,创建sdcard镜像文件. 二.单击Eclipse的菜单命令"Window/Preferences", ...

  7. android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)

    /**  * 画笔  *   * @author 岳振华  *   */ @SuppressWarnings("unused") public class PaintSruface ...

  8. Windows驱动开发学习笔记(一)—— 环境配置第一个驱动程序

    Windows驱动开发学习笔记(一)-- 环境配置&第一个驱动程序 环境配置 第一个驱动程序 环境配置 安装VS2010:https://pan.baidu.com/s/1uZWWxCtB60 ...

  9. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

最新文章

  1. 运行一段时间后,RestTemplate请求报400错误
  2. 如何使用Docker暴露多个端口?
  3. java 垂直走马灯多行,Android实现图文垂直跑马灯效果
  4. 摄像头图像分析目标物体大小位置_一文读懂图像定位及跟踪技术
  5. 【新无人机数据集】从行人重识别 到 无人机目标定位
  6. 【编程思想】什么是微服务
  7. 仿苹果涂鸦软件_有没有仿ios12备忘录便签软件?
  8. 大数据在人工智能机器人的实践应用
  9. SQL Server 2008 Express 及 SSMS Express 下载安装配置教程
  10. Java调用阿里云短信接口发送手机验证码
  11. jqwidgets splitter把页面水平分割
  12. centos mysql 1146_MySQL查询报错:ERROR 1146 (42S02): Table 'craw.sitePageConfig' doesn't exist
  13. java基础常见面试题
  14. SECOND: Sparsely Embedded Convolutional Detection
  15. 微信表情图像代表什么意思_微信里的表情每个头像代表什么意思
  16. 颜色相关直方图(color correlogram)
  17. 深度学习训练之optimizer优化器(BGD、SGD、MBGD、SGDM、NAG、AdaGrad、AdaDelta、Adam)的最全系统详解
  18. sql(mysql快捷键)
  19. 招银面经总结;面经转载,答案自写。
  20. 设计模式(9)[JS版]-JavaScript设计模式之如何实现桥接模式???

热门文章

  1. Tic-Tac-Toe可能棋局遍历的实现(python)
  2. MOSFET IGBT
  3. Element Upload 上传图片
  4. linux scp命令用法_Linux SCP命令用法示例
  5. IntelliJ IDEA 介绍
  6. miniconda3介绍、安装、使用教程
  7. 网络安全如何杜绝手机隐私泄密
  8. Linux学习10_linux进程查看连载之:PS命令及ps -ef | grep java的含义
  9. 【ubuntu】由于没有公钥,无法验证下列签名: NO_PUBKEY 15CF4D18AF4F7421
  10. Vue3项目代码规范