android安装apk流程详解

来源:互联网 发布:淘宝优惠券公众号 编辑:程序博客网 时间:2024/06/17 00:52

大家平时写代码的过程中调用android的安装过程只是简简单单的创建一个intent,然后启动起来。那么这内部的流程到底是怎么样的呢,下面是自己看了源码后的一些心得:

android有关安装这一过程的处理的入口在PackageInstallerActivity 及InstallAppProgress中,具体的代码请查看这个类的源码,下面我只是将其中比较关键的代码粘贴出来,进行分析。

   public void initView() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.op_progress);
        int installFlags = 0;
        PackageManager pm = getPackageManager();

提取apk的信息并对完整性做检查
        try {
            PackageInfo pi = pm.getPackageInfo(mAppInfo.packageName,
                    PackageManager.GET_UNINSTALLED_PACKAGES);
            if(pi != null) {
                installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
            }
        } catch (NameNotFoundException e) {
        }
        if((installFlags & PackageManager.INSTALL_REPLACE_EXISTING )!= 0) {
            Log.w(TAG, "Replacing package:" + mAppInfo.packageName);
        }
        PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, mAppInfo,
                mPackageURI);
        mLabel = as.label;

只是简简单单的对我们看到的界面做了个初始化
        PackageUtil.initSnippetForNewApp(this, as, R.id.app_snippet);
        mStatusTextView = (TextView)findViewById(R.id.center_text);
        mStatusTextView.setText(R.string.installing);
        mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
        mProgressBar.setIndeterminate(true);
        // Hide button till progress is being displayed
        mOkPanel = (View)findViewById(R.id.buttons_panel);
        mDoneButton = (Button)findViewById(R.id.done_button);
        mLaunchButton = (Button)findViewById(R.id.launch_button);
        mOkPanel.setVisibility(View.INVISIBLE);

        String installerPackageName = getIntent().getStringExtra(
                Intent.EXTRA_INSTALLER_PACKAGE_NAME);
        PackageInstallObserver observer = new PackageInstallObserver();

开始启动安装
        pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
    }

上面一段代码的关键点在最后的pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);

首先让我们看下这行代码中各个参数的含义,然后在回过来看看它的具体实现

1 mPackageURI就是 intent.setDataAndType(Uri.parse("file://" + info.path), "application/vnd.android.package-archive");平时你在写intent时的Uri.parse("file://" + info.path)

2 observer观察者,安装精度和成功与否的回调,它的具体实现:

3  安装包信息完整性的标志

4 安装器的名字,一般用的是应用的名字