下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

简析android移植基础知识

作者:课课家教育     来源: http://www.kokojia.com点击数:803发布时间: 2016-04-05 14:24:15

标签: androidandroid源码android系统

      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

      

赞(9)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程