有时候我们需要软件实现静默安装,但是Android并未提供相应的API,然而我们知道命令行安装android的时候是不会提示用户的,所有要实现这个功能,我们就可以从执行命令行的方式实现。android提供的安装命令是

  1. pm install package 
  2. ps : pm install /sdcard/android.apk 

 

但是执行这个命令需要前提条件,需要是系统级应用或者具有ROOT权限。我们先介绍通过ROOT权限的方式执行。

1,通过获取ROOT权限静默安装APK
看代码:

  1. new Thread() { 
  2.     public void run() { 
  3.     Process process = null
  4.     OutputStream out = null
  5.     InputStream in = null
  6.     try { 
  7.     // 请求root 
  8.     process = Runtime.getRuntime().exec("su");  
  9.     out = process.getOutputStream(); 
  10.     // 调用安装 
  11.     out.write(("pm install -r " + currentTempFilePath + "\n").getBytes()); 
  12.     in = process.getInputStream(); 
  13.     int len = 0
  14.     byte[] bs = new byte[256]; 
  15.     while (-1 != (len = in.read(bs))) { 
  16.     String state = new String(bs, 0, len); 
  17.     if (state.equals("Success\n")) { 
  18.        //安装成功后的操作 
  19.          } 
  20.        } 
  21.     } catch (IOException e) { 
  22.         e.printStackTrace(); 
  23.     } catch (Exception e) { 
  24.         e.printStackTrace(); 
  25.     } finally { 
  26.         try { 
  27.             if (out != null) { 
  28.                 out.flush(); 
  29.                 out.close(); 
  30.             } 
  31.             if (in != null) { 
  32.                 in.close(); 
  33.             } 
  34.         } catch (IOException e) { 
  35.             e.printStackTrace(); 
  36.         } 
  37.     } 
  38.   } 
  39. }.start(); 

 

当然也可以通过NDK实现,代码就不放了。

第二种方式,同样是通过pm命令实现,不用请求ROOT,但是需要系统的签名。这里附上模拟器的的签名,用这个签名的APK安装在模拟器上可以实现不请求ROOT而静默安装的效果。

  1. //首先在manifest标签加入属性 
  2. android:sharedUserId="android.uid.system" 
 
  1. new Thread() { 
  2.     public void run() { 
  3.     Process process = null
  4.     InputStream in = null
  5.     try { 
  6.     // 请求root 
  7.     process = Runtime.getRuntime().
  8. exec("pm install -r " + currentTempFilePath + "\n");  
  9.     in = process.getInputStream(); 
  10.     int len = 0
  11.     byte[] bs = new byte[256]; 
  12.     while (-1 != (len = in.read(bs))) { 
  13.     String state = new String(bs, 0, len); 
  14.     if (state.equals("Success\n")) { 
  15.        //安装成功后的操作 
  16.          } 
  17.        } 
  18.     } catch (IOException e) { 
  19.         e.printStackTrace(); 
  20.     } catch (Exception e) { 
  21.         e.printStackTrace(); 
  22.     } finally { 
  23.         try { 
  24.             if (in != null) { 
  25.                 in.close(); 
  26.             } 
  27.         } catch (IOException e) { 
  28.             e.printStackTrace(); 
  29.         } 
  30.     } 
  31.   } 
  32. }.start(); 

 

  1. 文章更新请关注个人博客:http://www.blogchen.com/