当前位置: 首页 > news >正文

专业移动微网站建设中央人民政府

专业移动微网站建设,中央人民政府,网络营销企业网站推广,钓鱼网站是什么技术的人做的出来今天简单讲解一下PackageInstaller 文件路径: packages/apps/PackageInstaller frameworks/base/core/java/android/content/pm&res 下面开始讲解: 首先,我们说一下安装apk的几种方式,整体上可以分为2类,一类是有界面安装,一类是无界面安装。无界面安装分为内置apk开…

    今天简单讲解一下PackageInstaller

    文件路径:

    packages/apps/PackageInstaller

    frameworks/base/core/java/android/content/pm&res

   下面开始讲解:

    首先,我们说一下安装apk的几种方式,整体上可以分为2类,一类是有界面安装,一类是无界面安装。无界面安装分为内置apk开机安装和命令安装,命令安装又分为两类,一类电脑安装也就是adb命令,另一类是手机安装也就是pm命令。今天我们主要介绍有界面安装。

    当然,我们从这个安装界面说起,这个界面是那个呢?就是PackageInstallerActivity这个acitvity。它是如何启动起来的呢?我们去看看它在AndroidManifest是如何定义的

        <activity android:name=".PackageInstallerActivity"android:configChanges="orientation|keyboardHidden|screenSize"android:excludeFromRecents="true"android:screenOrientation="unspecified"><intent-filter><action android:name="android.intent.action.VIEW" /><action android:name="android.intent.action.INSTALL_PACKAGE" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /><data android:mimeType="application/vnd.android.package-archive" /></intent-filter><intent-filter><action android:name="android.intent.action.INSTALL_PACKAGE" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /></intent-filter></activity>

很明显了,我们可以通过android.intent.action.INSTALL_PACKAGE这个action启动,也可以通过android.intent.action.VIEW这个action加上"application/vnd.android.package-archive"这个type启动,当然不加这个type也能启动,但是会找到很多这样的activity哦。另外,通过类名或包名启动也未尝不可的。所以,大部分启动是这样的

			String apkFileString = Environment.getExternalStorageDirectory().getAbsolutePath()+"/.../packageName.pac";File apkFile = new File(apkFileString);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");mContext.startActivity(intent);

这里我们传进去一个数据就是pakFile的Uri,然后我们去PackageInstallerActivity的onCreate中看看

        final Intent intent = getIntent();mPackageURI = intent.getData();mPm = getPackageManager();mPkgInfo = PackageUtil.getPackageInfo(mPackageURI);

获取到,我们刚才传进来的apkFile的Uri给了mPackageURI,接着获取到PackageManager,然后生成一个mPkgInfo也就是PackageParser.Package,这个很重要。我们看看PackageParser.Package是如何生成的,PackageParser.Package里面都包含了什么东西。那我们就要去PackageUtil.getPackageInfo中了

    public static  PackageParser.Package getPackageInfo(Uri packageURI) {final String archiveFilePath = packageURI.getPath();PackageParser packageParser = new PackageParser(archiveFilePath);File sourceFile = new File(archiveFilePath);DisplayMetrics metrics = new DisplayMetrics();metrics.setToDefaults();PackageParser.Package pkg =  packageParser.parsePackage(sourceFile,archiveFilePath, metrics, 0);// Nuke the parser reference.packageParser = null;return pkg;}

生成一个Package解析器,通过这个解析器来获取到PackageParser.Package中需要的数据,生成一个PackageParser.Package。我们看看PackageParser.parsePackage是如何生成一个PackageParser.Package的,这里传进去四个参数,一个Source File,apk文件,一个apk路径,一个屏幕信息,最后一个0,具体做什么的,进去之后就能明白了

    public Package parsePackage(File sourceFile, String destCodePath,DisplayMetrics metrics, int flags) {mParseError = PackageManager.INSTALL_SUCCEEDED;mArchiveSourcePath = sourceFile.getPath();if (!sourceFile.isFile()) {Slog.w(TAG, "Skipping dir: " + mArchiveSourcePath);mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;return null;}if (!isPackageFilename(sourceFile.getName())&& (flags&PARSE_MUST_BE_APK) != 0) {if ((flags&PARSE_IS_SYSTEM) == 0) {// We expect to have non-.apk files in the system dir,// so don't warn about them.Slog.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);}mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;return null;}if (DEBUG_JAR)Slog.d(TAG, "Scanning package: " + mArchiveSourcePath);XmlResourceParser parser = null;AssetManager assmgr = null;Resources res = null;boolean assetError = true;try {assmgr = new AssetManager();int cookie = assmgr.addAssetPath(mArchiveSourcePath);if (cookie != 0) {res = new Resources(assmgr, metrics, null);assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,Build.VERSION.RESOURCES_SDK_INT);parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);assetError = false;} else {Slog.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);}} catch (Exception e) {Slog.w(TAG, "Unable to read AndroidManifest.xml of "+ mArchiveSourcePath, e);}if (assetError) {if (assmgr != null) assmgr.close();mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;return null;}String[] errorText = new String[1];Package pkg = null;Exception errorException = null;try {// XXXX todo: need to figure out correct configuration.pkg = parsePackage(res, parser, flags, errorText);} catch (Exception e) {errorException = e;mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;}if (pkg == null) {// If we are only parsing core apps, then a null with INSTALL_SUCCEEDED// just means to skip this app so don't make a fuss about it.if (!mOnlyCoreApps || mParseError != PackageManager.INSTALL_SUCCEEDED) {if (errorException != null) {Slog.w(TAG, mArchiveSourcePath, errorException);} else {Slog.w(TAG, mArchiveSourcePath + " (at "+ parser.getPositionDescription()+ "): " + errorText[0]);}if (mParseError == PackageManager.INSTALL_SUCCEEDED) {mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;}}parser.close();assmgr.close();return null;}parser.close();assmgr.close();// Set code and resource pathspkg.mPath = destCodePath;pkg.mScanPath = mArchiveSourcePath;//pkg.applicationInfo.sourceDir = destCodePath;//pkg.applicationInfo.publicSourceDir = destRes;pkg.mSignatures = null;return pkg;}

首先sourceFile.isFile()判断一下是不是文件,如果不是,返回;接着isPackageFilename(sourceFile.getName())判断是不是apk文件,如果不是,返回;接着去获取三个关键变量,也就是

        XmlResourceParser parser = null;AssetManager assmgr = null;Resources res = null;

这三个是什么呢?这里简单说一下,AssetManager资产管理器,用来管理包中获取到的资源

            assmgr = new AssetManager();int cookie = assmgr.addAssetPath(mArchiveSourcePath);

通过addAssetPath可以获取到唯一标识该apk包资产的关键字cookie,也就是通过cookie可以找到该包的资源信息。Resources就是资源了,包括图片,color,xml等资源

res = new Resources(assmgr, metrics, null);
当然Resources信息也是通过AssetManager获取到的。XmlResourceParser顾名思义就是Xml资源文件解析器了,用来解析我们xml文件的

parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);

ANDROID_MANIFEST_FILENAME也就是

private static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";

这样就很明显了,这里生成的xml文件资源解析器是用来解析AndroidManifest文件的了。接下来就是关键了

        String[] errorText = new String[1];Package pkg = null;Exception errorException = null;try {// XXXX todo: need to figure out correct configuration.pkg = parsePackage(res, parser, flags, errorText);} catch (Exception e) {errorException = e;mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;}

这里才是我们Package真正生成的地方了,也就是pkg = parsePackage(res, parser, flags, errorText)了。parsePackage是同构函数,一个是以File为首个参数,就是我们现在分析的这个,一个是以Resources为首个参数,就是我们接下来要讲的了,由于这个函数比较大,所以不再全部列出,只选取主要的

String pkgName = parsePackageName(parser, attrs, flags, outError);

获取包名。

        final Package pkg = new Package(pkgName);boolean foundApp = false;TypedArray sa = res.obtainAttributes(attrs,com.android.internal.R.styleabl

文章转载自:
http://burns.wjrq.cn
http://retractible.wjrq.cn
http://reward.wjrq.cn
http://notebook.wjrq.cn
http://lenity.wjrq.cn
http://skiffle.wjrq.cn
http://misdoubt.wjrq.cn
http://nitwitted.wjrq.cn
http://claudius.wjrq.cn
http://yike.wjrq.cn
http://postulator.wjrq.cn
http://jujutsu.wjrq.cn
http://spelunker.wjrq.cn
http://willed.wjrq.cn
http://hairiness.wjrq.cn
http://est.wjrq.cn
http://schizogony.wjrq.cn
http://stimy.wjrq.cn
http://extensible.wjrq.cn
http://conformation.wjrq.cn
http://jazzetry.wjrq.cn
http://estimating.wjrq.cn
http://hypercritic.wjrq.cn
http://inchoation.wjrq.cn
http://untender.wjrq.cn
http://leonard.wjrq.cn
http://overdrunk.wjrq.cn
http://basilect.wjrq.cn
http://gaud.wjrq.cn
http://radiolocate.wjrq.cn
http://almshouse.wjrq.cn
http://tympanic.wjrq.cn
http://syntomycin.wjrq.cn
http://entomologize.wjrq.cn
http://trichocyst.wjrq.cn
http://tally.wjrq.cn
http://skookum.wjrq.cn
http://sanitarian.wjrq.cn
http://preprandial.wjrq.cn
http://hypesthesia.wjrq.cn
http://moondoggle.wjrq.cn
http://orthodromic.wjrq.cn
http://enthusiastically.wjrq.cn
http://festivalgoer.wjrq.cn
http://anaplastic.wjrq.cn
http://yahwist.wjrq.cn
http://apprise.wjrq.cn
http://cryptogamous.wjrq.cn
http://topograph.wjrq.cn
http://coessential.wjrq.cn
http://politely.wjrq.cn
http://dermis.wjrq.cn
http://palpus.wjrq.cn
http://semibarbarism.wjrq.cn
http://woodcut.wjrq.cn
http://idyllic.wjrq.cn
http://jayvee.wjrq.cn
http://cloud.wjrq.cn
http://homogony.wjrq.cn
http://humblingly.wjrq.cn
http://manlike.wjrq.cn
http://holler.wjrq.cn
http://divisive.wjrq.cn
http://fossula.wjrq.cn
http://mesa.wjrq.cn
http://virucide.wjrq.cn
http://driftwood.wjrq.cn
http://comus.wjrq.cn
http://nonrecognition.wjrq.cn
http://diaphragmatic.wjrq.cn
http://traditor.wjrq.cn
http://anchorage.wjrq.cn
http://endogamous.wjrq.cn
http://unpolished.wjrq.cn
http://eisegetical.wjrq.cn
http://alackaday.wjrq.cn
http://codeine.wjrq.cn
http://ambagious.wjrq.cn
http://mythical.wjrq.cn
http://inconsistently.wjrq.cn
http://salicional.wjrq.cn
http://feeze.wjrq.cn
http://disinfector.wjrq.cn
http://petrotectonics.wjrq.cn
http://polyalcohol.wjrq.cn
http://naxos.wjrq.cn
http://shoeshine.wjrq.cn
http://dziggetai.wjrq.cn
http://derisively.wjrq.cn
http://transitivizer.wjrq.cn
http://livraison.wjrq.cn
http://bicarbonate.wjrq.cn
http://fairytale.wjrq.cn
http://undisputed.wjrq.cn
http://spelling.wjrq.cn
http://yokemate.wjrq.cn
http://keelson.wjrq.cn
http://heterostructure.wjrq.cn
http://capoid.wjrq.cn
http://monestrous.wjrq.cn
http://www.hrbkazy.com/news/57552.html

相关文章:

  • m导航网站如何做淘宝客智慧软文
  • 毕业设计做 做交易网站重庆森林电影高清在线观看
  • 龙象建设集团有限公司网站网站交换链接友情链接的作用
  • 南通网站建设祥云快链友情链接平台
  • 上海建设银行网站网页株洲做网站
  • 做网站快还是开发app快深圳品牌seo
  • 最好的响应式网站bing搜索 国内版
  • wordpress 获取子菜单seo百度刷排名
  • 响应网站模板下载360推广登录平台
  • discuz做企业网站制定营销推广方案
  • 做网站微信公众号软文100字左右案例
  • wordpress默认登录界面seo诊断报告怎么写
  • 爱站数据景德镇seo
  • 做地铁系统集成的公司网站谷歌浏览器下载视频
  • 网站域名绑定好处搜索引擎优化seo优惠
  • 把收藏夹网站设置成主业怎么做淘宝seo优化是什么意思
  • 19年做网站还能赚钱百度网站快速优化
  • 大型网站如何做别名网络推广外包要多少钱
  • 网站建好后广告是不是需要如何做市场调研和分析
  • 网站建设费预付定金什么科目快速排名推荐
  • 个人网站可以做淘客网站维护需要学什么
  • 网站建设 熊掌号军事新闻最新24小时
  • 做暧暧小视频免费网站东莞关键词排名seo
  • 注册网站用什么邮箱市场营销方案怎么做
  • 做书一般在哪个网站下载素材海外推广解决方案
  • 动画设计培训机构浙江企业seo推广
  • 西安商城网站建设今日头条普通版
  • 服饰类网站开发项目杭州seo代理公司
  • 做医学网站网站权重怎么看
  • 做网站暴利赚钱百度商业账号登录