项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!!
发就发吧!
一、关于shell指令:
我们知道,shell指令是Linux里面带的指令,指令是分权限的,所以需要根据你的具体指令看需不需要有系统权限;
二、权限介绍:
如果不需要root权限的shell指令那可以直接通过Android提供的exec发送,如果需要root权限,有两种操作方式:
1、标准做法或者说是推荐做法:
a、为APP添加
android:sharedUserId="android.uid.system"
b、用系统签名签APP(关于如何签名,参考:http://gqdy365.iteye.com/blog/2111949)
c、将签名好的apppush到system/app/目录下,重启;
这里可以使用exec正常发送任何指令;
2、屌丝做法:
设备获取root权限,APP运行时授予root权限;
发送时用exec("su")发送;
这种方法在调试阶段是很有用的。第一种方法调试会很多蛋疼的;
三、参考代码:
Process process = null;
DataOutputStream os = null;
public void sendTest(String command){
if (command == null) {
return;
}
try {
if(null==process){
// process = Runtime.getRuntime().exec("sh");//系统签名,push到app目录下用这个这个
process = Runtime.getRuntime().exec("su");//有root权限的用这个;
os = new DataOutputStream(process.getOutputStream());
}
if (MyLog.isDyeLevel()) {
MyLog.log("lcd", MyLog.DYE_LOG_LEVEL, "execCommand :" + command);
}
os.write(command.getBytes());
os.writeBytes("\n");
os.flush();
}catch(Exception e){
e.printStackTrace();
}
}
上面代码记得在不发送时关闭流;
我程序中需要实时发送,所以定义了全局变量,大家可以如果不需要实时发送,就定义局部变量;
下面片段是摘自Trinea的博客(http://www.trinea.cn/android/android-java-execute-shell-commands/)但存在一个问题:阻塞式的,会造成系统卡顿,不推荐使用;
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = null;
StringBuilder errorMsg = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
os = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
continue;
}
// donnot use os.writeBytes(commmand), avoid chinese charset error
os.write(command.getBytes());
os.writeBytes(COMMAND_LINE_END);
os.flush();
try {
} catch (Exception e) {
e.printStackTrace();
}
}
os.writeBytes(COMMAND_EXIT);
os.flush();
result = process.waitFor();
// get command result
if (isNeedResultMsg) {
successMsg = new StringBuilder();
errorMsg = new StringBuilder();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
分享到:
相关推荐
Android Debug Bridge(ADB)就是一个强大的工具,允许开发者从计算机上对连接的Android设备进行各种操作,包括发送shell命令。本篇将深入探讨如何在APK程序中执行Adb shell命令以及它与高级语言之间的调用关系。 ...
2. **Runtime.exec()**:在Android应用程序中,可以通过Java的Runtime类的exec()方法来执行shell命令。例如: ```java Process process = Runtime.getRuntime().exec("ls /sdcard"); ``` 这将在设备上执行`ls /...
1. 一个Android应用程序:用于在设备上运行shell命令并建立反向TCP连接。 2. 服务器端脚本:可能是用Python、Node.js或其他语言编写,用于接收并处理来自Android设备的连接请求。 3. Android源码:可能包括Java或...
通过本文的介绍,我们不仅了解了`am`命令的基本用法,还深入探讨了如何使用该命令启动Android应用程序中的Activity。这对于从事Android开发工作的工程师来说是非常实用的知识点。掌握这些技巧有助于提高开发效率和...
ADB Shell 是 ADB 的一部分,通过它可以发送 Shell 命令到 Android 设备上执行。这使得开发者可以在设备上执行各种任务,例如安装应用、启动应用程序、查看系统日志等。ADB Shell 对于 Android 开发者来说是非常重要...
5. **发送shell命令**:一旦连接建立,就可以通过`adb -d shell <command>`来向目标设备发送shell命令,其中`-d`参数指代USB设备。例如,`adb -d shell pm list packages`将列出目标设备上的所有应用程序包名。 6. ...
它主要用于Android设备与计算机之间的通信,为开发者提供了一种高效的方式来调试和管理Android应用程序。通过ADB,开发者能够执行一系列操作,包括但不限于安装和调试应用、访问设备Shell、管理端口转发、文件传输、...
在Android Shell中模拟事件是调试和测试应用程序的一种常见方法,特别是对于那些需要手动触发特定用户输入行为的场景。本文将详细介绍如何使用Android Shell来模拟各种输入事件,包括长按、单击和滑动。 1. **基本...
`am`命令是Android系统中用于控制应用程序生命周期、启动活动、广播接收者等的核心工具。以下是一些常用`am`命令示例: - `am start`: 启动一个Activity。 - `am startservice`: 启动一个Service。 - `am stop...
因此,我们可以采用其他方式,如使用Runtime类执行shell命令来启动、停止和管理nginx进程。 4. **编写启动脚本**:创建一个简单的启动脚本,定义nginx的配置文件路径、工作目录等。配置文件应适应Android环境,比如...
在Android应用开发中,测试是确保产品质量和用户体验的关键环节。Android提供了多种测试工具和技术,以支持开发者进行不同层次和类型的测试。以下是对这些工具的详细解释: 1. **Instrumentation测试框架**:这是...
在Android shell下,你可以使用`iwlist <interface>`命令来查看当前可用的无线网络信息,包括SSID、频道、加密方式等。`<interface>`通常是指无线网卡的名称,如`wlan0`。 2. **iwconfig**: `iwconfig`是另一个与...
Termux是一个强大的开源应用程序,它为Android设备提供了完整的终端模拟器和Linux环境。这个工具对于开发者、爱好者和任何想要在移动设备上运行命令行工具的人来说都是一个宝贵的资源。Termux不仅可以让用户在...
在Android开发和调试过程中,掌握基本的Shell命令是至关重要的,因为它们可以帮助开发者高效地管理设备和模拟器。以下是一些关键的Android Shell命令及其用途的详细解释: 1. **getprop**:这个命令用于获取Android...
`adb (Android Debug Bridge)`是Android开发者常用的一个工具,它能让你通过USB或网络连接在PC上与Android设备进行通信,包括发送shell命令、安装应用、查看设备状态等。 在命令行中,你可以使用`adb shell`命令...
在Android开发中,广播(Broadcast)是一种非常重要的组件,它允许应用程序之间进行异步通信,即使它们在后台运行。`adb`(Android Debug Bridge)是Android开发者常用的工具,用于调试和控制连接到计算机的Android...
- 数据备份脚本可帮助用户安全地备份设备上的应用程序数据、联系人、短信等重要信息。这通常通过ADB的`pull`命令实现,将设备上的文件复制到电脑上。 - 恢复脚本则可以将之前备份的数据推送到设备上,使用`push`...
本文档旨在全面解析iApp开发中涉及的Shell命令,这些命令对于Android系统的管理、维护及应用开发有着至关重要的作用。通过掌握这些命令,开发者可以更加高效地进行调试、性能优化以及实现特定功能。 #### 修改系统...