本篇文章主要介绍了"android系统移植之概述",主要涉及到android系统移植之概述方面的内容,对于android系统移植之概述感兴趣的同学可以参考一下。
1. 概述
移植工作一般的主要不外乎做以下这些事情:
A、有的现成好的直接选配
这个工作主要是熟悉该源码的编译系统,就是源码自动化编译是怎么组织的。linux环境下不外乎是Makefile及脚本。所以得熟悉这两个方面的知识。
B、有的不好的代码修改好后选配
这个工作不仅仅是要熟悉编译系统,还要熟悉别人的代码结构。一般牛X的软件架构也牛X,所以主要是学习牛X的人设计的代码结构,所谓的框架。框架懂了,再熟悉里面的细节,就可以改了。
C、添加新代码并选配
这个工作同样要熟悉编译系统及源码结构。这个时候对框架可能不能仅仅限于知道,而且要深刻理解,按照牛人的思路来设计代码。
所以android的移植就可以简单的说成有以下方面的工作:
A、熟悉android的编译系统
主要是.mk文件的规则,这个官网及源码中有文档说明(development/Ndk/Docs/android-mk.txt),得好好研究清楚。就源码中的脚本,譬如:build/envsetup.sh
B、熟悉android的源码目录结构
system:根文件系统相关的一些代码
packages:android的一些APP的源码
frameworks:framework层代码,不改动android源码的话,主要就是app层调用hal层代码的接口实现的源码
hardware:hal层代码
devices和vendor:厂商定制代码
build:编译系统的一些mk文件
out:是编译输出目录
主要的一些目录就是上面了,对于初学的话,差不多就足够了。当然所有的都熟悉是最好了。
C、三个层次的代码
要向android添加代码的话,一般主要熟悉三个层次的代码就差不多了。
APP<--->framework<--->HAL
APP:应用程序层次,主要是java代码,通过跨平台的java编写的代码来完成需求逻辑对系统提出功能性要求,让系统去完成相应的动作。
framework:cpp代码,主要是提供给java调用的接口,这些接口通常是去调用到hal层的代码。
HAL:登记一组供framework回调的函数,来完成一定的功能。
2. 厂商代码定制
公司目录——demo
设备目录——demopad
(1)创建目录
device/demo
device/demo/demoPad
OR
vendor/demo
vendor/demo/demoPad
(2)mk文件编写
这个比较复杂一点,但是简单地说:找到mk中的一些定义的变量,要选择要编译什么?怎么编译?或是要拷贝什么?怎么拷贝?等等方面的问题。简而言之就是熟悉mk规则。
①厂商配置
A、AndroidBoard.mk范例:
LOCAL_PATH := $(call my-dir) #指定本地编译目录
②产品配置
A、AndroidProducts.mk内容范例:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/demoPad.mk #指定demoPad.mk为产品定制的Makefile
③demoPad.mk内容范例:
$(call inherit-product, device/.../xxx.mk) #指把xxx.mk中的变量添加进来
DEVICE_PACKAGE_OVERLAYS := device/.../overlay #指定目录下的资源替换系统的资源
PRODUCT_COPY_FILES += \ #指定拷贝内容:源——>目标
source_path:destination_path
PRODUCT_PROPERTY_OVERRIDES += \ #
key=value
PRODUCT_PACKAGES += \ #定制软件
xxx
$(call inherit-product-if-exists, device/.../xxx.mk)#指把xxx.mk(xxx.mk要存在)中的变量添加进来
PRODUCT_CHARACTERISTICS := tablet #产品特性——平板
# Overrides
PRODUCT_BRAND := demo
PRODUCT_NAME := demoPad #要编译的产品名称选项的前缀一致
PRODUCT_DEVICE := demoPad #要编译的设备目录一致
PRODUCT_MODEL := demo
(3)设备配置
BoardConfig.mk范例:
include device/.../xxx.mk #包含xxx.mk中的定义
TARGET_CPU_ABI := armeabi-v7a#指定cpu
TARGET_CPU_ABI2 := armeabi #支持eabi
TARGET_ARCH_VARIANT := armv7-a-neon
ARCH_ARM_HAVE_TLS_REGISTER := true
TARGET_BOARD_PLATFORM := exDroid
TARGET_BOOTLOADER_BOARD_NAME := demoPad
......
3. 编译步骤
(1)环境搭建
主要是安装java SDK和一些支持库(应用程序移植就是麻烦,往往需要一堆支持环境,不像内核或是u-boot这样的底层代码,仅仅要自己的代码,不需要其他支持)。这个到官网看下就知道了,官网有详细的说明。不过直接照着官网的做,有可能也会有点小问题。譬如android4.0需要ubuntu 64bits环境及gcc要是4.4版本的。那么相应的库安装就g++-multilib就不对,需要是g++-4.4-multilib。这样的问题,只能在编译出错后才能够知道。详见:http://source.android.com/source/initializing.html
(2)配置java到环境变量
# export PATH=$PWD/jdk-xxx/bin:$PATH
# export CLASSPATH=$PWD/jdk-xxx/lib
其中jdk-xxx指的是java SDK安装好后的目录名
(3)编译
生成一个vendorsetup.sh脚本
# touch device/demo/demoPad/vendorsetup.sh
把add_lunch_combo demoPad-eng添加到vendorsetup.sh中
add_lunch_combo是build/envsetup.sh脚本的一个函数,其功能是生成一个选项,即可以选择编译我们定制的厂商目录下的东西
# echo "add_lunch_combo demoPad-eng" > device/demo/demoPad/vendorsetup.sh
导出build/envsetup.sh脚本中的函数
# source build/envsetup.sh
选择我们定制厂商目录,以便定制编译
# lunch demoPad-eng
拷贝内核
# extract-bsp
编译,这里可以加-j2这样的参数,意思是可以多线程编译,这个根据你的机器来。
# make