我一直在尝试Android终端模拟器Termux。
这是一个出色的应用程序,它无需根访问权限即可访问Android操作系统。
我想要实现的是从安装在同一设备上的另一个Android应用程序中在Termux中执行脚本/命令。
我相信Termux曾经允许通过意图执行Tasker任务,但是现在情况似乎并非如此。
是否可以通过Termux(或其他任何此类应用程序)从另一个Android应用程序执行一组命令脚本。
或...
是否可以在Android应用程序中访问底层的Android操作系统并执行脚本?
更新
当我从Android应用程序执行此代码时
try {
ProcessBuilder pb = new ProcessBuilder("pkg", "install -y", "ffmpeg python");
final Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
Log.d(TAG, "onCreate(2): " + line);
}
} catch (Exception ex) {
Log.e(TAG, "onCreate: ", ex);
}
我收到此错误消息
java.io.IOException: Cannot run program "pkg": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
at org.home.assignment.shell.MainActivity.commandThree(MainActivity.java:32)
at org.home.assignment.shell.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3243)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3407)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7343)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933)
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
at java.lang.ProcessImpl.start(ProcessImpl.java:141)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at org.home.assignment.shell.MainActivity.commandThree(MainActivity.java:32)
at org.home.assignment.shell.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3243)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3407)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7343)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:933)
但是com.termux
可以执行这样的命令。如何获得在我的应用程序中执行这些命令的权限?
答案 0 :(得分:1)
据我所试,它有效。我认为应该这样做,因为有多少Linux GUI应用程序通过发出shell命令来完成某些工作。
为确保起见,我尝试在旧的,低端,无根的Android 6.0手机上将香草命令的输出发布到Logcat
上,并且它可以正常工作(下面的工作代码)。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] cmd = new String[]{"ls", "-la", "/"};
try {
// These two lines are what we care about
Process process = Runtime.getRuntime().exec(cmd);
InputStream iStream = process.getInputStream();
// This is how we check whether it works
tryWriteProcessOutput(iStream);
} catch (IOException e) {
e.printStackTrace();
}
}
private void tryWriteProcessOutput(InputStream iStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
String output = "";
String line;
try {
while ((line = reader.readLine()) != null) {
output += line + "\n";
}
} catch (IOException e) {
e.printStackTrace();
} finally {
reader.close();
}
Log.d("cmdOutput", output);
}
}
但是,您的里程在这里可能会有很大差异。对于这么多Android制造商,我希望在不同设备上使用不同版本的命令外壳,因此,我不希望每台Android设备都能够运行我向它抛出的任何命令,除非这是一个非常普遍的命令。
此外,您可能还会遇到命令本身而不是命令外壳(即busybox: Permission denied
)的系统权限问题。
答案 1 :(得分:1)
Termux是一个终端仿真器,但无法访问Android OS中的所有内容。最终它是一个应用程序,并且将面临与Android中其他任何应用程序一样的限制。 APT
,pkg
和其他软件包安装程序或软件包已安装在模拟器中,但没有在系统范围内安装。另外,某些命令将具有与您的情况类似的限制,例如pm
仅可以用root或adb shell
来执行,因为允许其用户ID执行此类操作,而其他应用则不允许。意味着运行命令pm install -r -t someapp.apk
会在Termux中产生错误,但是如果使用adb shell
或具有root权限肯定可以运行。
为了使情况更加清楚,在Termux中运行命令echo $PATH
将显示仅包含Termux命令的目录,它们不是Android OS命令,而是可以在Android OS上运行的已编译软件包。这是一种很好的方式,就像在顶级Android上运行内容一样,无需处理很多限制,更像是沙盒环境。安装某些需要从沙箱中删除的软件包会遇到问题,因此请注意这一点。