批量安装必须获取root权限后
String paramString = "adb push SVRadio.apk /system/app" +"\n"+ //
// "adb push SVSetUp.apk /system/app" +"\n"+
"adb shell" +"\n"+
"su" +"\n"+ //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">切换到 root 用户</span>
"mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system" +"\n"+ //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">让分区可写</span>
"cat /sdcard/SVRadio.apk > /system/app/SVRadio.apk" +"\n"+ //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">// 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。 </span>
// "cat /sdcard/SVSetUp.apk > /system/app/SVSetUp.apk" +"\n"+
"mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system" +"\n"+ //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">// 还原分区属性,只读。</span>
"exit" +"\n"+
"exit";
if(RootCmd.haveRoot()){
if(RootCmd.execRootCmdSilent(paramString)==-1){
Toast.makeText(MainActivity.this, "安装不成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this, "安装成功", Toast.LENGTH_LONG).show();
String paramString2= "adb root" +"\n"+
"adb shell" +"\n"+
"su" +"\n"+
"mount -o remount rw /system"+"\n"+
"chmod 777 /system/app/SVRadio.apk"+"\n"+
// "chmod 777 /system/app/SVSetUp.apk"+"\n"+
"exit" +"\n"+
"exit";
if(RootCmd.execRootCmdSilent(paramString2)==-1){
Toast.makeText(MainActivity.this, "授权不成功", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(MainActivity.this, "授权成功可重启", Toast.LENGTH_LONG).show();
}
//
}
}else{
Toast.makeText(MainActivity.this, "没有root权限", Toast.LENGTH_LONG).show();
}
<pre name="code" class="java">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;
}
}