清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
静默安装原理:
1.需要获取root的操作权限
2.通过命令式的方式直接进行安装APK。在使用 Android Studio debug安装的时候可以看到控制台上的命令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() { } } }