代码之家  ›  专栏  ›  技术社区  ›  recluze

在安卓软件包安装期间写入元信息

  •  2
  • recluze  · 技术社区  · 13 年前

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

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

    现在,我希望能够将元信息发送到 PackageManager服务 以便它可以在安装之前进行写入。如果它自己写,以后应该可以读。

    我已经在 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中的安装意图在哪里处理?

    1 回复  |  直到 9 年前
        1
  •  2
  •   StarPinkER    13 年前

    正如您所看到的,意图是对组件的明确意图: 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来安装该应用程序。

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