Android.mk中调用shell脚本
最近做的项目中,有个特殊的情景:手机开机后,程序A是必须启动的,而程序B是我们想要启动的,但B的可执行文件可能会被使用任何方式修改,所以必须在A中确保B可执行文件是正确的。
思路:在编译时,对已经生成的B进行md5sum加密,生成一个CC.h文件。在随后编译A时,在A中包含CC.h文件。编译完成后,A执行时,动态调用shell命令的md5对B文件进行加密,取得的字符串与CC.h中保留的字符串进行对比,如果一样,则执行A的后续流程;如果不相同,则停止A的执行。
实现:
1.Android.mk中脚本:
$(shell ($(LOCAL_PATH)/md5_shell.sh $(LOCAL_PATH) $(product_name)))
shell语句可以带参数传给shell脚本
2.md5_shell.sh脚本编码
#!/bin/sh
#加密文件路径
LOCAL_PATH=$1
LOCAL_MODULE_PATH=$2
#输出文件
DESTFILE=$LOCAL_PATH/ota_md5_value.h
rm $DESTFILE
#构建.h文件
echo "#ifndef __OTA_MD5_VALUE_H__">$DESTFILE
echo "#define __OTA_MD5_VALUE_H__">>$DESTFILE
echo "static char ota_md5[]=">>$DESTFILE
#加密的二进制文件所在位置
SRC=$LOCAL_MODULE_PATH/ota
#加密,输出到md5value.h中
md5sum $SRC>$LOCAL_PATH/tmp
#取出md5值
var=$(cut -c 1-32 $LOCAL_PATH/tmp)
#删除临时文件
rm $LOCAL_PATH/tmp
#构建完整的.h文件
sed -i '3s/$/&"/' $DESTFILE
sed -i "3s/$/$var/" $DESTFILE
sed -i '3s/$/&"/' $DESTFILE
sed -i '3s/$/&;/' $DESTFILE
echo "#endif">>$DESTFILE
脚本主要生成了CC.h
3.A源码中调用md5sum与CC.h中的字符对比