从Android应用程序运行bash脚本

时间:2015-08-05 08:18:04

标签: android bash shell

我想在xml中更改变量的值。该值基于editXml.sh读取的另一个文件。所以我需要在编译应用程序之前运行editXml.sh。

我尝试使用以下代码在MainActivity中运行脚本:

onCreate() {
......
execScript();
}

execScript(){
    try{
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("sh /.../editXml.sh");
    } catch(Throwable t)
    {
        t.printStackTrace();
    }

}

editXml.sh在我的本地,但是当我在Android工作室中运行应用程序时代码不起作用。(在本地工作)我应该把我的脚本放在应用程序中吗?应用程序的哪个部分?有什么建议吗?

3 个答案:

答案 0 :(得分:1)

试试这个。我已经测试了这段代码,但它确实有用。 让我们编写一个名为script.sh的脚本。

  1. 将文件script.sh放到项目的/ res / raw文件夹中。
  2. 使用以下代码。
  3. 构建apk。解包apk(这是通常的zip-archive)并确保文件/res/raw/script.sh存在。
  4. 在设备上安装apk并启动它。

        public static void executeCommandAndGetOutput(String command){
            BufferedReader reader = null;
            String result = "";
            try {
                Process p = Runtime.getRuntime().exec(command);
                reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null){
                    result += line + "\n";
                }
                p.waitFor();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(reader != null)
                    try {
                        reader.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
            Log.i("Test", result);
        } 
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String pathToScript = getDir("my_scripts", 0).getAbsolutePath() + File.separator + "script.sh";
    
            // Unpacking script to local filesystem
            InputStream in = getResources().openRawResource(R.raw.script);
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(pathToScript);
                byte[] buff = new byte[1024];
                int read = 0;
                while ((read = in.read(buff)) > 0) {
                out.write(buff, 0, read);
                }
            }
            catch(Exception e){
            }
            finally {
                try {
                    in.close();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            // Make script executable
            executeCommand("chmod 775 " + pathToScript);
            // Execute script
            executeCommand("sh " + pathToScript);
        }
    
    public static String getSystemCommandOutput(String command){
        BufferedReader reader = null;
        String result = "";
    
        try {
            Process p = Runtime.getRuntime().exec(command);
            reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    
            String line = null;
            while ((line = reader.readLine()) != null){
                result += line + "\n";
            }
    
            p.waitFor();
    
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeQuietly(reader);
        }
    
        return result;    
    } 
    

答案 1 :(得分:0)

您可以将脚本放在原始资源上,然后将其解压缩到Context.getDir(...)文件夹,并使用绝对路径从那里运行。

此外,您需要在执行前为此文件运行“chmod 775”(chmod + x)。

从raw复制文件的示例:Copying raw file into SDCard?您可以复制到app文件夹(Context.getDir(...))而不是sdcard

答案 2 :(得分:0)

控制台输出:

     58:07.979    8935-8935/cc.softwarefactory.lokki.android   E/MainActivity﹕ onCreate
     12:58:08.234    8935-8935/cc.softwarefactory.lokki.android E/MainActivity﹕ PATH: /data/data/cc.softwarefactory.lokki.android/app_my_scripts/editxml.sh
     12:58:08.258    8935-8935/cc.softwarefactory.lokki.android E/MainActivity﹕ result:
     12:58:08.287    8935-8935/cc.softwarefactory.lokki.android E/MainActivity﹕ result: not found

我改变了

 Log.i("Test", result) to Log.e(TAG,"result: " + result);