android写入system

package  com.sfer.install;
import  java.io.DataInputStream;
import  java.io.DataOutputStream;
import  java.io.InputStream;
import  java.io.OutputStream;
 
public  final  class  RootCmd {
     // 执行linux命令并且输出结果
     protected  static  String execRootCmd(String paramString) {
         String result =  "result : " ;
         try  {
             Process localProcess = Runtime.getRuntime().exec( "su " ); // 经过Root处理的android系统即有su命令
             OutputStream localOutputStream = localProcess.getOutputStream();
             DataOutputStream localDataOutputStream =  new  DataOutputStream(
                     localOutputStream);
             InputStream localInputStream = localProcess.getInputStream();
             DataInputStream localDataInputStream =  new  DataInputStream(
                     localInputStream);
             String str1 = String.valueOf(paramString);
             String str2 = str1 +  "\n" ;
             localDataOutputStream.writeBytes(str2);
             localDataOutputStream.flush();
             String str3 =  null ;
//            while ((str3 = localDataInputStream.readLine()) != null) {
//                Log.d("result", str3);
//            }
             localDataOutputStream.writeBytes( "exit\n" );
             localDataOutputStream.flush();
             localProcess.waitFor();
             return  result;
         catch  (Exception localException) {
             localException.printStackTrace();
             return  result;
         }
     }
 
     // 执行linux命令但不关注结果输出
     protected  static  int  execRootCmdSilent(String paramString) {
         try  {
             Process localProcess = Runtime.getRuntime().exec( "su" );
             Object localObject = localProcess.getOutputStream();
             DataOutputStream localDataOutputStream =  new  DataOutputStream(
                     (OutputStream) localObject);
             String str = String.valueOf(paramString);
             localObject = str +  "\n" ;
             localDataOutputStream.writeBytes((String) localObject);
             localDataOutputStream.flush();
             localDataOutputStream.writeBytes( "exit\n" );
             localDataOutputStream.flush();
             localProcess.waitFor();
             int  result = localProcess.exitValue();
             return  (Integer) result;
         catch  (Exception localException) {
             localException.printStackTrace();
             return  - 1 ;
         }
     }
 
     // 判断机器Android是否已经root,即是否获取root权限
     protected  static  boolean  haveRoot() {
 
         int  i = execRootCmdSilent( "echo test" );  // 通过执行测试命令来检测
         if  (i != - 1 ) {
             return  true ;
         }
         return  false ;
     }
 
}

package  com.sfer.install;
 
import  android.app.Activity;
import  android.os.Bundle;
import  android.widget.Toast;
 
public  class  InstallActivity  extends  Activity {
     /** Called when the activity is first created. */
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         String paramString=  "$ adb push MySMS.apk /sdcard/"  + "\n" +
                 "$ adb shell"  + "\n" +
                 "$ su"  + "\n" +
                 "# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system"  + "\n" +
                 "# cat /sdcard/MySMS.apk > /system/app/MySMS.apk"  + "\n" +
                 "# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system"  + "\n" +
                 "# exit"  + "\n" +
                 "$ exit" ;        
         if (RootCmd.haveRoot()){
             if (RootCmd.execRootCmdSilent(paramString)==- 1 ){
                 Toast.makeText( this "安装不成功" , Toast.LENGTH_LONG).show();
             } else {
                 Toast.makeText( this "安装成功" , Toast.LENGTH_LONG).show();
             }
         } else {
             Toast.makeText( this "没有root权限" , Toast.LENGTH_LONG).show();
         }
         
         
     }
}



找到原因了  在代码里执行把那个字符串改成这样就行了
Java code
?
1
2
3
4
5
6
7
8
String paramString=  "adb push MySMS.apk /system/app"  + "\n" +
                 "adb shell"  + "\n" +
                 "su"  + "\n" +
                 "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system"  + "\n" +
                 "cat /sdcard/MySMS.apk > /system/app/MySMS.apk"  + "\n" +
                 "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system"  + "\n" +
                 "exit"  + "\n" +
                 "exit" ;
把代码中想安装的APK名字改成自己的 把需要安装的APK放到/sdcard 根目录  有什么问题交流交流

========================================================================================================
安卓的系统一般会有4个重要的分区:boot,system,cache,data。system分区存放的是系统应用(system app)和系统所需要的库文件(lib/*.so),而大家平时安装的软件是装到data分区(用户区)的。装在system区的就是系统应用,data分区的是用户应用。应用程序都安装在/app子目录下。

  但是,不管是系统应用还是用户应用,安卓会建立缓存以加速应用的启动,该缓存是在/data/dalvik-cache下面。注意了,是在data分区上的,所以应用安装的越多,data分区可用的空间就越少。

  一般ROOT之后,我们会删除/卸载部分系统的应用,从而system分区就空出了部分的空间,尤其是定制机,删了系统应用之后,会空出多达60M的空间。假如本身机器的ROM比较小,data分区不够用的话,就最好把部分的app移动到system空间,当然一旦移动到了system分区,就是系统应用了!

 

好,下面介绍哪些应用是可以移动到system分区的:

1) 开机就要启动的程序,比如权限管理啊,Widget啊。

2) 常常用到的程序,比如文件管理器。

3) 一些不会有内存驻留的小程序,比如autostarts,SD Maid啊。

 

有一些应用是不适合移动到system空间的:

1) 退出仍然会驻留内存的程序(比如数米基金宝),因为这些程序一旦变成了system应用,杀进程的软件就拿他们没办法了。

2) 应用程序内含lib库的,这个可以用压缩工具(windows下的zip工具、安卓下的ES文件管理器、RootExplorer)查看该apk,假如内部有lib文件夹的,里面有*.so文件的,那就说明他用到了这些lib。当然,若硬要移动到system空间也是可以的,只要把lib/*.so拷贝到system/lib下即可,但是本人觉得一是会造成重复,二是将来维护起来比较麻烦。不过有一法,可以在system/app下面建立文件夹,把*.so拷贝到该文件夹下,然后通过链接文件的方式将其拷贝到lib下。(这个我没试过)

 

移动方法:

1) 将该apk先卸载,然后将apk文件拷贝到system/app下,修改权限,有必要的话,重启一下。这样做的好处是,该软件的缓存会在卸载是自动删除。

2) 为防止有些应用卸载后数据丢失,可以不卸载,方法是:将apk拷贝到system/app下,然后删除data/app的apk,最后手动把/data/dalvik-cache/下该程序的缓存清除。

3) 假如要移动的应用太多,可以进入recovery,清除一下dalvik-cache,让启动的时候自动再生成cache。

 

 

附:
1. 查看各个分区的使用情况:http://blog.csdn.net/puncha/article/details/7670727

 

其他资料:

在 Android 中,如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到 /system/app/ 下。

一般手机/system目录是mount成只读的,所以我们需要重新mount成读写的

下面以 SecureSetting.apk 为例,演示这个操作。需要准备一台已经获得 Root 权限的手机。

1、通过 USB 连接手机和电脑。

2、使用 adb 控制手机。


[Java]  view plain copy
  1. $ adb push SecureSetting.apk /sdcard/  // 上传要安装的文件,为安装做准备。  
  2. nbsp;$ adb shell $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。  
  3. # mount //显示当前mount情况  
  4. nbsp;# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。   
  5. # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。   
  6. # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。   
  7. # exit $ exit  

你可能感兴趣的:(android写入system)