简析android移植基础知识

    作者:课课家教育更新于: 2016-04-05 14:24:07

          Android系统的移植的主要目的是为了能在特定的硬件上运行Android系统。从工作的角度,首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。下面我们就Android系统的移植简单学习移植的基本内容以及各方面的工作。

    简析android移植基础知识_android_android源码_android系统_课课家

         一、概述

      移植的工作一般的主要不外乎做以下这些事情:

      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回调的函数,来完成一定的功能。

      二、厂商代码定制

      公司目录——demo

      设备目录——demopad

      1、创建目录

      device/demo

      device/demo/demoPad

      OR

      vendor/demo

      vendor/demo/demoPad

      2、mk文件编写

      这个比较复杂一点,但是简单地说:找到mk中的一些定义的变量,要选择要编译什么?怎么编译?或是要拷贝什么?怎么拷贝?等等方面的问题。简而言之就是熟悉mk规则。

      (1)厂商配置

      A、AndroidBoard.mk范例:

      LOCAL_PATH := $(call my-dir) #指定本地编译目录

      (2)产品配置

      A、AndroidProducts.mk内容范例:

      PRODUCT_MAKEFILES := \\

      $(LOCAL_DIR)/demoPad.mk #指定demoPad.mk为产品定制的Makefile

      B、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

      ......

      三、编译步骤

      1、环境搭建

      主要是安装java SDK和一些支持库(应用程序移植就是麻烦,往往需要一堆支持环境,不像内核或是u-boot这样的底层代码,仅仅要自己的代码,不需要其他支持)。

      这个到官网看下就知道了,官网有详细的说明。不过直接照着官网的做,有可能也会有点小问题。譬如android4.0需要ubuntu 64bits环境及gcc要是4.4版本的。那么相应的库安装就g++-multilib就不对,需要是g++-4.4-multilib。这样的问题,只能在编译出错后才能够知道。

      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

          

课课家教育

未登录