Android 中静默安装

静默安装原理:

1.需要获取root的操作权限

2.通过命令式的方式直接进行安装APK。在使用 Android Studio debug安装的时候可以看到控制台上的命令

那么就直接上代码吧:

/**<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() {

        }
    }

}
时间: 2024-11-02 22:54:07

Android 中静默安装的相关文章

Android实现静默安装

一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方式称为静默安装. Android实现静默安装的方式有很多,这里只介绍一种比较简单易理解的方法,就是调用Android未公开的API(installPackage)来实现. 下面通过一种简单的Demo来简单实现静默安装,界面如下: 当点击"静默安装"的按钮时,会在后台安装360手机卫士的ap

android 实现静默安装、卸载(图)

android中应用的安装卸载,大家(用android设备的)肯定不陌生.这里就来浅谈android应用的安装.卸载的实现方式. 1.系统安装程序 android自带了一个安装程序---/system/app/PackageInstaller.apk.大多数情况下,我们手机上安装应用都是通过这个apk来安装的.代码使用也非常简单: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* 安装apk */ public static void installApk(

在SUSE 11 SP3中静默安装IBM WAS 7

我的系统是SUSE11 SP3,安装包是WASNDv7_LinuxX64_C1G35ML.tar.gz 使用root账户(最好咯,不用root的话要在配置文件里改权限) 创建一个文件夹,将安装包放进去(这步可以不做,这么做是因为安装包解压出来有文件,文件夹,不是在一个文件夹里,很乱滴)# mkdir was7# mv WASNDv7_LinuxX64_C1G35ML.tar.gz was7# cd was7解压WAS安装包(我用的是WASNDv7_LinuxX64_C1G35ML.tar.gz)

android 实现静默安装、卸载

方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.

Android中应用安装分析

#1 安装方式 1 安装系统APK和预制APK时,通过PMS的构造函数中安装,即第一次开机时安装应用,没有安装界面. 2 网络下载安装,通过应用商店等,即调用PackageManager.installPackages(),有安装界面. 3 通过adb工具安装,没有安装界面,它通过启动pm脚本的形式,然后调用com.android.commands.pm.Pm类,之后调用到PMS.installStage()完成安装. 4 安装本地apk,有安装界面,由PackageInstaller系统应用安

android实现静默安装demo

1.须要RootTools.jar 2.运行脚本 public class InstallerActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main)

Android随笔之——静默安装、卸载

随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐藏API,在源码下用MM命令编译生成APK的,反正我能力有限,没一一研究过,这里选择一种我试验成功的来讲. 静默安装.卸载的好处就是你可以偷偷摸摸,干点坏事什么的,哈哈~ 一.准备工作 要实现静默安装.卸载,首先你要有root权限,能把你的静默安装.卸载程序移动到system/app目录下. 1.用

Android 静默安装和智能安装的实现方法

1 简介 最近研究了Android的静默安装和智能安装,于是写博客记录一下. 静默安装就是无声无息的在后台安装apk,没有任何界面提示. 智能安装就是有安装界面,但全部是自动的,不需要用户去点击. 首先强调两点: 静默安装必须要root权限 智能安装必须要用户手动开启无障碍服务 2 原理 静默安装.卸载的原理就是利用pm install命令来安装apk,pm uninstall 来卸载apk. 智能安装是利用android系统提供的无障碍服务AccessibilityService,来模拟用户点

Android 无需root实现apk的静默安装

转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/50533137 Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFi