解读framwork/base/cmd目录下的Android.mk

代码位置:
/frameworks/base/cmds/input/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := input
include $(BUILD_JAVA_LIBRARY)   //1

include $(CLEAR_VARS)
ALL_PREBUILT += $(TARGET_OUT)/bin/input
$(TARGET_OUT)/bin/input : $(LOCAL_PATH)/input | $(ACP)
    $(transform-prebuilt-to-target)

到注释1处,会将当前目录下的java文件编译成一个jar包,然后需要说明的是下面的内容:

ALL_PREBUILT 这个指向的生成产物的路径,后面是会将当前目录下的input文件通过acp方式将生成到ALL_PREBUILT 指向的路径。

然后再看看当前目录下的input文件内容:

# Script to start "input" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/input.jar
exec app_process $base/bin com.android.commands.input.Input $*

上面脚本的意思就是通过app_process方式启动一个java程序,并且在main函数中接受传递的所有参数。

在framwork/base/cmd这个目录下基本的Android.mk文件都类似这种方式启动了一个java程序。

ps:

$* 和 $@的差异

1 $* 和 $@没有双引号
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
没有双引号的话,$* 和 $@都可以把参数看成是列表
此时系统认为$* 和 $@参数都是列表,为 a,  b,  12 66 a1c,  99四个参数,但是通过循环可以看出,其实是进行了6次的移位循环
2 "$*" 和 "$@"有双引号
但是当$* 和 $@被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
但是,如果参数里本身含有双引号,而且双引号里也有多个数值,如下
参数为  a b "12 66 a1c" 99
运行语句 ./varnu.sh a b "12 66 a1c" 99
加了双引号的
"$@" 参数是 a , b , 12 66 a1c , 99, 4个参数,是列表,而且只进行了4位移位循环
"$*"参数是a b "12 66 a1c" 99,就一个参数,不是列表,就当成一行字符串,没有进行移位循环
发布了70 篇原创文章 · 获赞 24 · 访问量 8266

猜你喜欢

转载自blog.csdn.net/angelsmiling/article/details/103211516
今日推荐