先说一下实现逻辑,首先手机必须root权限,然后静默安装apk,在通过广播的形式启动安装的apk。
静默安装方法,返回值是0代表成功,1失败,其他不知 方法一:
//cmd =apk存储路径PRotected int excuteSuCMD(String cmd) {PrintWriter PrintWriter = null; Process process = null; try { process = Runtime.getRuntime().exec("su"); PrintWriter = new PrintWriter(process.getOutputStream()); PrintWriter.println("chmod 777 " + cmd); PrintWriter .println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib"); PrintWriter.println("pm install -r " + cmd); // PrintWriter.println("exit"); PrintWriter.flush(); PrintWriter.close(); int value = process.waitFor(); Log.e("File.toString()====value=静默安装返回值===", "" + value); return (Integer)value; } catch (Exception e) { e.printStackTrace(); return -1; } finally { if (process != null) { process.destroy(); } } }方法二:
//cmd ="pm install -r "+apk存储路径protected int excuteSuCMD(String cmd) { try { //手机必须root Process process = Runtime.getRuntime().exec("su");// (这里执行是系统已经开放了root权限,而不是说通过执行这句来获得root权限) DataOutputStream dos = new DataOutputStream( (OutputStream) process.getOutputStream()); // 部分手机Root之后Library path 丢失,导入path可解决该问题 dos.writeBytes((String) "export LD_LIBRARY_PATH=/vendor/lib:/system/lib/n"); cmd = String.valueOf(cmd); dos.writeBytes((String) (cmd + "/n")); dos.flush(); dos.writeBytes("exit/n"); dos.flush(); process.waitFor(); int result = process.exitValue(); System.out.println("静默安装命令1:" + result); return (Integer) result; } catch (Exception localException) { localException.printStackTrace(); return -1; } }静默安装成功之后,当前程序会自动退出,如果需要在自启动,必须借助广播。 注意:小编在这遇到一个问题,静默安装要都是debug版本,或者release版本,不能混淆
广播通知: 在androidManifest.xml中注册广播
<receiver android:name=".UpdateReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package"/> </intent-filter> </receiver>public class UpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){ Toast.makeText(context,"升级了一个安装包,重新启动此程序", Toast.LENGTH_SHORT).show(); Intent intent2 = new Intent(context, SplashActivity.class); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent2); } //接收安装广播 if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) { String packageName = intent.getDataString(); System.out.println("安装了:" +packageName + "包名的程序"); } //接收卸载广播 if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) { String packageName = intent.getDataString(); System.out.println("卸载了:" + packageName + "包名的程序"); } }}注:PACKAGE_REPLACED—-替换apk PACKAGE_ADDED—添加apk PACKAGE_REMOVED–删除apk 一般添加,删除apk中,广播基本不会实现
参考文章为:http://blog.csdn.net/QQ_29716061/article/details/51602173 http://blog.csdn.net/wan_ing/article/details/53407748
新闻热点
疑难解答