精华内容
下载资源
问答
  • android静默安装
    2022-04-25 15:23:21

    Android 静默安装和自启动(1、Root环境下)
    https://www.jianshu.com/p/e1005082e365


    安卓静默安装以及安装后启动
    http://www.javashuo.com/article/p-dmkjcoci-cw.html

    Android 8.1 静默安装
    http://www.javashuo.com/article/p-rfacaqmb-nq.html 

    Android静默安装和自动安装
    http://www.javashuo.com/article/p-grkndcnu-nq.html


    android实现静默更新安装并自动启动
    http://www.javashuo.com/article/p-qvnbhizr-nq.html 


    android root权限下Apk下载、静默安装并自启
    https://blog.csdn.net/weixin_42602900/article/details/120288568?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-11-120288568.pc_agg_new_rank&utm_term=android+%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85%E8%87%AA%E5%90%AF&spm=1000.2123.3001.4430

    Android apk静默安装完成后自启动
    https://blog.csdn.net/zhang106209/article/details/105790432?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-9-105790432.pc_agg_new_rank&utm_term=android+%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85%E8%87%AA%E5%90%AF&spm=1000.2123.3001.4430

    Android 静默安装并自动重启,需要获取ROOT 权限

    https://blog.csdn.net/zhf6751134/article/details/117509820?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-8-117509820.pc_agg_new_rank&utm_term=android+%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85%E8%87%AA%E5%90%AF&spm=1000.2123.3001.4430


    Android9.0 静默安装源码的实现
    https://download.csdn.net/download/weixin_38748556/12743937?utm_medium=distribute.pc_relevant_download.none-task-download-2~default~BlogCommendFromBaidu~Rate-2.dl_default&depth_1-utm_source=distribute.pc_relevant_download.none-task-download-2~default~BlogCommendFromBaidu~Rate-2.dl_default&dest=https%3A%2F%2Fdownload.csdn.net%2Fdownload%2Fweixin_38748556%2F12743937&spm=1003.2020.3001.6616.2

    Android中软件的静默安装,安装完成后再自动打开新安装软件(需Root)
    https://blog.csdn.net/zxc514257857/article/details/77488832

    更多相关内容
  • Android静默安装

    2017-06-09 11:05:37
    Android黑科技,非常强大的应用,内含ReadMe.md说明文档,帮助你快速实现功能。
  • 详情见:Android 静默安装和静默卸载(系统层) http://blog.csdn.net/zhouyuanjing/article/details/78507606 安装: Intent intent = new Intent("android.intent.action.SILENT_PACKAGE_INSTALL"); ...
  • Android 静默安装

    2022-05-13 10:09:42
    不通过pm install命令的方式进行安装,直接调用系统的api import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInstaller; ...

    不通过pm install命令的方式进行安装,直接调用系统的api

    这可以从Android 6.0及更高版本开始:
    将您的应用设为设备所有者,一旦您的应用获得了设备所有者权限,我们就可以无需任何用户干预即可安装,卸载和更新。

    安装

    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageInstaller;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.util.Log;
    
    import androidx.annotation.RequiresApi;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import static com.mo.github.invokeinstallpackage.IoUtils.closeQuietly;
    
    /**
     * Copyright (C), 2018-2019
     * Author: ziqimo
     * Date: 2019-12-31 14:55
     * Description:
     * History:
     * <author> <time> <version> <desc>
     * 作者姓名 修改时间 版本号 描述
     */
    public class AndroidP {
    
    
        private static final String TAG = AndroidP.class.getSimpleName();
    
        // 适配android9的安装方法。
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public void install28(Context context, String apkFilePath, PackageManager packageManager) {
            File apkFile = new File(apkFilePath);
            PackageInstaller packageInstaller = packageManager.getPackageInstaller();
            PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
            sessionParams.setSize(apkFile.length());
    
            int sessionId = createSession(packageInstaller, sessionParams);
            if (sessionId != -1) {
                boolean copySuccess = copyInstallFile(packageInstaller, sessionId, apkFilePath);
                if (copySuccess) {
                    execInstallCommand(context, packageInstaller, sessionId);
                }
            }
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        private int createSession(PackageInstaller packageInstaller,
                                  PackageInstaller.SessionParams sessionParams) {
            int sessionId = -1;
            try {
                sessionId = packageInstaller.createSession(sessionParams);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sessionId;
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        private boolean copyInstallFile(PackageInstaller packageInstaller,
                                        int sessionId, String apkFilePath) {
            InputStream in = null;
            OutputStream out = null;
            PackageInstaller.Session session = null;
            boolean success = false;
            try {
                File apkFile = new File(apkFilePath);
                session = packageInstaller.openSession(sessionId);
                out = session.openWrite("base.apk", 0, apkFile.length());
                in = new FileInputStream(apkFile);
                int total = 0, c;
                byte[] buffer = new byte[65536];
                while ((c = in.read(buffer)) != -1) {
                    total += c;
                    out.write(buffer, 0, c);
                }
                session.fsync(out);
                Log.i(TAG, "streamed " + total + " bytes");
                success = true;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeQuietly(out);
                closeQuietly(in);
                closeQuietly(session);
            }
            return success;
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        private void execInstallCommand(Context context, PackageInstaller packageInstaller, int sessionId) {
            PackageInstaller.Session session = null;
            try {
                session = packageInstaller.openSession(sessionId);
                Intent intent = new Intent(context, InstallResultReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                session.commit(pendingIntent.getIntentSender());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeQuietly(session);
            }
        }
    }
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageInstaller;
    
    public class InstallResultReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,
                        PackageInstaller.STATUS_FAILURE);
                if (status == PackageInstaller.STATUS_SUCCESS) {
                    // success
                } else {
                    //Log.e(TAG, intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE));
                }
            }
        }
    }
    
    import java.io.Closeable;
    import java.io.IOException;
    import java.net.Socket;
    
    public final class IoUtils {
    
        public static void closeQuietly(Closeable c) {
            if (c != null) {
                try {
                    c.close();
                } catch (IOException ignored) {
                    ignored.printStackTrace();
                }
            }
        }
    
        public static void closeQuietly(Socket c) {
            if (c != null) {
                try {
                    c.close();
                } catch (IOException ignored) {
                    ignored.printStackTrace();
                }
            }
        }
    
    }
    

    卸载

    String appPackage = "com.your.app.package";
    Intent intent = new Intent(getActivity(), getActivity().getClass());
    PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
    PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller();
    mPackageInstaller.uninstall(appPackage, sender.getIntentSender());
    

    参考:
    Android 9.0静默安装整理
    Android 9.0 静默安装源码
    浅谈Android中静默安装&&卸载流程的使用
    PackageInstaller“设备所有者静默安装和卸载应用程序” - Android M Preview

    展开全文
  • 一个实现静默安装,并在安装之后启动软件的Demo,静默安装和自启动分为两个软件
  • 主要介绍了Android 静默安装,安装后重新启动APP的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方式称为静默安装。下面这篇文章就给大家介绍了两种方法来实现,下面来一起看看吧。 1、root权限静默安装实现 实现实际...
  • Android静默安装的方法,静默安装就是绕过安装程序时的提示窗口,直接在后台安装。 注意:静默安装的前提是设备有ROOT权限。 代码如下: /** * 静默安装 * @param file * @return */ public boolean ...
  • 本文实例讲述了android实现静默安装与卸载的方法。分享给大家供大家参考。具体如下: 方法1:【使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后...
  • Android P静默安装/卸载App 前言    公司最近上马了Android 9和10的平台,我们也得哼哧哼哧的进行相关的开发。我只能说谷歌的工程师为了KPI考核对Android修改的老开心了,可苦了我们啊。这不今天在进行Android的...
  • android 静默安装

    热门讨论 2014-09-16 11:45:33
    静默安装就是在某个触发点自动后台安装指定apk.没有安装界面.新软件自动安装,有旧版本的默默卸载,然后再安装,并且在不受系统设置中的第三方软件安装开关的限制.
  • 本文介绍了Android 静默安装和卸载的方法,分享给大家,具体如下: 一. 条件 系统签名 需要放到 /system/app里作为系统app 二. 适用环境 机顶盒开发,系统开发,车机开发,智能设备开发。 三. 步骤 1. 在 ...
  • android静默安装和智能安装的实现(本人测试的5.0的系统)
  • : Android免Root静默安装

    2020-07-30 11:55:47
    需要framework.jar包,调用方法Installer.getInstance().silentInstall(this,"apk路径");
  • 静默安装就是无声无息的在后台安装apk,没有任何界面提示。智能安装就是有安装界面,但全部是自动的,不需要用户去点击...下面脚本之家小编给大家介绍下Android 静默安装和智能安装的实现方法,感兴趣的朋友一起看看吧
  • 主要介绍了Android静默安装实现方案,仿360手机助手秒装和智能安装功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android静默安装Demo

    2018-10-18 13:26:23
    通过反射实现静默安装,卸载功能。Demo代码在Android6.0系统测试可以正常卸载,安装应用。Demo中除了通过反射方法外,还提供了其他两种方法安装,卸载应用。
  • android 静默安装apk,适配android Q静默

    千次阅读 热门讨论 2021-02-20 11:55:20
    android 系统下静默安装apk需要时系统级应用 或 加了白名单具备系统权限App; 解决方案 一: 在低版本SDK中应该是SDK4.0(API15)及以下,具体没考证,可以通过PackageManager类的installPackage方法来静默安装; ...

    前提条件
    在android 系统下静默安装apk需要时系统级应用 或 加了白名单具备系统权限App;

    解决方案

    一: 在低版本SDK中应该是SDK4.0(API15)及以下,具体没考证,可以通过PackageManager类的installPackage方法来静默安装;

    //context 上下文;packageName包名; file 文件
    private void installSilent(Context context, String packageName, File file) {
            PackageManager pm = context.getPackageManager();
            pm.installPackage(Uri.fromFile(file), new IPackageInstallObserver() {
                @Override
                public void packageInstalled(String basePackageName, int returnCode) throws RemoteException {
                  
    			  if(basePackageName==null||returnCode!=1){
    				//静默安装失败,采用通过Intent跳转手动安装
    			  }else{
    				//静默安装成功
    			  }
    			  
                }
    
                @Override
                public IBinder asBinder() {
                    return null;
                }
            }, PackageManager.INSTALL_REPLACE_EXISTING, packageName);
    }
    

    二:当在SDK版本为O 即8.0(API27)及以下,SDK4.0(API15)以上,PackageManager包下就找不到installPackage()方法。

    分析原因为在SDK8.0等版本下,google考虑安全等原因,移除或私有了PackageManager中一些函数、删除了 IPackageInstallObserver.class,IPackageInstallObserver$Stub.class;PackageManager中移除了个别方法

    1. import android.content.pm.IPackageInstallObserver;  
    2. import android.content.pm.IPackageInstallObserver$Stub;  
    3. import android.content.pm.PackageManager;  

    解决方案:

    1、在你的SDK路径下找到 \platforms\android-API版本号\android.jar,修改后缀为.zip;然后解压android.zip; 注意:解压一个低版本PackageManager等未做删减的,再解压一个你项目所使用的SDK版本的android.jar;

    2、在android.zip文件夹中进入 android\android\content\pm ;然后将低版本PackageManager等未做删减的 PackageManager.classIPackageInstallObserver.class 、IPackageInstallObserver$Stub.class;拷贝一份然后粘贴到你项目所使用的SDK版本的android.jar中,然后再将android文件压缩成android.zip,然后再修改后缀为.jar;

    3、再将修改后的android.jar拷贝到SDK路径  \platforms\android-API版本号\ 下,覆盖掉被google删减的android.jar; 注意覆盖前最好先备份一下原始android.jar;

    4、重启android studio;类和方法就能导报出来了; 

     

    如下图:

    三:当在SDK版本为P 即9.0(API28)及以上, 上面的解决方法不再适用。这时需要使用 PackageInstaller类 创建Session,并广播通知系统来静默安装;

    直接贴代码如下:注意 该操作是耗时的,切勿在主线程中操作,否则会ANR;一定通过子线程来操作;

    
    
    public class InstallManager {
    
        private static final String TAG = "InstallManager";
    
        /*******************************************************  android P 静默安装适配 *****************************************************************/
        private final static String ACTION = "wait.install.result";
        private final static SynchronousQueue<Intent> mInstallResults = new SynchronousQueue<>();
    
        /**
         * @param context
         * @param filePath
         */
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public static synchronized boolean installForP(Context context, final String filePath) {
    
            boolean success = false;
            File apkFile = new File(filePath);
            PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
            PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
            sessionParams.setSize(apkFile.length());
            int sessionId = createSession(packageInstaller, sessionParams);
    
            if (sessionId != -1) {
                boolean copySuccess = copyInstallFile(packageInstaller, sessionId, filePath);
    
                if (copySuccess) {
                    boolean installSuccess = execInstallCommand(context, packageInstaller, sessionId, filePath);
                    if (installSuccess) {
                        success = true;
                    }
                }
            }
            return success;
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private static int createSession(PackageInstaller packageInstaller, PackageInstaller.SessionParams sessionParams) {
            int sessionId = -1;
            try {
                sessionId = packageInstaller.createSession(sessionParams);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sessionId;
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private static boolean copyInstallFile(PackageInstaller packageInstaller, int sessionId, String apkFilePath) {
    
            InputStream in = null;
            OutputStream out = null;
            PackageInstaller.Session session = null;
            boolean success = false;
            try {
                File apkFile = new File(apkFilePath);
                session = packageInstaller.openSession(sessionId);
                out = session.openWrite("base.apk", 0, apkFile.length());
                in = new FileInputStream(apkFile);
                int total = 0, c;
                byte[] buffer = new byte[65536];
                while ((c = in.read(buffer)) != -1) {
                    total += c;
                    out.write(buffer, 0, c);
                }
                session.fsync(out);
                Log.i(TAG, "streamed " + total + " bytes");
                success = true;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                session.close();
            }
            return success;
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private static boolean execInstallCommand(Context context, PackageInstaller packageInstaller, int sessionId, String filePath) {
            PackageInstaller.Session session = null;
            boolean success = false;
            try {
                session = packageInstaller.openSession(sessionId);
                Intent intent = new Intent();
                intent.setAction(ACTION);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                session.commit(pendingIntent.getIntentSender());
                
                final Intent result = mInstallResults.poll(60, TimeUnit.SECONDS);
    
                if (result != null) {
                    final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
                            PackageInstaller.STATUS_FAILURE);
    
                    if (status == PackageInstaller.STATUS_SUCCESS) {
                        success = true;
                    } else {
                        Log.e(TAG, result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE));
                    }
                } else {
                    success = false;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
         
    
            } finally {
                session.close();
            }
    
            return success;
        }
    
    
    }
    

     

    注:公司是做手机及OS的, 以上方案均在我负责的项目中验证过(负一屏、浏览器、应用市场),是OK的;

    展开全文
  • Android静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new ...
  • Android9.0无法通过以下两种方式实现静默安装: 1.runtime执行shell cmd 2.PackageInstall 反射机制 但是Google已经给我们推荐了相关的APIDemos,所以建议大家多看看源码~ 在frameworks/base/core/java/android/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,365
精华内容 2,946
关键字:

android静默安装