1.判断设备是否有root权限
public static boolean hasRootPermission(){
boolean result = false ;
try {
result = new File("/system/bin/su" ).exists() || new File("/system/xbin/su" ).exists();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
2.静默安装
这里要用exec("sh")而不是exec("su")!!!!!!!!!!!!!!!
参考了很多静默安装的文章,不是要root权限或者Android源码环境,就是需要使用反射packageManager.installPackage(...)方法,但是该方法需要aidl文件,而导入相应的aidl文件又往往一堆报错。使用pm install -r 命令进行安装的方法也往往失败,区别就在su和sh这里。
public static boolean silentInstall(String apkPath){
boolean result = false ;
Process process = null ;
OutputStream out = null ;
try {
process = Runtime.getRuntime ().exec("sh" );
out = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(out);
dataOutputStream.writeBytes("chmod 777 " + apkPath + " \n " );
dataOutputStream.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " + apkPath);
dataOutputStream.flush();
dataOutputStream.close();
out.close();
int value = process.waitFor();
if (value == 0 ) {//成功
result = true ;
} else if (value == 1 ) { // 失败
result = false ;
} else { // 未知情况
result = false ;
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return result;
}
3.在manifest文件中加入权限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
4.使用adb工具把apk安装到system/app/路径下(安装于该路径下的应用,可以相应的权限)
方法如下:
adb push appmarket.apk /sdcard/ // 上传要安装的文件,为安装做准备。
adb shell
su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
mount //显示当前mount情况
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
cat /sdcard/appmarket.apk > /system/app/appmarket.apk // 安装
mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
exit
exit
5.大功告成