`
ice.k
  • 浏览: 286658 次
  • 性别: Icon_minigender_1
  • 来自: 荷兰
社区版块
存档分类
最新评论

Android是否可以实现静默安装模式

阅读更多
(1)在网上搜寻该问题的解决方法,且查阅android开发文档,没有发现可以实现该功能的显示API调用,网络上很多人请教同样的问题,但都没有能够实现解答;说是android为了用户的安全,已屏蔽该实现该方法的功能,第三方法应用是无法实现静默安装的。
(2)然后自己试图去看看android实现普通安装程序的源码文件,能否找到解决的办法,打算绕过普通安装时的提示框,直接调用通过确认后调用的函数进行安装;在查看android应用程序的普通安装过程后,发现应用程序安装过程的方法调用过程为:首先进入到com/android/packageinstaller/PackageInstallerActivity.java这个Activity中,在这个Activity中首先检查所欲安装的程序是否是正确的安装文件,以及当前系统中是否已安装了此应用程序,提示用户是否重复安装,另外还获取所欲安装的程序所讲用到的权限,然后将这些信息通过一个对话框提示给用户,当用户确定安装时,启动com.android.packageinstaller.InstallAppProgress.java这个Activity,在这个Activity中,调用

android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)进行安装应用程序,在InstallAppProgress中得到的PackageManager是通过PackageManager pm = getPackageManager()得到的,得到的对象是一个android.app.ContextImpl.ApplicationPackageManager对象,而

ApplicationPackageManager对象经过封装,

ApplicationPackageManager(ContextImpl context,
                IPackageManager pm) {
            mContext = context;
            mPM = pm;
        }
其installPackage方法为
  @Override
        public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
                String installerPackageName) {
            try {
                mPM.installPackage(packageURI, observer, flags, installerPackageName);
            } catch (RemoteException e) {
                // Should never happen!
            }
        }

可见调用的installPackage方法为 IPackageManager.installPackage(packageURI, observer, flags, installerPackageName);
在ContextImpl中,由IPackageManager pm = ActivityThread.getPackageManager()获得IPackageManager实例对象;在ActivityThread.getPackageManager()方法中,
static IPackageManager sPackageManager;
public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        sPackageManager = IPackageManager.Stub.asInterface(b);
        return sPackageManager;
    }

最终得到的installPackage确实是IPackageManager.installPackage方法;

因为class PackageManagerService extends IPackageManager.Stub所以IPackageManager.installPackage调用的是:PackageManagerService.java (frameworks\base\services\java\com\android\server)文件中的
/* Called when a downloaded package installation has been confirmed by the user */
    public void installPackage(
            final Uri packageURI, final IPackageInstallObserver observer, final int flags) {
        installPackage(packageURI, observer, flags, null);
    }
(这里不明白为何IPackageManager.installPackage方法调用的是PackageManagerService.java,只是在网上的一篇文章中它给出了上面的原因,因为class PackageManagerService extends IPackageManager.Stub,我不明白,但也找不到其他的函数,通过PackageManagerService.java的源码,可以看出它确实是进行应用程序安装的,所以应该可以确定最终调用的方法就是

PackageManagerService.installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags))

于是考虑如何得到PackageManagerService.installPackage(),考虑通过反射的方法得到installPackage(),但其中难以得到的是其参数中的IPackageInstallObserver类型,IPackageInstallObserver是由aidl文件定义的,通过aidl文件的特性,将IPackageInstallObserver.aidl文件拷到本地程序中,可以得到类IPackageInstallObserver.calss,通过它反射出installPackage()方法,但在invoke该方法时,却无法得到IPackageInstallObserver的实例对象,IPackageInstallObserver的实例对象必须通过

IPackageInstallObserver.Stub.asInterface(IBinder binder)方式得到,无法得到与其绑定的IBinder对象,因而无法执行反射出来的方法;另外PackageManagerService.installPackage()似乎是不能被第三方应用程序执行的,有权限的限制,这从下面的实例中似乎可以得到证实。

(3)在程序中执行Runtime.getRuntime().exec("pm install -r " + new File(Environment.getExternalStorageDirectory(),
"download/Shuffle-1.6.3.apk")); 进行安装,这个命令的执行在 com.android.commands.pm.Pm中,直接调用IPackageManager.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,installerPackageName)方法,在此方法中,
IPackageManager mPm;
mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
且class PackageManagerService extends IPackageManager.Stub
所以IPackageManager.installPackage调用的是:PackageManagerService.java (frameworks\base\services\java\com\android\server)文件中的
/* Called when a downloaded package installation has been confirmed by the user */
    public void installPackage(
            final Uri packageURI, final IPackageInstallObserver observer, final int flags) {
        installPackage(packageURI, observer, flags, null);
    }

在此方法执行中会出现 Not granting permission android.permission.DELETE_PACKAGES错误,这应该是该权限不能授给第三方应用,因而在程序中不能执行,与android中普通安装应用程序最终调用的方法是相同的,但是却对第三方应用是没有权限执行的。。

(4) 另外解决思路:

1> 使用android:sharedUserId="android.uid.system"属性来使应用程序获得系统权限,看看是否能够执行行Runtime.getRuntime().exec("pm install -r ... ")方法。
2> 阅读android实现应用程序安装更底层的代码,看看能否可以调用的底层方法进行安装或者自己实现一个安装程序的代码,但这可能性不大,因为这涉及到android更底层的调用,

肯定会有一定的权限限制。
3> 在网上看到一个文件管理程序,据说是可以实现批量寂寞安装应用程序,但说明运行时需要用户确定得到手机的root权限,所以没有太大意义。
4> 定制自己的android系统,可以解决。
分享到:
评论

相关推荐

    android 7.0非root下 实现静默安装 多种方式

    创建一个System App,包含必要的权限如`INSTALL_PACKAGES`,然后使用`PackageInstaller.Session`接口创建一个安装会话,设置为静默模式并提交。对于卸载,可以使用`PackageManager`的`removePackage()`方法。 4. **...

    android静默安装程序

    在Android系统中,静默安装(Silent Installation)是指在用户无感知的情况下,通过编程方式自动安装应用程序。这种操作通常需要设备具有root权限,因为正常的Android安全机制限制了非系统应用的静默安装。Root权限...

    静默安装apk android4.4

    Android 4.4引入了对企业设备的管理支持,通过MDM(Mobile Device Management)策略可以实现静默安装。MDM服务器可以远程推送策略给设备,其中包括安装应用的指令。用户不需要交互就能完成安装。 5. **AOSP源码...

    安卓安装卸载相关-android静默安装和智能安装的实现本人测试的5.0的系统.rar

    提供的压缩包包含了作者在Android 5.0系统上测试的静默安装和智能安装的实现。由于每个Android版本和设备都有所不同,代码可能需要针对具体环境进行调整。开发者可以通过阅读代码、运行并分析日志来学习和调试相关...

    Android中App静默安装

    3. **静默安装代码**:有了设备管理器权限后,你可以使用`PackageInstaller`类来实现静默安装。首先,创建一个`PackageInstaller.SessionParams`对象,设置安装模式为`PackageInstaller.SessionParams.MODE_FULL_...

    Android apk后台静默安装

    在Android系统中,APK...以上就是关于"Android apk后台静默安装"的相关知识点,包括其原理、适用版本、实现步骤以及需要注意的安全问题。在实际操作时,务必确保符合Android系统的安全策略和用户隐私保护规定。

    Android静默安装和智能安装

    3. 构建安装参数:在创建安装会话时,可以设置安装参数,例如设置安装模式为`INSTALL_SILENT`,实现静默安装。 4. 提交安装:通过`PackageInstaller.commit()`方法提交安装请求,并监听安装状态变化,以便在安装...

    android 静默安装代码

    本篇将深入探讨如何实现Android的静默安装,并基于源码进行改造。 首先,理解Android的安装流程至关重要。当一个APK文件被传递给`PackageInstaller`服务时,系统会执行一系列步骤,包括权限检查、签名验证、安装...

    Android 静默安装

    6. **适配不同Android版本**:不同版本的Android系统可能会有一些差异,例如API的变化或权限管理的调整,所以在实现静默安装时,需要对不同版本进行适配。 在压缩包文件`InstallAPK`中,可能包含了一个示例程序或库...

    Android4.0静默安装方法和源码

    在Android 4.0(API级别14)中,Google引入了`PackageInstaller`接口,使得开发者可以实现静默安装的功能。下面我们将详细探讨如何在Android 4.0上进行静默安装,以及`PackageInstaller`的相关源码分析。 一、静默...

    android静默安装

    首先,需要获取到`PackageInstaller`的实例,然后创建一个安装会话,并设置安装参数为静默模式。最后,提交安装请求并等待完成。这种方式需要对Android系统框架有深入理解。 ```java Intent intent = new Intent...

    获取root权实现静默安装

    3. **编程实现**:对于批量安装或自动化场景,可以编写脚本或程序,利用Android的Java API或JNI(Java Native Interface)来实现静默安装。例如,通过反射调用PackageInstaller接口的install方法。 4. **利用root...

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

    不过,通过理解Android系统内部的安装机制,我们可以找到一种方法来实现静默安装。 首先,要明确的是,静默安装通常需要高权限,尤其是`INSTALL_PACKAGES`权限,这是一个签名或系统级别的权限,意味着只有系统进程...

    APK自动静默安装并自动重新启动

    在Android系统中,APK自动静默安装并自动重新启动是一项技术操作,通常涉及到系统级权限和特定的脚本编写。这项技术常用于批量设备管理、应用自动化测试或企业内部应用部署等场景。以下是关于这个主题的详细知识讲解...

    静默安装app

    本文将详细介绍如何利用Android调试桥(ADB)及Root权限实现静默安装。 #### 一、静默安装的概念 静默安装指的是在没有用户交互的情况下,自动完成应用程序的安装过程。这种安装方式通常用于系统级别的应用更新或...

    安卓Android源码——APK实现静默安装整套资料.zip

    2. **创建安装参数**:构建一个`PackageInstallRequest`对象,设置安装模式为`INSTALL_SILENT`以实现静默安装。此外,还可以设置其他参数,如安装来源、安装位置等。 3. **调用安装服务**:使用`PackageManager`...

    Android实现静默安装的两种方法

    本文将介绍两种在Android上实现静默安装的方法,一种是通过root权限,另一种是无root权限但需用户确认。 首先,我们来看root权限下的静默安装。这种方法适用于设备已经获取root权限的情况。静默安装的核心是通过...

    Android惠普彩色打印机,usb直连静默打印

    Android支持USB主机模式(Host Mode),使得设备可以直接连接到USB设备,如惠普打印机。 1. **Android USB Host API**: Android 3.1及以上版本引入了USB Host API,允许设备作为USB主机并控制其他USB设备。开发者...

    静默安装apk

    - **通过Adb命令**:可以使用adb工具,通过USB连接设备或无线调试模式,发送命令来安装APK。命令格式通常是`adb install -r -t path_to_apk`,其中 `-r` 表示替换已存在的应用,`-t` 表示允许测试安装。 - **通过...

    Android静默安装

    本篇将详细介绍两种实现Android静默安装的方法:一种需要root权限,另一种则无需root。 一、需要root权限的静默安装 1. 使用`adb`命令行工具:在开发者模式下,通过USB连接设备,可以使用`adb install -r -t ...

Global site tag (gtag.js) - Google Analytics