前言
在 Android 开发中,我们经常需要根据不同的硬件平台和产品需求,创建不同的 lunch project项,来编译出对应客户的系统镜像。本文将介绍如何在全志 Android 平台上新建一个 lunch 项,以及如何使用一个简单的脚本来自动化这个过程。
步骤
假设我们要在全志 Android 平台上新建一个名为 a40-c01 的 lunch 项,可以参考以下步骤:
- 在源代码中的 device/softwinner 目录下,复制一份已有的目录(如:a40-p1),命名为 a40-c01,文件夹命名随意。
cp -r device/softwinner/a40-p1 device/softwinner/a40-c01
- 把 device/softwinner/a40-c01 目录下的 a40_p1.mk 重命名为 a40-c01.mk。
mv device/softwinner/a40-c01/a40_p1.mk device/softwinner/a40-c01/a40-c01.mk
- 把 a40-c01.mk 中,目录名及产品信息等,由 a40-p1 修改为 a40-c01。
sed -i "s/a40-p1/a40-c01/g" device/softwinner/a40-c01/a40-c01.mk
- 把 device/softwinner/a40-c01 目录下 AndroidProducts.mk 文件中,修改 PRODUCT_MAKEFILES 为 a40-c01.mk。
sed -i "s/a40_p1.mk/a40-c01.mk/g" device/softwinner/a40-c01/AndroidProducts.mk
- device/softwinner/a40-c01 目录下 vendorsetup.sh 文件中,修改语句 add_lunch_combo a40-c01-eng,其中 a40-c01 为自己的命名,后面必须有 -eng,否则 lunch 时无法找到编译的选项。
sed -i "s/a40_p1-eng/a40-c01-eng/g" device/softwinner/a40-c01/vendorsetup.sh
- device/softwinner/a40-c01 目录下 package.sh 文件 ./pack -c sun4i -p a40 -b a40-c01 -d uart0 其中 a40-c01 为自己的命名,也就是 a40-c01.mk 里的 PRODUCT_MODEL := a40-c01 取的名字。
sed -i "s/a40-p1/a40-c01/g" device/softwinner/a40-c01/package.sh
- 根据自己的需求,再修改其他参数。
- 进入 lichee/tools/pack/chips/sun8iw11p1/configs 目录下,复制一份已有的目录(如:a40-p1),命名为 a40-c01。
cp -r lichee/tools/pack/chips/sun8iw11p1/configs/a40-p1 lichee/tools/pack/chips/sun8iw11p1/configs/a40-c01
- 把 a40-c01 目录下的所有文件中,由 a40-p1 修改为 a40-c01。
find lichee/tools/pack/chips/sun8iw11p1/configs/a40-c01 -type f -exec sed -i "s/a40-p1/a40-c01/g" {} +
脚本
为了方便,可以把上述步骤写成一个脚本,比如 create_new_lunch.sh,然后在源代码根目录下执行 ./create_new_lunch.sh oldname newname 即可完成新建 lunch 项的操作。以下是脚本的内容:
#!/bin/bash # 用法: ./create_new_lunch.sh oldname newname # 示例: ./create_new_lunch.sh a40-p1 a40-c001 oldname=$1 newname=$2 # 检查参数 if [ $# -ne 2 ]; then echo "用法: ./create_new_lunch.sh oldname newname" exit 1 fi if [[ ! $newname =~ ^a40- ]]; then echo "新的名字必须以 a40- 开头" exit 2 fi # 检查旧的名字是否存在 if [ ! -d android/device/softwinner/$oldname ]; then echo "旧的名字 $oldname 不存在,请输入正确的名字" exit 3 fi if [ ! -d lichee/tools/pack/chips/sun8iw11p1/configs/$oldname ]; then echo "旧的名字 $oldname 不存在,请输入正确的名字" exit 4 fi # 复制设备目录 cp -r android/device/softwinner/$oldname android/device/softwinner/$newname # 重命名 makefile mv android/device/softwinner/$newname/${oldname//-/_}.mk android/device/softwinner/$newname/${newname//-/_}.mk # 在所有文件中替换旧的名字为新的名字 find android/device/softwinner/$newname -type f -exec sed -i "s/$oldname/$newname/g" {} + find android/device/softwinner/$newname -type f -exec sed -i "s/${oldname//-/_}/${newname//-/_}/g" {} + # 复制 lichee 目录 cp -r lichee/tools/pack/chips/sun8iw11p1/configs/$oldname lichee/tools/pack/chips/sun8iw11p1/configs/$newname # 在所有文件中替换旧的名字为新的名字 find lichee/tools/pack/chips/sun8iw11p1/configs/$newname -type f -exec sed -i "s/$oldname/$newname/g" {} + # 完成 echo "新的 lunch 项 $newname 创建成功。"
$ ./create_new_lunch.sh a40-c003 a40-c04 旧的名字 a40-c003 不存在,请输入正确的名字 $ ./create_new_lunch.sh a40-c03 a40-c04 新的 lunch 项 a40-c04 创建成功。
总结
本文介绍了如何在全志 Android 平台上新建一个 lunch 项,以及如何使用一个简单的脚本来自动化这个过程。