apk中啟動一個shell指令碼

來源:互聯網
上載者:User

JAVA中,可以調用execCommand方法運行shell指令碼,以下是一個例子:

1. #! /system/bin/sh

2. #最簡單的一個shell,沒什麼功能

3. #需要注意的是必須是 #! /system/bin/sh開頭(有空格)

4. #和一般linux不同,如果用#!/bin/sh就會找不到(因為沒有)

5. ls

複製代碼

在cmd中用adb push d:\\x.sh /data/ziyouku上傳shell

第一個參數是本地檔案位置,第二個是遠程位置(也就是放在android中的位置),在根目錄的data目錄下,ziyouku是我自己建立的一個檔案夾. 如果失敗了,說是只有唯讀許可權的話,需要修改檔案夾的許可權.具體如下:

進入adb shell,使用mount命令查看掛了哪些塊.

1. C:\Documents and Settings\Ziyoukutang>adb shell

2. # mount

3. mount

4. rootfs / rootfs ro 0 0

5. tmpfs /dev tmpfs rw,mode=755 0 0

6. devpts /dev/pts devpts rw,mode=600 0 0

7. proc /proc proc rw 0 0

8. sysfs /sys sysfs rw 0 0

9. tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0

10. /dev/block/mtdblock0 /system yaffs2 ro,noatime,nodiratime 0 0

11. /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0

12. /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0

複製代碼

比如/dev/block/mtdblock0 /system就是唯讀,/dev/block/mtdblock1 /data是讀寫的

修改讀寫權限用mount命令

例如 mount -t yaffs2 -o remount,rw,noatime,nodiratime /dev/mtdblock0 /system

-o選項用來描述裝置或者檔案的掛接方式,常用的有

loop:用來把一個檔案當成硬碟分區掛接上系統

ro:採用唯讀方式掛接裝置

rw:採用讀寫方式掛接裝置

具體的用法可以google linux命令mout的用法.

上面那句話的意思就是讓/system檔案夾有讀寫的許可權

2. cd到shell所在的檔案夾,查看x.sh的許可權,一般上傳上去的話是沒有執行許可權的,可以用ls -l查看

使用chmod 777 x.sh增加許可權,具體可以google chmod的用法.

3. 執行 ./x.sh

4. 如何在程式中執行shell

1. package com.ziyouku.hellocommand;

2.

3. import java.io.BufferedReader;

4. import java.io.IOException;

5. import java.io.InputStream;

6. import java.io.InputStreamReader;

7. import android.app.Activity;

8. import android.os.Bundle;

9. import android.widget.TextView;

10.

11. public class HelloCommand extends Activity {

12. /** Called when the activity is first created. */

13. private TextView tv;

14.

15. @Override

16. public void onCreate(Bundle savedInstanceState) {

17. super.onCreate(savedInstanceState);

18. setContentView(R.layout.main);

19. tv = (TextView)findViewById(R.id.tv01);

20.

21.

22. try {

23. execCommand("./data/ziyouku/x.sh");

24. } catch (IOException e) {

25. // TODO Auto-generated catch block

26. e.printStackTrace();

27. }

28. }

29.

30. public void execCommand(String command) throws IOException {

31.

32. // start the ls command running

33. //String[] args = new String[]{"sh", "-c", command};

34. Runtime runtime = Runtime.getRuntime();

35. Process proc = runtime.exec(command); //這句話就是shell與進階語言間的調用

36. //如果有參數的話可以用另外一個被重載的exec方法

37.

38. //實際上這樣執行時啟動了一個子進程,它沒有父進程的控制台

39. //也就看不到輸出,所以我們需要用輸出資料流來得到shell執行後的輸出

40. InputStream inputstream = proc.getInputStream();

41. InputStreamReader inputstreamreader = new InputStreamReader(inputstream);

42. BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

43.

44. // read the ls output

45.

46. String line = "";

47. StringBuilder sb = new StringBuilder(line);

48. while ((line = bufferedreader.readLine()) != null) {

49. //System.out.println(line);

50. sb.append(line);

51. sb.append('\n');

52. }

53.

54. tv.setText(sb.toString());

55.

56. //使用exec執行不會等執行成功以後才返回,它會立即返回

57. //所以在某些情況下是很要命的(比如複製檔案的時候)

58. //使用wairFor()可以等待命令執行完成以後才返回

59. try {

60. if (proc.waitFor() != 0) {

61. System.err.println("exit value = " + proc.exitValue());

62. }

63. }

64. catch (InterruptedException e) {

65. System.err.println(e);

66. }

67. }

68. }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.