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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章