先说一下目标:
1,对修改的特定模块进行编译.
2,编译结果(bin,so)存放到制定目录.
难点:
1,修改的目录很多,想要一一找到,并且不能遗漏.但又不想每次添加,
2,想要一键编译,但希望这次编译的只有修改的模块.
尝试的做法:
1,修改文件后,在Android.mk中,新添加LOCAL_MODULE为ids-的模块,将LOCAL_MODULE_PATH := ids-core/out/ .
2,使用find -name Android.mk | xargs -i grep -l "ids-core" {}命令,找到所有包含ids-core的Android.mk,并进行编译.
find -name Android.mk | xargs -i grep -l "ids-core" {} 意思是find指定文件内容的文件.效率远高于单纯的grep.shell真的有必要好好学习.
|awk -F/ 'OFS="/"{$NF="";print}' 这条加到上一条后面,可以把需要编译的目录都找到.
最终结果:
以init这个bin文件,还有libsurfaceflinger.so为例.介绍一下如何改动的.
1,init
###############################################################
include $(CLEAR_VARS)
LOCAL_MODULE := ids-init ##LOCAL_MODULE不能重名,只能后面脚本批量处理
LOCAL_MODULE_CLASS := EXECUTABLES ##好像可以删除了,以前尝试prebuilt时留下的.
LOCAL_MODULE_PATH := ids-core/out/root ##指定编译结果生成的位置,相对于Android主目录的路径.
LOCAL_SRC_FILES :=../../../$(TARGET_ROOT_OUT)/init ##指定源文件路径,相对于当前编译目录的路径.
include $(BUILD_RAW_EXECUTABLE) ##加个RAW,就不会去进行EXECUTABLE的编译校验了.
###############################################################
include $(CLEAR_VARS)
LOCAL_MODULE := ids-libsurfaceflinger ##还好现在版本低,不会自动在前面加上lib.
LOCAL_MODULE_PATH := ids-core/out/lib ##指定路径
LOCAL_MODULE_TAGS := optional ##eng,user.....都会编译.
LOCAL_SRC_FILES :=../../../../$(TARGET_OUT_SHARED_LIBRARIES)/libsurfaceflinger.so ##指定源so的路径.
include $(BUILD_SHARED_LIBRARY) ##会自动添加.so,在考虑,是不是换一个会更好.
再加一个shell脚本,制作一键编译
##get modify dir
cd ${idsAHome}/product/${androidVendor}
echo "start mk ${androidVendor}"
idsCorePath=$(find -name Android.mk | xargs -i grep -l "ids-core" {}|awk -F/ 'OFS="/"{$NF="";print}')
##mk file
cd ${idsAHome}/${androidVendor}
echo $PWD
source build/envsetup.sh
lunch wing_k10x6-eng
for path in $idsCorePath
do
i=$path
echo "mma $i"
cd ${idsAHome}/${androidVendor}/$i
mma 1>/dev/null 2>&1
done
echo "mk end"