一、android的编译
1. 源码包 bsp包 --> 1. u-boot 2. zImage 3. android源码 (还有参考开发板)
2. 我们需要定制我们自己需要的功能,就只需要移植(camera、lcd屏、触摸屏等)
3. android源码中的文件类型JDK(c、c++、java、python脚本),安装各种工具。JDK、c、c++的编译工具autmake、python
4. 编译过程
a uboot编译之后得到u-boot.bin
1 @vim Makefile
CROSS_COMPILE = /opt/toolchain/toolchain-4.3.2-farsight/bin/arm-none-linux-gnueabi-
2 选择一个开发板:
@make distclean
@make fs210_nand_config
3 编译:
@make -j2
b 内核编译之后得到zImage/uImage (可能执行方式不一样)
1 @vim Makefile
ARCH ?= arm
CROSS_COMPILE ?= /opt/toolchain/toolchain-4.5.1-farsight/bin/arm-none-linux-gnueabi-
2 选择一个平台
@cp config_for_FS210_Android_v1.0 .config (config_for_FS210_Android_v1.0就是一个 .config)
3 @make menuconfig //建议
4 @make uImage -j2
c android源码编译编译之后得到rootfs(@help)
1 初始化环境
@source ./build/envsetup.sh (执行该脚本的意思)
2 选择一个产品
@lunch full_fs210-eng
//full :完整编译android自带的app, 输入法, 语言等
//fs210: 表示一个产品
//eng(另外user/userdebug): 该系统给工程师开发---调试,需要权限,调试工具
3 编译
@make -j2
5. 制作根文件系统:out/target/product/fs210/
a 复制需要的文件
@cp -raf out/target/product/fs210/root/* rootfs/ */
@cp -raf out/target/product/fs210/data/ rootfs/
@cp -raf out/target/product/fs210/system rootfs/
b 真正制作根文件系统:
@vi fs210_build.sh //修改为以下内容
80 chmod -R 777 rootfs_dir/system/vendor
@./fs210_build.sh
//在out/target/product/fs210/rootfs_dir <-- 最终用到根文件系统
c 根文件系统目录:
data :用户的数据,系统的配置文件
sbin
dev
proc
sys
init // 第一个init进程: set bootargs init= /init
init.rc // 启动脚本:相当/etc/inittab和/etc/init.d/rcS (祖先进程需要fork哪些进程是由它决定)
init.fs210.usb.rc
init.fs210.rc
init.goldfish.rc
ueventd.fs210.rc
ueventd.rc //用于自动创建设备节点 /sys/class/xxx/.../uevent (mdev -s)
ueventd.goldfish.rc
default.prop //属性文件 property
system
|
app: 自带的应用apk,在开机的时候会自动的安装
bin
xbin
etc
lib
usr
build.prop //属性文件 property
fonts : 字体库
framework : framework层的运行代码, java代码的二进制文件,开机执行
media :开机时候启动声音,动画
tts :语言字体标准包
vendor :产生提供的二进制代码
说明:所有编译出来的文件都在 android4.0-xxx/out/target 目录
6 运行android系统: (@ 表示ubuntu命令,#表示开发命令)
a. 复制需要的文件
@cp u-boot.bin /tftpboot
@cp arch/arm/boot/uImage /tftpboot
@cp -raf out/target/product/fs210/rootfs_dir /opt
b. u-boot烧录
#tftp 0x40008000 u-boot.bin
#nand erase 0x0 0x100000
#nand write 0x40008000 0x0 0x100000
c. tftp下载内核
#set serverip 192.168.1.3
#set ipaddr 192.168.1.10
#set bootcmd tftp 0x40008000 uImage \; bootm 0x40008000
d. 通过nfs挂载:
@sudo vim /etc/exports //添加如下内容
/opt/rootfs_dir *(subtree_check,rw,no_root_squash,async)
@sudo service nfs-kernel-server restart
e. 配置板子环境变量
#set bootargs console=ttySAC0,115200 init=/init root=/dev/nfs nfsroot=192.168.7.5:/opt/rootfs_dir ip=192.168.7.7
7. 如果没有lcd屏,使它显示在PC上:
a 目录 E:\1 学习资料\嵌入式2016\12_安卓底层移植\android底层系统开发\各种问题的解决方式\vnc_ok-解决没有lcd屏
拷贝androidvncserver --> /opt/rootfs_dir
#./拷贝androidvncserver
b PC上启动VNC-Viewer-5.0.3-Windows-32bit.exe
VNC Server:192.168.7.7:5901(板子ip+执行androidvncserver的端口号)
8. 脚本:
a `ls`都表示一个命令,
b ‘ls’都表示字符串,
c "who@VALUE" 表示字符串和变量值
d @AA 引用变量AA的值
e x = 1,c = $x 引用x的值,c=1;
f c = $(pwm) c 表示当前路径,pwm表示命令
g $? 上一条命令的返回值
h if[! -r 1] -r表示可读,-w可写,-x可执行,-d是一个目录,-f是一个文件
======================================================================================
二、android 应用开发 --c语言 (android所有的c代码都要封装为动态库.so)
注:目录说明:
a 系统自带 ==>编译到根文件的/system/目录
应用层:
apk: ~/android-4.0/packages/apps ==>eclipse + JDK + ADT
b 根文件系统(room)
framework层:
framework(JAVA): ~/android-4.0/frameworks/ ==> actinty
虚拟机层:
虚拟机DVM : ~/android-4.0/dalvik ==>是一个可执行程序(C++)
c库层:
c库: ~/android-4.0/bionic/ ==>标准库,线程库等(glibc->linux)
外部库的移植: ~/android-4.0/external/ ==>webkit、数据库(sqlite)
c 内核层:
d test.c文件编译为可执行程序是为了调试用,最后会封装到HAL层
1. 编写代码
a 必须在android源码中编写--src_210/android4.0-fs210_v2
b @vi hello.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv)
{
int fd = open("/dev/input/event0", O_RDWR);
if(fd < 0)
{
perror("open");
exit(1);
}
printf("hello android world\n");
return 0;
}
2. 编译代码
a 交叉工具链: ~/android-4.0/prebult/linux-x86/toolchain/arm-linux-androiddeabi-4.4.x
b Android.mk(Makefile): 将c代码编译为可执行代码
1 技巧:抄模板 hardware/ril/rild/Android.mk
2 编译规则
目标:依赖
编译方法
3 实现
#1获取当前路径
LOCAL_PATH:= $(call my-dir)
#2清空以LOCAL_XX的变量,除了LOCAL_PATH
include $(CLEAR_VARS)
#3在任何情况都会编译
LOCAL_MODULE_TAGS := optional
#4依赖--指定源码
LOCAL_SRC_FILES:= \
hello.c
#5目标--指定目标文件名
LOCAL_MODULE:= hello
#6编译规则---编译成可执行程序
include $(BUILD_EXECUTABLE)
c @mmm mytest/c_test/ 编译该文件内的rild.c文件
3. 运行代码
cp -raf out/target/product/fs210/system/bin/hello_elf_arm /opt/rootfs_dir
root@android:/ # ./hello_elf_arm
hello android world
4. 调试代码 ---logcat
a. 创建文件并给定默认权限脚本文件
uevent.rc
uevent.xxx.rc
b. 加载驱动文件
init.rc
c. android.mk
将 c/c++ 文件编译为 *.elf *.so *.a
将 java 文件编译为 apk class *.jar
d. 调试信息
a java 代码
final string TAG="huazai"
log.d(TAG,"123");
b c/c++
//添加头文件
#define LOG_TAG "LED_JNI_LOG"
#include <utils/Log.h>
LOGD("huazai");(相当 printf("huazai");)
e. 调试命令 logcat
有4个缓冲区 main、system、redio(无线通信)、 events(通知)
$ logcat //默认打印 main和system缓冲区的信息
$ logcat -b main //可以选择打印某个缓冲区
$ logcat -c //清除缓冲区
$ logcat -s "123" //自定义查看
f. 查看内核的调试信息
$ dmesg
======================================================================================
三、android驱动过程
解决:
a. android使用的toolbox命令集,使用不方便
答: 使用busybox进行替代
b. 每次开机的时候都会手动去启动androidvncserver(图形界面如:qt)
答: 开机就执行
1. ubuntu 的启动过程
IROM --> IRAM --> nand flash -> DDR --> 内核 --> 挂载根文件下的各个目录
2. Android启动流程–学会使用init.rc (相当linux 的/etc/inittab,/etc/init.d/rcS,/etc/fstab)
a init.rc的语法(参考 system/core/init/readme.txt)
主要关注:action 、 service
b action是一个命令的 集合
Actions take the form of:
on <trigger> //当某个时间执行以下命令
<command>
<command>
c service表示一个后台服务:
service <name> <pathname> [ <argument> ]*
<option>
<option>
例子:
class_start core
class_start main //批量启动(在service中有添加 class main的)
service zygote /system/bin/app_process -Xzygote
/system/bin --zygote --start-system-server
class main // 将多个服务归类,统一的批量的去启动
socket zygote stream 666 // /dev/socket/zygote
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
d 提供busybox的命令:
1 编译busybox 后将sbin、bin拷贝到 -C /opt/rootfs_dir/system/busybox
2 替换shell
$ vim init.rc
438 #service console /system/bin/sh
service console /system/busybox/bin/ash
console
disabled
group log
3 设置path
17 export PATH system/busybox/bin:/system/busybox/sbin:/sbin:/vendor/bin:\
/system/sbin:/system/bin:/system/xbin
e 开机的就直接启动androidvncserver
$ mv androidvncserver system/bin/
$ vim init.rc
service vncserver /system/bin/androidvncserver
class main
android开发流程说明
最新推荐文章于 2023-08-23 14:56:00 发布