默认安装应用程序,授予INSTALL
我正试图安装apk到系统中。 我的应用位于/ system / app并成功授予“android.permission.INSTALL_PACKAGES”权限
但是,我无法找到任何地方如何使用此权限。 我试图将文件复制到/ data / app,但没有成功。 此外,我尝试使用此代码
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.parse("file:///sdcard/app.apk"),
"application/vnd.android.package-archive");
startActivity(intent);
但是这个代码打开标准安装对话框。 如何在没有授予android.permission.INSTALL_PACKAGES
root的情况下默默安装应用程序?
PS我正在写一个应用程序,它将在第一次启动时将多个文件夹安装到系统中(替换安装向导)。 我需要它来使固件更轻。
如果您认为我正在编写病毒:所有程序都安装到/ data / app中。 权限Install_packages只能授予位于/ system / app中的系统级程序或使用系统密钥签名。 所以病毒无法到达那里。
正如所说的http://www.mail-archive.com/android-porting@googlegroups.com/msg06281.html应用程序可以无提示安装,如果他们有install_packages权限。 此外,您不需要安静地安装软件包就不需要Install_packages权限。 再加上http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html
你的第一个选择是看看Android的本地PackageInstaller。 我会建议您修改该应用程序的方式,或者只是提取所需的功能。
具体而言,如果您查看PackageInstallerActivity及其onClickListener
方法:
public void onClick(View v) {
if(v == mOk) {
// Start subactivity to actually install the application
Intent newIntent = new Intent();
...
newIntent.setClass(this, InstallAppProgress.class);
...
startActivity(newIntent);
finish();
} else if(v == mCancel) {
// Cancel and finish
finish();
}
}
然后你会注意到实际的安装程序位于InstallAppProgress类中。 检查这个类,你会发现initView
是核心安装程序的功能,它所做的最后一件事是调用PackageManager
的installPackage
函数:
public void initView() {
...
pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}
下一步是检查PackageManager,它是抽象类。 你会在installPackage(...)
找到installPackage(...)
函数。 坏消息是它有@hide标记。 这意味着它不是直接可用的(您将无法通过调用此方法进行编译)。
/**
* @hide
* ....
*/
public abstract void installPackage(Uri packageURI,
IPackageInstallObserver observer,
int flags,String installerPackageName);
但是你可以通过反射来访问这个方法。
如果您对PackageManager
的installPackage
函数的实现感兴趣,请查看PackageManagerService。
概要
你需要通过Context
的getPackageManager()
来获得包管理器对象。 然后你会通过反射调用installPackage
函数。
我检查了ADB如何安装应用程序。
- 它将APK复制到/ data / local / tmp
- 它运行'shell:pm install /data/local/tmp/app.apk'
我试图通过这样做来复制这种行为:(在pc上,使用usb-cable)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
这工作。 该应用程序已安装。
我做了一个应用程序(名为AppInstall),它应该安装其他应用程序。
(正常安装,无根设备)
它确实:
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
但是这给了错误:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
好像错误是由pm引发的,而不是由AppInstall引发的。
由于SecurityException并未被AppInstall捕获,并且应用程序不会崩溃。
我已经尝试了一个根植设备(相同的应用程序和AppInstall)同样的事情,它的工作就像一个魅力。
(也正常安装,不在/系统或任何东西)
AppInstall甚至没有问根权限。
但那是因为在该设备上shell总是#
而不是$
。
顺便说一句,你需要root在/系统中安装应用程序,正确吗?
我试图在无根设备上重新安装adb,并得到:
remount failed: Operation not permitted.
这就是为什么我无法在非根设备上尝试/ system的原因。
结论:您应该使用根植设备
希望这可以帮助 :)
你应该定义
<uses-permission
android:name="android.permission.INSTALL_PACKAGES" />
在你的清单中,如果你在系统分区(/ system / app)中,或者你的应用程序由制造商签名,你将拥有INSTALL_PACKAGES权限。
我的建议是创建一个具有1.5兼容性级别的小型Android项目,用于通过反射调用installPackages并导出包含方法的jar以安装包并调用真正的方法。 然后,通过将jar导入到项目中,您将准备好安装软件包。
链接地址: http://www.djcxy.com/p/85333.html