正式開始一個新的平臺,以前的項目拿到的代碼都是供應商改好的,感覺有很多不規范的地方。
這次從一個全新的項目著手,嚴格按照android規范進行項目的添加、板級文件的支持。目標是爭取不改動build目錄下的文件,而是用好它的擴展機制。
在lunch中增加combo選項的標準方法
在執行完. build/envsetup.sh后,執行lunch,會出現lunch菜單:
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. aosp_flounder-userdebug
8. mini_emulator_mips-userdebug
9. mini_emulator_x86-userdebug
10. mini_emulator_arm64-userdebug
11. mini_emulator_x86_64-userdebug
12. m_e_arm-userdebug
13. aosp_manta-userdebug
……
在build/envsetup.sh中只增加了默認的幾項:
# add the default one here
add_lunch_combo aosp_arm-eng
add_lunch_combo aosp_arm64-eng
add_lunch_combo aosp_mips-eng
add_lunch_combo aosp_mips64-eng
add_lunch_combo aosp_x86-eng
add_lunch_combo aosp_x86_64-eng
lunch函數會到venor和device目錄中尋找vendorsetup.sh,然后執行文件中類似的
add_lunch_combo aosp_flounder-userdebug
然后就會多出個
7. aosp_flounder-userdebug
Android 5.1可以自動識別JAVA_HOME
參見build/envsetup.sh,代碼如下:
# Force JAVA_HOME to point to java 1.7 or java 1.6 if it isn't already set.
#
# Note that the MacOS path for java 1.7 includes a minor revision number (sigh).
# For some reason, installing the JDK doesn't make it show up in the
# JavaVM.framework/Versions/1.7/ folder.
function set_java_home() {
# Clear the existing JAVA_HOME value if we set it ourselves, so that
# we can reset it later, depending on the version of java the build
# system needs.
#
# If we don't do this, the JAVA_HOME value set by the first call to
# build/envsetup.sh will persist forever.
if [ -n "$ANDROID_SET_JAVA_HOME" ]; then
export JAVA_HOME=""
fi
if [ ! "$JAVA_HOME" ]; then
if [ -n "$LEGACY_USE_JAVA6" ]; then
case `uname -s` in
Darwin)
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
;;
*)
export JAVA_HOME=/usr/lib/jvm/java-6-sun
;;
esac
else
case `uname -s` in
Darwin)
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
;;
*)
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
;;
esac
fi
# Keep track of the fact that we set JAVA_HOME ourselves, so that
# we can change it on the next envsetup.sh, if required.
export ANDROID_SET_JAVA_HOME=true
fi
}
Android 5.1的編譯使用了openjdk,在ubuntu上可以直接通過apt-get進行安裝。
如何新建一個device
- 從原有的device目錄復制一份,將目錄命名為你要新建的設備名稱。如把msm8916_64復制一份,重命名為msm8916_d500。
- 將msm8916_d500目錄下的AndroidProducts.mk內容更新為:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/msm8916_d500.mk
- 將msm8916_d500目錄下原有的msm8916_64.mk重命名為msm8916_d500.mk。修改里面的PRODUCT_NAME和PRODUCT_DEVICE:
PRODUCT_NAME := msm8916_d500
PRODUCT_DEVICE := msm8916_d500
- 在msm8916_d500目錄下新建一個vendorsetup.sh,在里面增加combo選項,這樣msm8916_d500就會出現在lunch菜單里。
add_lunch_combo msm8916_d500-userdebug
add_lunch_combo msm8916_d500-eng
add_lunch_combo msm8916_d500-user
- 修改msm8916_d500目錄下的AndroidBoard.mk,修改KERNEL_DEFCONFIG,將其指向我們自己的defconfig文件:
#----------------------------------------------------------------------
# Compile Linux Kernel
#----------------------------------------------------------------------
ifeq ($(KERNEL_DEFCONFIG),)
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msm8916_d500-perf_defconfig
else
KERNEL_DEFCONFIG := msm8916_d500_defconfig
endif
endif
msm8916_d500_defconfig和msm8916_d500-perf_defconfig在kernel/arch/arm/configs目錄下,不存在的話,要以msm8916_defconfig為模板新建一個,并在其中加入一行:
CONFIG_BOARD_SEUIC_D500=y
這個變量會在導入dts中用到。
- kernel/arch/arm/boot/dts/qcom/Makefile中增加:
dtb-$(CONFIG_BOARD_SEUIC_D500) += msm8916_d500.dtb