静默安装apk的方法--Android是否可以实现静默安装模式

只对于能看懂能编译安卓源码的兄弟们:

pakcagemanagerservice.java中三个installpackage打头的函数

最后一个函数第一行代码就是检查这个PERMISSION,去掉就可以了。

但是您不能直接去掉原来的函数里面的代码,您可以自行添加一个API,函数和installpackage里面的一样,差别就是少了检查PERMISSION这行

下面这个文章有点老了

(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系统,可以解决。

静默安装apk的方法--Android是否可以实现静默安装模式

时间: 2024-10-10 13:03:24

静默安装apk的方法--Android是否可以实现静默安装模式的相关文章

快捷地安装apk文件到android手机中

在pc中,在没有安装各种手机助手的情况下,android程序员如何快捷地(对apk文件双击,即可自动安装,不用手动输命令)安装apk文件到android手机中? 可以使用以下方法:使用批处理文件 + Quick Batch File (De)Compiler 步骤: 1.编写以下dos命令,并保存为apk.bat @echo off echo 正在连接手机... adb wait-for-device echo. rem 获取双击apk文件的绝对路径 set apk=%* echo 正在安装:%

命令行从Android手机中导出已安装APK的方法调研

一.背景 二.步骤 一.背景 很多时候,APK文件只存在于应用市场,在PC上无法直接下载.用手机下载下来后就直接安装了,也不能保存原始的APK文件. APK安装到手机后,Android系统会保存一份和原始APK一模一样的拷贝,位于data/app目录,文件名为“APK的包名-1.apk”或者“APK的包名-2.apk”.这里的包名即 package name,形如 com.xxx.xxx. data/app这个目录在非root的情况下,是无法直接查看的.但幸运的是,这个目录下所有的APK文件,是

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

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

Android 下载APK 安装APK 打开APK

今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开. 这是下载apk的方法: /** * 后台在下面一个Apk 下载完成后返回下载好的文件 * * @param httpUrl * @return */ private File downFile(final String httpUrl) { new Thread(new Runnable() { @Override public void run() { try {

android-exploitme(二):安装apk熟悉测试环境

今天我们来熟悉测试环境: 1. 下载server代码,并运行 git clone https://github.com/SecurityCompass/LabServer.git 2. 这个server是apk客户端的服务器端,运行: To run the HTTP server on port 8080 python app.py To run the HTTPS server on port 8443 python app.py --ssl --port 8443 3. 打开Android虚

小白学习appium之如何安装apk

作为一个纯小白,只会一点Python,没接触过自动化,从懵逼开始.过程可能不尽完善,可能特别白的描述和迷之重点,但好歹是自己的努力,加油. 前篇详细学会了如何搭建appium自动化测试的环境,我用的是appium + Python + android . 这次写如何在Windows上的android模拟器中安装和卸载apk 1.安装apk 首先将要安装的apk放到一个路径下,比如我的c:\\    (前提是C:\android\android-sdk-windows\platform-tools

windows7 64位 php5.3安装php_mongo.dll方法 各个版本

https://s3.amazonaws.com/drivers.mongodb.org/php/index.html windows7 64位 php5.3安装php_mongo.dll方法windows7 64位 php5.3安装php_mongo.dll方法 各个版本,码迷,mamicode.com

安装虚拟机的方法

我今天学到了:(1)掌握了vrnwareworkstabon安装虚拟机的方法(2)掌握了安装windows server 2008r2系统的安装及分区(3)掌握了pc1上创建名称server 1的虚拟机还有分配硬盘的空间和内存以及它的网卡模式(4)掌握在server1上安装一台windows server 2008r2的服务器以及把它的硬盘分两个区和它的ip地址,子网掩码,网关,dns 原文地址:http://blog.51cto.com/14118520/2334522

Android 静默安装Apk

参考链接 android 静默安装 [Android]实现静默安装APK的两种方法