在Android软件包安装期间编写元信息

时间:2013-03-15 07:20:01

标签: android android-source

问题:如何编写有关包的元信息或者在android源代码中PackageManagerService处理安装意图的位置? (说明如下。)

我正在修改Android源代码以在安装过程中保存有关包的元信息。它可以存储在任何位置,但必须由系统读取。我的第一次尝试是使用/sdcardAndroid source error reading file from sdcard)但由于权限,这似乎不起作用。

现在,我希望能够将元信息发送到PackageManagerService,以便它可以在安装之前编写它。如果它自己写,它应该能够以后读取它。

我已经在PackageInstallerActivity中确定了这一点,即提出安装意图的地方:

if(v == mOk) {
            // Start subactivity to actually install the application
            Intent newIntent = new Intent();
            newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO,
                    mPkgInfo.applicationInfo);
            newIntent.setData(mPackageURI);
            newIntent.setClass(this, InstallAppProgress.class);
            String installerPackageName = getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME);
            if (installerPackageName != null) {
                newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
            }
            if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI);

我可以在intent中添加一个“额外”但我不知道在PackageManagerService中处理这个意图的位置。

所以,qustion:在android源码的PackageManagerService中处理的安装意图在哪里?

1 个答案:

答案 0 :(得分:2)

如您所见,意图是使用组件的明确意图:InstallAppProgress.class

这样意图将首先由InstallAppProgress处理。它也是PackageInstaller中的一个组件。它负责显示安装进度(InstallAppProgress.java中的initView())。在initView()方法中,它将调用PackageManagerService:

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    Intent intent = getIntent();
    mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
    mPackageURI = intent.getData();
    initView();
}

public void initView() {
    ...
    String installerPackageName = getIntent().getStringExtra(
            Intent.EXTRA_INSTALLER_PACKAGE_NAME);
    PackageInstallObserver observer = new PackageInstallObserver();
    pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}

所以意图不是由PackageManagerService处理的,它由InstallAppProgress处理,然后它只是调用PackageManagerService来安装该app。

我曾经在Android上使用部分权限授予系统。我所做的是在PMS中为installPackage方法添加一个参数,所以我认为你也可以这样做。 PackageManager是一个aidl服务,因此您还需要修改aidl文件。它位于framework/base/core/java/android/content/pm/

之下