使用安卓应用运行脚本

8

我有这个shell脚本:

#!system/bin/sh
while :
do
sync
echo 3> /proc/sys/vm/drop_caches
echo "Script is been launched"
sleep 30m
done
exit 0;

我希望能在Android应用程序中运行此脚本。目前,我已经创建了一个仅包含Toast的按钮。我该如何使用应用程序上的按钮来获取脚本(free.sh)并启动它?或者是否有将代码重写为Java的解决方案?谢谢

4个回答

2
首先,您将使用Eclipse创建一个简单的Android Hello World应用程序,并在布局中添加一个按钮。这是Android开发的非常初步的实践,您可以从http://d.android.com深入挖掘更多内容。
请在按钮的OnClick回调函数中尝试此代码:
Button b = findViewById(R.id.buttonPower);

b.setOnClickListener(new OnClickListener() {

       @Override
       public void onClick(View arg0) {
            Process p=null;
            try {
               p = new ProcessBuilder()
                    .command("PathToYourScript")
                    .start();
             } catch (IOException e) {
                e.printStackTrace();
             } finally {
                if(p!=null) p.destroy();
             }
        }
 });

现在我正在工作,所以当我回家时会尝试。因此,在PATH_TO_YOUR_SH_SCRIPT中,例如sdcard/free.sh,但在VAR_FOR_YOUR_SCRIPT中呢?还有没有其他方法可以使用另一个按钮停止shell?非常感谢您的答复。 - Atlas91
很抱歉,由于文件系统不允许您为文件授予任何X权限,因此您无法将shell脚本放在SDCARD上。您最好将文件放在自己的缓存目录中,默认情况下位于/data/data/com.yourpackage.name/files。如果您的脚本不需要任何参数,请传递空字符串:" "。 - Robin
嗯,现在shell已经在sdcard上了,如果我尝试使用终端模拟器运行它,就可以了。然而,如果不起作用,我会更改路径。但是我仍然不明白在VAR_FOR_YOUR_SCRIPT行上放什么。你指的是VAR_FOR_YOUR_SCRIPT是什么意思? - Atlas91
请直接参考 Android 开发者网站,以获取有关 java.lang.process 使用的参考信息。 - Robin
1
好的,我会看一下这些,但我只想问一件事,VAR_FOR_YOUR_SCRIPT是什么? - Atlas91

1

以下是如何在您的Android应用程序中运行shell脚本的方法:

try {
       Process process = Runtime.getRuntime().exec("sh /sdcard/test.sh");
       BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
       String listOfFiles = "";
       String line;
       while ((line = in.readLine()) != null) {
                listOfFiles += line;
       }
 }
 catch (IOException e) {
       e.printStackTrace();
 }

0

我的代码出现了错误:

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.example.toast.R;

public class MainActivity extends Activity {

    private Button button;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab1);

        button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Process process = new ProcessBuilder()
                .command("PATH")
                .redirectErrorStream(true)
                .start();
                try {
                    InputStream in = process.getInputStream();
                    OutputStream out = process.getOutputStream();
                    readStream(in);// Here: Syntax error, insert "}" to complete `Block`

                finally {
                    process.destroy();
                }
            }
        }
        }); //Here: Syntax error on token "}", delete this token
    }

    protected void readStream(InputStream in) {
        // TODO Auto-generated method stub
    }
}

是的,我的示例代码与Android开发者网站上的代码相同,您可以轻松手动修复它。我的意思是,您还有其他错误吗? - Robin
还没有解决 xD。但是我真的无法解决这个问题。而且我不知道如何查看脚本是否实际运行。 - Atlas91
总是出现相同的错误...你能帮我调试代码吗?我真的无法解决它。 - Atlas91
我发布的那段代码.. 我已经两天找不到错误了。我无法修复它.. 记住,我是一个 Android 的新手开发者,所以无法看到和修复一些错误是很正常的。 - Atlas91
如果你需要的话,我的电子邮件是davide.dellai@hotmail.it - Atlas91

0

好的,现在没有错误(谢谢!),但是什么也没发生...为了尝试,我编写了一个简单的脚本来写入一个file.txt文件。请看代码:

public class MainActivity extends Activity {


    private Button button;

    public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         setContentView(R.layout.tab1);

         button = findViewById(R.id.button1);
         button.setOnClickListener(new OnClickListener() {
        
              @SuppressLint("SdCardPath")
              @Override
              public void onClick(View arg0) {
                    Process p=null;
                    try {
                         p = new ProcessBuilder()
                              .command("/sdcard/Script/scritturafile.sh")
                              .start();
                     } catch (IOException e) {
                          e.printStackTrace();
                     } finally {
                         if(p!=null) p.destroy();
                     }
               }
          });
     }
}

没有错误,但是当我按下按钮时,我认为shell没有运行,因此没有创建file.txt文件。


这是日志的一部分:W/System.err(15320): java.io.IOException: Error running exec(). Command: [/sdcard/Script/scritturafile.sh] Working Directory: null Environment。 - Atlas91
  1. 你应该先尝试执行 /system/bin/sh 命令,并重定向输入/输出,将你的脚本写入其输入流中。
  2. 即使你已经声明了写入外部存储的权限,也不代表你的子进程拥有该权限。因此,如果你需要特殊权限,可以尝试其他方法。
- Robin
我尝试了另一种方式...看这里: http://stackoverflow.com/questions/15909530/drop-caches-by-app-doesnt-work 。现在我可以直接从Java编写Bash代码,但不是我想要的xD。创建目录、写入文件txt或其他文件没有问题,但是我想要的(echo 3 > /proc/sys/vm/drop_caches)不行。你能看一下吗?我认为我已经快达到我的目标了,但还缺少一些东西!真的很抱歉,我向你保证我会请你喝啤酒的哈哈 :) - Atlas91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接