默认安装应用程序,授予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是核心安装程序的功能,它所做的最后一件事是调用PackageManagerinstallPackage函数:

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); 

但是你可以通过反射来访问这个方法。

如果您对PackageManagerinstallPackage函数的实现感兴趣,请查看PackageManagerService。

概要

你需要通过ContextgetPackageManager()来获得包管理器对象。 然后你会通过反射调用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

上一篇: Install apps silently, with granted INSTALL

下一篇: ANDROID not granting permission