1. 新建自己的shell文件,或者中windows上传
  例如: d:\\x.sh

  #! /system/bin/sh
  #最简单的一个shell,没什么功能
  #需要注意的是必须是 #! /system/bin/sh开头(有空格)
  #和一般linux不同,如果用#!/bin/sh就会找不到(因为没有)

  在cmd中用adb push d:\\x.sh /data/kenshin上传shell
  第一个参数是本地文件位置,第二个是远程位置(也就是放在Android中的位置),在根目录的data目录下,kenshin是我自己创建的一个文件夹. 如果失败了,说是只有只读权限的话,需要修改文件夹的权限.具体如下:进入adb shell,使用mount命令查看挂了哪些块.

Java代码:
C:\Documents and Settings\Kenshintang>adb shell

# mount

mount

rootfs / rootfs ro 0 0

tmpfs /dev tmpfs rw,mode=755 0 0

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

proc /proc proc rw 0 0

sysfs /sys sysfs rw 0 0

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

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

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

/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:采用读写方式挂接设备
  具体的用法可以googlelinux命令mout的用法.
  上面那句话的意思就是让/system文件夹有读写的权限

  2. cd到shell所在的文件夹,查看x.sh的权限,一般上传上去的话是没有执行权限的,可以用ls -l查看使用chmod 777 x.sh增加权限,具体可以google chmod的用法.
  3. 执行 ./x.sh
  4. 如何在程序中执行shell

Java代码:

复制到剪贴板Java代码
  1. packageeoe.kenshin.hellocommand;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStream;
  5. importjava.io.InputStreamReader;
  6. importandroid.app.Activity;
  7. importandroid.os.Bundle;
  8. importandroid.widget.TextView;
  9. publicclassHelloCommandextendsActivity{
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. privateTextViewtv;
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. tv=(TextView)findViewById(R.id.tv01);
  17. try{
  18. execCommand("./data/kenshin/x.sh");
  19. }catch(IOExceptione){
  20. //TODOAuto-generatedcatchblock
  21. e.printStackTrace();
  22. }
  23. }
  24. publicvoidexecCommand(Stringcommand)throwsIOException{
  25. //startthelscommandrunning
  26. //String[]args=newString[]{"sh","-c",command};
  27. Runtimeruntime=Runtime.getRuntime();
  28. Processproc=runtime.exec(command);//这句话就是shell与高级语言间的调用
  29. //如果有参数的话可以用另外一个被重载的exec方法
  30. //实际上这样执行时启动了一个子进程,它没有父进程的控制台
  31. //也就看不到输出,所以我们需要用输出流来得到shell执行后的输出
  32. InputStreaminputstream=proc.getInputStream();
  33. InputStreamReaderinputstreamreader=newInputStreamReader(inputstream);
  34. BufferedReaderbufferedreader=newBufferedReader(inputstreamreader);
  35. //readthelsoutput
  36. Stringline="";
  37. StringBuildersb=newStringBuilder(line);
  38. while((line=bufferedreader.readLine())!=null){
  39. //System.out.println(line);
  40. sb.append(line);
  41. sb.append('\n');
  42. }
  43. tv.setText(sb.toString());
  44. //使用exec执行不会等执行成功以后才返回,它会立即返回
  45. //所以在某些情况下是很要命的(比如复制文件的时候)
  46. //使用wairFor()可以等待命令执行完成以后才返回
  47. try{
  48. if(proc.waitFor()!=0){
  49. System.err.println("exitvalue="+proc.exitValue());
  50. }
  51. }
  52. catch(InterruptedExceptione){
  53. System.err.println(e);
  54. }
  55. }
  56. }




原文地址: http://dev.10086.cn/cmdn/wiki/index.php?doc-view-7177.html

更多相关文章

  1. 测试为Android模拟器创建和管理sdcard image文件
  2. 聚焦 Android(安卓)11 : 隐私和安全
  3. Android集成百度定位SDK实现获取定位地址
  4. Android(安卓)WebView安全研究
  5. Android(安卓)定时器Timer的使用
  6. android的权限问题
  7. Android(安卓)组件安全
  8. Android如何关闭Application
  9. adb停止工作解决

随机推荐

  1. Android中Fragment生命周期
  2. android studio实时预览报错
  3. android 使用fastjson解析json数据
  4. cpp通过Message掉java
  5. android linker加载
  6. Android(安卓)更新API详细
  7. cordova platform add android 报错问题
  8. Android开源框架
  9. Android TouchEvent处理机制
  10. android使用Leaks检测内存泄漏