靜默安裝原理:java
1.須要獲取root的操做權限
android
2.經過命令式的方式直接進行安裝APK。在使用 Android Studio debug安裝的時候能夠看到控制檯上的命令
app
那麼就直接上代碼吧:ide
/**<p>項目名:singno</p> * <p>包名: com.singno</p> * <p>文件名:VersionManager.java</p> * <p>版本信息: 2.1.0</p> * <p>日期: 2015/4/30/16:28.</p> * Copyright (c) 2015singno-版權全部 */ package com.singno; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.util.Log; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; /** * <p>名稱:com.singno.VersionManager</p> * <p>描述:</p> * <pre> * APK版本管理器 * 版本檢查,版本更新等 * </pre> * * @author 鮑建明 * @version 2.1.0 * @date 2015/4/30/16:28 */ public class VersionManager { private static final String TAG = VersionManager.class.getName(); private Context context; public VersionManager(Context context){ this.context = context; } /** * 檢查版本號是否相同 * @param versionCode * @return */ public boolean isSameVersion(int versionCode){ return getCurrentVersion() != versionCode ? Boolean.FALSE : Boolean.TRUE; } /** * 靜默安裝,安裝以前必需要獲取到ROOT權限 * 原理:1.先獲取到ROOT權限 * 2.在經過命令的方式直接安裝APK * @return */ public boolean silenceInstall(File file){ Process process = null; OutputStream out = null; DataOutputStream dataOutputStream = null; try { process = Runtime.getRuntime().exec("su"); out = process.getOutputStream(); dataOutputStream = new DataOutputStream(out); dataOutputStream.writeBytes("chmod 777 " + file.getPath() + "\n"); dataOutputStream.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " + file.getPath()); // 提交命令 dataOutputStream.flush(); int value = process.waitFor(); if( value == 0){ return Boolean.TRUE; } return Boolean.FALSE; } catch (Exception e) { e.printStackTrace(); return Boolean.FALSE; }finally{ try { if( dataOutputStream != null ){ dataOutputStream.close(); } if( out != null ){ out.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 普通的安裝應用方式 * @param file 安裝包文件 */ public void installApk(File file){ Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.context.startActivity(i); } /** * 獲取服務端中的版本號 * 這個自行完成 * @return */ public int getHttpVersion(){ return 0; } /** * 獲取當前APK的版本號 * @return 當前APK的版本號 */ public int getCurrentVersion(){ try { return this.context.getPackageManager().getPackageInfo(this.context.getPackageName(), 0).versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); Log.e(TAG, "獲取版本號失敗"); return 0; } } /** * 下載APK */ public void downApk(){ new Thread(new DownApk()).start(); } /** * 顯示下載進度提示框 */ private void showDownloadDialog(){ } /** * 顯示軟件更新提示對話框 */ private void showNoticeDialog(){ } /** * 下載APk的類 */ class DownApk implements Runnable{ @Override public void run() { } } }