默认安装应用程序,授予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