安卓内核程序安装机制--
来源:互联网 发布:中小学排课软件 编辑:程序博客网 时间: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
- 安卓内核程序安装机制--
- 安卓静默安装程序
- 安卓linux uevent内核上报机制实例
- 安卓内核开发-tiny210v2上的程序烧写
- 安卓开发监听程序安装卸载
- 安卓禁止用户安装程序
- 安卓安装一个程序的代码
- 安卓壁纸机制
- 安卓过滤机制
- 安卓消息机制
- 安卓Handler机制
- 安卓Binder机制
- 安卓获取已安装程序的列表
- ADT中通过安卓虚拟设备运行安装程序
- 解决安卓程序安装没图标的问题
- 得到安卓所有已安装程序的信息
- 安卓内核编译流程
- 安卓程序升级自动安装,安装完成后提示是否打开程序(个人学习笔记)
- 专家术语学习机
- Spark Core---从作业提交到任务调度完整生命周期浅析
- POJ 3548Restoring the digits
- 8.1 Qemu 管理模块与接口
- CF_540C_IceCave
- 安卓内核程序安装机制--
- [FOJ 2121] 神庙逃亡
- POJ 3093Margaritas on the River Walk
- 4.Android四大组件之Activity基本用法
- 8.2 虚拟机Save 与load
- Silverlight DataGrid用法
- [FOJ 2122] 又见LKity
- 【剑指Offer面试题】 九度OJ1385:重建二叉树
- shell 脚本统计文件梳理及获取磁盘占有率