2

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

我正在修改 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);

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

那么,问题来了: Android源码中PackageManagerService中的安装意图在哪里处理?

4

1 回答 1

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 来安装该应用程序。

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

于 2013-03-15T07:35:39.843 回答