標籤:android style blog http io color ar os sp
有時候我們需要軟體實現靜默安裝,但是Android並未提供相應的API,然而我們知道命令列安裝android的時候是不會提示使用者的,所有要實現這個功能,我們就可以從執行命令列的方式實現。android提供的安裝命令是
- pm install package
- ps : pm install /sdcard/android.apk
?
但是執行這個命令需要前提條件,需要是系統級應用或者具有ROOT許可權。我們先介紹通過ROOT許可權的方式執行。
1,通過擷取ROOT許可權靜默安裝APK
看代碼:
new Thread() { public void run() { Process process = null; OutputStream out = null; InputStream in = null; try { // 請求root process = Runtime.getRuntime().exec("su"); out = process.getOutputStream(); // 調用安裝 out.write(("pm install -r " + currentTempFilePath + "\n").getBytes()); in = process.getInputStream(); int len = 0; byte[] bs = new byte[256]; while (-1 != (len = in.read(bs))) { String state = new String(bs, 0, len); if (state.equals("Success\n")) { //安裝成功後的操作 } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.flush(); out.close(); } if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } } }.start();
當然也可以通過NDK實現,代碼就不放了。
第二種方式,同樣是通過pm命令實現,不用請求ROOT,但是需要系統的簽名。這裡附上模擬器的的簽名,用這個簽名的APK安裝在模擬器上可以實現不請求ROOT而靜默安裝的效果。
?
//首先在manifest標籤加入屬性 android:sharedUserId="android.uid.system" new Thread() { public void run() { Process process = null; InputStream in = null; try { // 請求root process = Runtime.getRuntime(). exec("pm install -r " + currentTempFilePath + "\n"); in = process.getInputStream(); int len = 0; byte[] bs = new byte[256]; while (-1 != (len = in.read(bs))) { String state = new String(bs, 0, len); if (state.equals("Success\n")) { //安裝成功後的操作 } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } } }.start();
Android 靜默安裝