Android:执行exec app_process启动jar失败原因

问题

adb shell中直接执行命令脚本可正常执行

su
export CLASSPATH=Test.jar
exec app_process /system/bin xx.xx.Test $0

但通过Runtime.getRuntime().exec("sh")执行时,却没有任何效果。

原因

在安卓4.4下正常运行,安卓4.2却不行。一度怀疑是dx --dex打包进去的依赖包无法兼容API 17导致。
最后在Stack Overflow上挖到了同样的旧坑
原文如下:

It seems like that when launching dalvikvm, your LD_LIBRARY_PATH is not correctly set in the environment. In ICS & JB, dalvikvm requires LD_LIBRARY_PATH to

<think> 我们正在分析一个shell脚本片段,它来自于Android系统中的一个命令脚本。根据引用[1]和[2],这个脚本位于`/system/bin/input`,用于启动一个名为“input”的命令,该命令提供了一个非常基础的命令行shell功能。引用的代码片段如下: 5 base=/system 6 export CLASSPATH=$base/framework/input.jar 7 exec app_process $base/bin com.android.commands.input.Input "$@" 现在,我们将逐行解释这段代码: 1. `base=/system`:将变量`base`设置为`/system`。这意味着`base`变量指向系统的根目录下的`system`目录。 2. `export CLASSPATH=$base/framework/input.jar`:设置环境变量`CLASSPATH`为`$base/framework/input.jar`,即`/system/framework/input.jar`。这个jar文件包含了要执行Java类。`export`命令使得这个环境变量对后续执行的命令可见。 3. `exec app_process $base/bin com.android.commands.input.Input "$@"`:这是关键的一行,它使用`exec`命令来执行`app_process`程序。`exec`会替换当前shell进程为新的进程,也就是说,运行完这一行后,当前shell脚本就结束了,取而代之的是`app_process`进程。 - `app_process`:这是Android系统中的一个命令,用于启动一个Java应用程序。它位于系统的`/system/bin`目录下(因此可以直接调用)。 - `$base/bin`:即`/system/bin`,这是`app_process`命令的参数,指定了程序的启动目录(通常用于设置Java应用程序的工作目录)。 - `com.android.commands.input.Input`:这是要执行Java类的完整类名。这个类在`input.jar`中,而`input.jar`已经被设置到了`CLASSPATH`中。 - `"$@"`:这是一个特殊的shell变量,表示传递给当前脚本的所有参数。这里将这些参数原样传递给`com.android.commands.input.Input`类的`main`方法。 综上所述,这段shell脚本的作用是启动一个Java程序,这个Java程序的入口类是`com.android.commands.input.Input`,它位于`/system/framework/input.jar`中。该Java程序将接收并处理传递给脚本的所有命令行参数。 根据引用[2]中的描述,我们知道在Android系统中,有一些命令是用Java编写的(如input、settings),它们通过这种方式被封装成可以在终端中直接执行的命令。当用户在Android设备的shell中执行`input`命令时,实际上就是运行这个脚本,进而启动Java类`com.android.commands.input.Input`。 因此,这个脚本是Android系统提供的一个命令行工具,用于通过shell命令模拟输入事件(如按键、触摸、滑动等)。例如,我们可以使用`input keyevent KEYCODE_HOME`来模拟按下Home键。 **相关问题** 1. 如何在Android设备上使用`input`命令模拟触摸事件? 2. `app_process`命令在Android中还有哪些其他用途? 3. 如何查看Android系统`input`命令的源代码? </think> 这段代码是一个Android系统shell脚本片段,用于执行Java编写的`input`命令工具。具体解释如下: ### 逐行解析: 1. **`base=/system`** 定义环境变量`base`,指向Android系统目录`/system`。该目录包含系统核心组件(引用[3])。 2. **`export CLASSPATH=$base/framework/input.jar`** - 设置Java类路径:指向`/system/framework/input.jar`(Android框架层的JAR包) - `export`使变量对子进程生效,确保Java虚拟机能够找到所需类文件(引用[2])。 3. **`exec app_process $base/bin com.android.commands.input.Input "$@"`** - **`exec`**:替换当前shell进程,直接运行后续命令(节省资源) - **`app_process`**:Android专用命令,用于启动Java程序(替代传统`java`命令) - **`$base/bin`**:指定工作目录为`/system/bin`(系统命令存放位置) - **`com.android.commands.input.Input`**:Java入口类的全限定名 - **`"$@"`**:将所有传入脚本的参数原样传递给Java程序 ### 功能总结 这是一个**Android系统级的输入事件模拟工具**,核心功能包括: - 通过Java程序`com.android.commands.input.Input`执行 - 可模拟物理按键、触摸屏操作等(如`input keyevent KEYCODE_HOME`) - 属于Android底层命令工具,需在设备shell中运行(引用[1][2]) - 依赖`input.jar`提供的Java实现(而非原生二进制程序) ### 典型使用场景 ```bash adb shell input tap 100 200 # 模拟点击坐标(100,200) adb shell input keyevent 26 # 模拟电源键 adb shell input text "Hello" # 输入文本 ``` 此类命令常用于自动化测试、远程控制等场景(引用[3])。 --- ### 相关问题 1. `app_process`与标准Java命令(如`java`)在Android中有何区别? 2. 如何查看`input`命令支持的所有事件类型和参数格式? 3. 在非root设备上执行`input`命令可能遇到什么权限问题? 4. 能否通过`input.jar`扩展自定义输入事件功能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值