安卓内核程序安装机制--

来源:互联网 发布:中小学排课软件 编辑:程序博客网 时间:2024/05/17 04:51

每个安装用户都知道安卓程序的安装步骤,下载,点击安装包,安装。那么这些步骤在安卓内核中是如何运行的?我们先从安卓源码中的系统软件PackageInstaller入手,来分析软件安装的运行步骤。
PackageInstaller的源码packages/apps下。其中的源程序包含如下几个源文件:
这里写图片描述
我们从PackageInstallerActivity入手:
找到oncreate入口:

 protected void onCreate(Bundle icicle) {        super.onCreate(icicle);        // get intent information      //  **首先是从Intent当中读取包信息**        final Intent intent = getIntent();        mPackageURI = intent.getData();        mOriginatingURI = intent.getParcelableExtra(Intent.EXTRA_ORIGINATING_URI);        mReferrerURI = intent.getParcelableExtra(Intent.EXTRA_REFERRER);        mPm = getPackageManager();      /*  **判断是否来自未知包源,看是否是非官网上下载下来的APP**        软件安装,app-store安装,普通应用安装--通过PackageInstallerActivity,Runtime.getRuntime().exec(pm install -r $app)需要安装权限        Android应用安装有如下四种方式        1. 系统应用安装――开机时完成,没有安装界面        2. 网络下载应用安装――通过market应用完成,没有安装界面        3. ADB工具安装――没有安装界面。        4. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。*/        boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent);        安装包信息流分析:请移步到1.安装包信息流分析        mInstallFlowAnalytics = new InstallFlowAnalytics();        mInstallFlowAnalytics.setContext(this);        mInstallFlowAnalytics.setStartTimestampMillis(SystemClock.elapsedRealtime());        mInstallFlowAnalytics.setInstallsFromUnknownSourcesPermitted(                isInstallingUnknownAppsAllowed());        mInstallFlowAnalytics.setInstallRequestFromUnknownSource(requestFromUnknownSource);        mInstallFlowAnalytics.setVerifyAppsEnabled(isVerifyAppsEnabled());        mInstallFlowAnalytics.setAppVerifierInstalled(isAppVerifierInstalled());        mInstallFlowAnalytics.setPackageUri(mPackageURI.toString());//如果连接的开头不是file或者package,结束安装        final String scheme = mPackageURI.getScheme();        if (scheme != null && !"file".equals(scheme) && !"package".equals(scheme)) {            Log.w(TAG, "Unsupported scheme " + scheme);            setPmResult(PackageManager.INSTALL_FAILED_INVALID_URI);            mInstallFlowAnalytics.setFlowFinished(                    InstallFlowAnalytics.RESULT_FAILED_UNSUPPORTED_SCHEME);            finish();            return;        }        final PackageUtil.AppSnippet as;        if ("package".equals(mPackageURI.getScheme())) {            mInstallFlowAnalytics.setFileUri(false);            try {                mPkgInfo = mPm.getPackageInfo(mPackageURI.getSchemeSpecificPart(),                        PackageManager.GET_PERMISSIONS | PackageManager.GET_UNINSTALLED_PACKAGES);            } catch (NameNotFoundException e) {            }            if (mPkgInfo == null) {                Log.w(TAG, "Requested package " + mPackageURI.getScheme()                        + " not available. Discontinuing installation");                showDialogInner(DLG_PACKAGE_ERROR);                setPmResult(PackageManager.INSTALL_FAILED_INVALID_APK);                mInstallFlowAnalytics.setPackageInfoObtained();                mInstallFlowAnalytics.setFlowFinished(                        InstallFlowAnalytics.RESULT_FAILED_PACKAGE_MISSING);                return;            }            as = new PackageUtil.AppSnippet(mPm.getApplicationLabel(mPkgInfo.applicationInfo),                    mPm.getApplicationIcon(mPkgInfo.applicationInfo));        } else {            mInstallFlowAnalytics.setFileUri(true);            final File sourceFile = new File(mPackageURI.getPath());            PackageParser.Package parsed = PackageUtil.getPackageInfo(sourceFile);            // Check for parse errors            if (parsed == null) {                Log.w(TAG, "Parse error when parsing manifest. Discontinuing installation");                showDialogInner(DLG_PACKAGE_ERROR);                setPmResult(PackageManager.INSTALL_FAILED_INVALID_APK);                mInstallFlowAnalytics.setPackageInfoObtained();                mInstallFlowAnalytics.setFlowFinished(                        InstallFlowAnalytics.RESULT_FAILED_TO_GET_PACKAGE_INFO);                return;            }            mPkgInfo = PackageParser.generatePackageInfo(parsed, null,                    PackageManager.GET_PERMISSIONS, 0, 0, null,                    new PackageUserState());            mPkgDigest = parsed.manifestDigest;            as = PackageUtil.getAppSnippet(this, mPkgInfo.applicationInfo, sourceFile);        }        mInstallFlowAnalytics.setPackageInfoObtained();        //set view        setContentView(R.layout.install_start);        mInstallConfirm = findViewById(R.id.install_confirm_panel);        mInstallConfirm.setVisibility(View.INVISIBLE);        PackageUtil.initSnippetForNewApp(this, as, R.id.app_snippet);        mOriginatingUid = getOriginatingUid(intent);        // Block the install attempt on the Unknown Sources setting if necessary.        if ((requestFromUnknownSource) && (!isInstallingUnknownAppsAllowed())) {            //ask user to enable setting first            showDialogInner(DLG_UNKNOWN_APPS);            mInstallFlowAnalytics.setFlowFinished(                    InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);            return;        }        initiateInstall();    }

1.安装包信息流分析

0 0
原创粉丝点击