RK3128系統&驅動開發分享——(一)、開發環境搭建
本系列課程主要講解RK3128平臺的系統&驅動開發相關的知識。
RK3128為我司基於RK3128平臺定製的一款pad裝置。基於瑞芯微官網原始碼開發。android版本採用5.1。
本章節主要講解android系統開發環境搭建及編譯基礎,針對RK3128平臺的原始碼下載及編譯流程參考附件文件。本文主要講解基礎性理論知識,並針對RK3128提供的平臺講解下編譯指令碼。
本文附件文件下載:連結:https://pan.baidu.com/s/1pKFa0gb 密碼:dbs6
一、android系統編譯開發環境搭建
需要的軟體環境如下:
1、宿主機:ubuntu12.04(64bit)
2、JDK:OpenJDK7
3、android版本:5.1
4、NDK,跟隨原始碼下載,編譯腳本里會配置響應的
Android版本 | 編譯要求的JDK版本 |
---|---|
AOSP的Android主線 | OpenJDK 8 |
Android 5.x至android 6.0 | OpenJDK 7 |
Android 2.3.x至Android 4.4.x | Oracle JDK 6 |
Android 1.5至Android 2.2.x | Oracle JDK 5 |
不同版本的android對應的JDK如上圖。
NDK的概述:
NDK是一系列工具的集合。
- NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
- NDK集成了交叉編譯器,並提供了相應的mk檔案隔離CPU、平臺、ABI等差異,開發人員只需要簡單修改mk檔案(指出“哪些檔案需要編譯”、“編譯特性要求”等),就可以創建出so。
- NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
對應的一些工具需要apt-get安裝,參考附件中有說明。
二、編譯
android系統編譯分三步:
1、命令載入,例如lunch、mm等命令就是命令載入後才有效的。
執行此命令完成命令載入:source build/envsetup.sh
2、lunch,選擇編譯平臺。輸入lunch出現如下提示,這裡選擇8回車。
lunch裡選項的目錄可以新增,本例子中RK3128對應的lunch選項配置檔案路徑為 原始碼目錄/device/rockchip/rk312x/vendorsetup.sh
3、make -j4編譯。編譯完成後需要打包工具打包。具體方法見附件文件。
問題及說明:
1、JDK的配置,rk3128環境編譯時需要執行build.sh指令碼(附件文件裡有說明),這個指令碼主要是配置JDK版本的。指令碼內容如下:
#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
. build/envsetup.sh
如果編譯過程中提示JDK相關的錯誤有可能是JDK版本匹配問題,因為android系統編譯過程中經常出現JDK版本切換不完全的情況,那麼需要執行以下兩條指令來切換JDK版本:
sudo update-alternative --config java
sudo update-alternative --config javac
輸入上面命令後會提示選擇對應的JDK版本。2、核心編譯與系統編譯
android核心採用的是linux核心,其編譯過程跟linux系統開發一樣。生成的檔案格式也是linux標準的zImage格式。
android系統編譯其實相當於是類似檔案系統的一個編譯,會生成ramdisk.img、system.img、userdata.img(本例子中沒有生成此檔案),三個檔案對應原始碼目錄下/out/target/product/rk312x/目錄下的root、system、data目錄。三個檔案儲存安卓檔案系統中不同的檔案資料,具體在此不做詳細解釋。
3、打包
如上一條所敘述,安卓分為核心和系統部分。那麼韌體生成的過程其實分為編譯和打包兩個過程。
linux核心韌體也需要二進位制檔案處理工具進行處理然後生成zImage。
android系統編譯生成的檔案,編譯時生成如上一條所講的root、system、data目錄。然後編譯時通過一系列打包工具生成ramdisk.img、system.img、userdata.img。
按照以上所述,生成zImage、ramdisk.img、system.img、userdata.img檔案後,還需要將ramdisk.img、zImage合併成一個boot.img檔案,然後就可以將此檔案燒錄到硬體。
這個打包的過程android標準的做法是使用mkbootimg(out/host/linux-x86/bin/)來打包。本例子中使用的是mkimage.sh指令碼來打包,這個指令碼就是基於mkbootimg來工作的。打包後的韌體儲存在 /rockdev/image-rk312x目錄下(打包指令碼中做了cp動作)。