一:车机系统框架
MCU 功能
电源控制
Radio 控制(RDS)
按键检测(Panel/Remote/SW)
常见信号检查(倒车/大灯/刹车)
CAN 模块通讯
ARM-MCU 通讯
进出碟控制
翻转马达系统
屏驱(此种情况倒车一般用 mcu 控制)
AMR 功能
wifi 、BT、 gps、3/4G
显示、触摸
多媒体播放(SD 卡、U 盘)
倒车显示
语音
AUX
胎压、DVR、CMMB
CVBS 输出(后排输出)
二:安卓启动流程
第一阶段:Android 设备上电后,首先会从处理器片上 ROM 的启动引导代码开始执行,片上 ROM 会寻找 Bootloader
代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)
第二阶段:Bootloader 开始执行,首先负责完成硬件的初始化,然后找到 Linux 内核代码,并加载到内存。(这一
步由“设备厂商”负责设计和实现)
第三阶段:Linux 内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行 init 程序,
由此开启 Android 的世界。(这一步则是 Android 内核开发过程中需要涉及的地方)
init 程序最核心的工作主要有 3 点:
(1) 创建和挂载一些系统目录/设备节点,设置权限,如:/dev, /proc, and /sys
(2) 解析 init.rc 和 init..rc,并启动属性服务,以及一系列的服务和进程。
(3) 显示 boot logo,默认是“Android”字样
第四阶段:Zygote 进程、SystemServer 进程创建 Zygote 进程由 init 进程创建,SystemServer 进程由 Zygote 创建
第五阶段:订制的service 启动:例举包括以下服务( 添加的所有关键服务)
CBMService;
CanbusService;
McuService;
RadioService;
SettingService;
McuCBMService;
PandoraService;
SWCService;
第六阶段:启动完成阶段。当所有的服务都启动完毕后,SystemServer 会打印出“Making services ready”,然后
通过 ActivityManager 启动 Home 界面,并发送“ACTION_BOOT_COMPLETED”广播消息(到此真正看到了主界面)
三:代码结构
核心服务路径:\autochips\frameworks\base\services\java\com…
APP 路径:\autochips\packages
四:编译说明(AC8217平台代码而论)
全编译
1 . mbldenv.sh 导出编译需要的编译工具相关环境变量
2 . selfenv 拷贝 autochips 到相关目录主要拷贝以下目录:
3 . selfbuild
实际上 selfbuild 仅是 autochips\build\build.all 脚本的符号链接。在没有参数的情况下,selfbuild 会依次执行 build.env,
build.uboot,build.kernel,build.driver,build.arm2,build.android,build.otapackage,build.makeimage 这 7 个 sh 脚本。
相当分步执行以下:(当要单独编译部分时可以单独以下某句命令方法)
1.source./build.env设置编译环境2../selfbuild uboot 编译 uboot
3../selfbuilddriver编译ATC的driver4../selfbuild kernel 编译 linux kernel
5../selfbuildarm2编译arm26../selfbuild android 编译 android
7.$./selfbuild makeimage 生成最后需要烧写到板子上的 Image( 把多余的 apk 删除同时打包镜像)
模块编译
1 : 用 mm 或 mmm 编译相应模块
2: . selfbuild makeimage 生产镜像
附上编译脚本片段代码:
**
mbldenv.sh脚本文件
**
!/bin/bash
#
ALPS(Android4.1 based) build environment profile setting
#
Overwrite JAVA_HOME environment variable setting if already exists
PATH=/mtktools/mtk-toolchain/gnuarm-4.2.1/image-tools:PATHPATH=/mtktools/mtk−toolchain/gnuarm−4.4.1/cross−tools/usr/local/bin:PATH
PATH=/mtktools/mtk-toolchain/vfp_4.5.1_2.6.27_cortex-a9-rhel4_002/i686/bin:PATHANTHOME=/usr/local/antexportANTHOMEexportMTKJAVAHOME=”/usr/local/jdk1.6.032”exportPATH=MTK_JAVA_HOME/bin:ANTHOME/bin:PATH
export ANDROID_JAVA_HOME=MTKJAVAHOMEexportANDROIDJAVATOOLCHAIN=MTK_JAVA_HOME/bin/
export JAVA_HOME=MTKJAVAHOMEexportJREHOME={JAVA_HOME}/jre
export CLASSPATH=.:JAVAHOME/lib:{JRE_HOME}/lib
export PATH
unset USERNAME
SKIN1: SKIN2:
export SKIN=Skin2
selfenv脚本文件:
!/bin/sh
export ANDROID4=pwd
export ANDROID_SRC=ANDROID4exportKERNELSRC=ANDROID4/kernel
export KERNELDIR=KERNELSRC/exportAUTOCHIPSDIR=ANDROID4/autochips
export DRIVERS_DIR=AUTOCHIPSDIR/protect/platform/kernel/driversexportPUBLICDRIVERSDIR=AUTOCHIPS_DIR/platform/kernel/drivers
export DRIVERS_INC=AUTOCHIPSDIR/platform/kernel/drivers/incexportARM2SRC=AUTOCHIPS_DIR/platform/arm2
export DISPLAY_HARDWARE_INC=AUTOCHIPSDIR/hardware/atc/displayexportUBOOTSRC=AUTOCHIPS_DIR/platform/uboot
export SCRIPT_DIR=AUTOCHIPSDIR/buildexportANDROIDOUTPUT=ANDROID_SRC/out
export DRIVERS_OUTPUT=AUTOCHIPSDIR/platform/kernel/drivers/outputexportDRIVERSLIB=AUTOCHIPS_DIR/platform/kernel/drivers/lib
export AUTOCHIPS_TOOL=AUTOCHIPSDIR/toolsexportRELEASEFOLDERNAME=ANDROID4/image_release
export BOARD_CFG_FILE=$AUTOCHIPS_DIR/device/atc/ac8317/BoardConfig.mkexport PATH=ANDROIDSRC/autochips/external/gstreameraggregate/bin/:AUTOCHIPS_TOOL:$PATH
export JOB_NUM=grep processor /proc/cpuinfo |wc -l
export CHIP_VER=8317
find AUTOCHIPSDIR/device/atc/ac8317/.overlay/build/−typef|xargstouchcp−ruafAUTOCHIPS_DIR/device/atc/ac8317/.overlay/build/* $ANDROID_SRC/build/
copy /autochips/kernel/includeto/kernel/include
find AUTOCHIPSDIR/kernel/include−typef|xargstouchcp−ruafAUTOCHIPS_DIR/kernel/include/* $ANDROID_SRC/kernel/include/
INPUT_PARAM=$*
function check_parameter()
{
if [ ! -z “echo "$INPUT_PARAM" | grep eng” ];then
echo “eng”
elif [ ! -z “echo "$INPUT_PARAM" | grep userdebug” ];then
echo “userdebug”
elif [ ! -z “echo "$INPUT_PARAM" | grep user” ];then
echo “user”
else
echo “eng”
fi
}retval=check_parameter $*
source ANDROIDSRC/build/envsetup.shretvalINPUT_PARAM=INPUTPARAM/eng/INPUTPARAM={INPUT_PARAM/userdebug/}
INPUT_PARAM=INPUTPARAM/user/INPUTPARAM=(echo $INPUT_PARAM
lunch
if [ ! -z “echo "$INPUT_PARAM" | grep ?” ];then
lunch
else
lunch 5
fiecho “env [$retval] setup completed!!!”
selfbuild脚本文件:
!/bin/sh
{
if [ -z which androidq ];then
#echo "no androidq, source bash_profile"
source ~/.bash_profile
source ~/.bashrc
fi
if [ ! -z which androidq ];then
echo “androidq ok, build with it”
ANDROIDQ=androidq
else
echo “no androidq, build without it”
ANDROIDQ=
fiINPUT_PARA=$*
Copy Overlay folder to original
if [ ! -z “echo "$INPUT_PARA" | grep cpoverlay” ];then
SCRIPTDIR/build.INPUT_PARA
exit 0
fi
process android version: user, userdebug, eng
if [ ! -z “echo "$INPUT_PARA" | grep eng” ];then
export ANDROID_VER=eng
elif [ ! -z “echo "$INPUT_PARA" | grep userdebug” ];then
export ANDROID_VER=userdebug
elif [ ! -z “echo "$INPUT_PARA" | grep user” ];then
export ANDROID_VER=user
else
export ANDROID_VER=eng
fi
INPUT_PARA=INPUTPARA/eng/INPUTPARA={INPUT_PARA/userdebug/}
INPUT_PARA=INPUTPARA/user/INPUTPARA=(echo $INPUT_PARA)source autochips/build/build.env $ANDROID_VER
echo “export env: ANDROID4=ANDROID4”if[!−dAUTOCHIPS_DIR -o -z $AUTOCHIPS_DIR ];then
echo “export some env var error, exit”
exit 1
fiALLIMAGES=”uboot kernel driver arm2 android otapackage makeimage clean cts”
check if para is nand
if [ ! -z “echo "$INPUT_PARA" | grep nand” ];then
export AC83XX_BOOT_DEVICE=nand
elif [ ! -z “echo "$INPUT_PARA" | grep sd2” ];then
export AC83XX_BOOT_DEVICE=sd2
else
export AC83XX_BOOT_DEVICE=mmc
fi
remove mmc para
INPUT_PARA=INPUTPARA/nand/INPUTPARA={INPUT_PARA/sd2/}
INPUT_PARA=(echoINPUT_PARA)echo “AC83XX_BOOT_DEVICE :$AC83XX_BOOT_DEVICE”
check if it is release build, debug build by default
if [ ! -z “echo "$INPUT_PARA" | grep debug” ];then
export RELEASE_BUILD=false
echo “build for debug”
else
export RELEASE_BUILD=true
echo “build for release”
fi
remove release or debug if it has
INPUT_PARA={INPUT_PARA%release}
INPUT_PARA={INPUT_PARA%debug}
INPUT_PARA=(echoINPUT_PARA)if [ -z “INPUTPARA”];thenIMAGELIST=”ubootkerneldriverarm2androidotapackagemakeimage”exportBUILDALL=trueecho“noparam,default:IMAGE_LIST”
echo -e “\033[31m delete out(ANDROIDOUTPUT)folder?(y/n)\033[0m”read−t5RMOUTif[−dout−a“RMOUT" = "y" -a "?”=“0”];thenecho−e“\033[31mbegindeleteout(ANDROID_OUTPUT) folder\033[0m”
ANDROIDQrm−rfANDROID_OUTPUT
fi
else
IMAGE_LIST=”$INPUT_PARA”
export BUILD_ALL=false
fiif [ ! -z “echo $IMAGE_LIST | grep makeimage” ];then
export MAKE_IMAGE=true
IMAGE_LIST=${IMAGE_LIST%makeimage}fi
for test
for PARAM in $IMAGE_LIST
do
if [ ! -z “echo "$ALLIMAGES" | grep $PARAM” ];then
if [ ! -z “echo $PARAM | grep android” ];then
if [ ! -z “echo $ANDROID_VER | grep eng” ];then
BUILD_PARA=”eng”
elif [ ! -z “echo $ANDROID_VER | grep userdebug” ];then
BUILD_PARA=”userdebug”
elif [ ! -z “echo $ANDROID_VER | grep user” ];then
BUILD_PARA=”user”
else
BUILD_PARA=””
fi
elif [ ! -z “echo $PARAM | grep kernel” ];then
if [ ! -z “echo "$RELEASE_BUILD" | grep false” ]; then
BUILD_PARA=”debug”
elif [ ! -z “echo $ANDROID_VER | grep eng” ];then
BUILD_PARA=”debug”
else
BUILD_PARA=””
fi
elif [ ! -z “echo $PARAM | grep driver” ];then
if [ ! -z “echo "$RELEASE_BUILD" | grep false” ]; then
BUILD_PARA=”debug”
else
BUILD_PARA=””
fi
else
BUILD_PARA=””
fi
echo -e "\033[32m build.$PARAM $BUILD_PARA\033[0m"
if [ ! -x $SCRIPT_DIR/build.$PARAM ];then
if [ ! -z "`echo $PARAM | grep otapackage`" ];then
source autochips/build/build.env $AC83XX_BOOT_DEVICE
fi
echo -e "\033[32m $SCRIPT_DIR/build.$PARAM $BUILD_PARA can't executable!\033[0m"
exit 1
fi
echo "++ build_dir is $SCRIPT_DIR, param is $PARAM, build_para is $BUILD_PARA++"
$ANDROIDQ $SCRIPT_DIR/build.$PARAM $BUILD_PARA
if [ "$?" != "0" ];then
echo -e "\033[31m build.$PARAM $BUILD_PARA error, stop!\033[0m"
exit 1
else
echo -e "\033[32m build.$PARAM $BUILD_PARA OK!\033[0m"
fi
else
echo -e “\033[31munknown cmd: $PARAM\033[0m”
fi
donebuild kernel and driver again to debug if no release
assume that arm2 image is only need to generate in
building all iamge, which means the whole image building
if [ ! -z “echo "$RELEASE_BUILD" | grep false” ]; then
echo “it is debug build”
if [ ! -z “echo "$BUILD_ALL" | grep true” ]; then
echo “clean kernel and drivers”
cd KERNELDIR && make clean && make mrproper
#cdDRIVERS_DIR && make clean
echo “build kernel and driver again”
ANDROIDQSCRIPT_DIR/build.kernel “debug”
ANDROIDQSCRIPT_DIR/build.driver “debug”
fi
else
echo “it is release build”
fibuild image
if [ ! -z “echo $MAKE_IMAGE | grep true” ];then
echo “Going to build images”
$SCRIPT_DIR/build.makeimage
fiecho “build is done!”
exit} | tee buildlog.txt