Android 1.6 PackageParser.java 源码分析
文件目录:
android-1.6_r2\frameworks\base\core\java\android\content\pm\PackageParser.java
# PackageParser.java
1. 解析 APK 包名
 public static String parsePackageName(String packageFilePath, int flags) {
        XmlResourceParser parser = null;
        AssetManager assmgr = null;
        try {
            assmgr = new AssetManager(); // 创建 AssetManager 对象
            int cookie = assmgr.addAssetPath(packageFilePath); // 插入 安装包文件 路径
            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); // 解析 Androidmanifest.xml 文件
        } catch (Exception e) {
            if (assmgr != null) assmgr.close();
            Log.w(TAG, "Unable to read AndroidManifest.xml of "
                    + packageFilePath, e);
            return null;
        }
        AttributeSet attrs = parser;
        String errors[] = new String[1];
        String packageName = null;
        try {
            packageName = parsePackageName(parser, attrs, flags, errors);
        } catch (IOException e) {
            Log.w(TAG, packageFilePath, e);
        } catch (XmlPullParserException e) {
            Log.w(TAG, packageFilePath, e);
        } finally {
            if (parser != null) parser.close();
            if (assmgr != null) assmgr.close();
        }
        if (packageName == null) {
            Log.e(TAG, "parsePackageName error: " + errors[0]);
            return null;
        }
        return packageName;
    }
private static String parsePackageName(XmlPullParser parser,
AttributeSet attrs, int flags, String[] outError)
throws IOException, XmlPullParserException { int type;
while ((type=parser.next()) != parser.START_TAG
&& type != parser.END_DOCUMENT) {
;
} if (type != parser.START_TAG) {
outError[0] = "No start tag found";
return null;
}
if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
TAG, "Root element name: '" + parser.getName() + "'");
if (!parser.getName().equals("manifest")) {
outError[0] = "No <manifest> tag";
return null;
}
String pkgName = attrs.getAttributeValue(null, "package"); // 解析 package tag
if (pkgName == null || pkgName.length() == 0) {
outError[0] = "<manifest> does not specify package";
return null;
}
String nameError = validateName(pkgName, true); // 校验包名
if (nameError != null && !"android".equals(pkgName)) { // 过滤 "android" 包名
outError[0] = "<manifest> specifies bad package name \""
+ pkgName + "\": " + nameError;
return null;
} return pkgName.intern();
}
    private static String validateName(String name, boolean requiresSeparator) {
        final int N = name.length();
        boolean hasSep = false;
        boolean front = true;
        for (int i=0; i<N; i++) {
            final char c = name.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                front = false;
                continue;
            }
            if (!front) {
                if ((c >= '0' && c <= '9') || c == '_') {
                    continue;
                }
            }
            if (c == '.') {
                hasSep = true;
                front = true;
                continue;
            }
            return "bad character '" + c + "'";
        }
        return hasSep || !requiresSeparator
                ? null : "must have at least one '.' separator";
    }
Android 1.6 PackageParser.java 源码分析的更多相关文章
- Android Small插件化框架源码分析
		Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ... 
- Java源码分析 | CharSequence
		本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身 ... 
- Android服务之PackageManagerService启动源码分析
		了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ... 
- Java源码分析:关于 HashMap 1.8 的重大更新(转载)
		http://blog.csdn.net/carson_ho/article/details/79373134 前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap ... 
- Android线程间异步通信机制源码分析
		本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ... 
- 【Android】Handler、Looper源码分析
		一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ... 
- Android View事件分发-从源码分析
		View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ... 
- Android JobService的使用及源码分析
		Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗.本文首先介 ... 
- JAVA源码分析-HashMap源码分析(二)
		本文继续分析HashMap的源码.本文的重点是resize()方法和HashMap中其他的一些方法,希望各位提出宝贵的意见. 话不多说,咱们上源码. final Node<K,V>[] r ... 
随机推荐
- php模拟post提交请求与调用接口
			/** * 模拟post进行url请求 * @param string $url * @param string $param */ function request_post($url = '', ... 
- pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
			只要将pycharm下打开项目后: 将你运行文件(.py)的项目设置为根目录,就不会出现红色线: 
- Mybatis最入门---数据库的下载与安装
			[一步是咫尺,一步即天涯] 近期.因为工作进度调整,之前的Spring教程就先临时告一段落了,兴许找个时间继续更新,假设有那位看官想了解某个内容的,敬请留言,大家一起学习. 作为数据库工具的使用开篇. ... 
- localstorage和sessionstorage上手使用记录
			通过阅读各路大神对web存储locastorage和sessionstorage的用法解析,自己试用了一下,在此留个备忘. 在项目中,如果用到很多次storage,要存储很多数据,就要把它封装成函数了 ... 
- RancherOS(ROS)如何安装到硬盘? 并设置为用户自动登录到系统?  -a rancher.autologin=tty1
			RancherOS 安装到硬盘,一般都是通过ssh_authorized_keys 方式. ------------------------------------------- 从第一次认识到这个方 ... 
- 在Unity3d中调用外部程序及批处理文件
			如果调用外部普通应用程序, 比如notepad.exe 这样调用 static public bool ExecuteProgram(string exeFilename, string workDi ... 
- Android ScrollView 和ListView 一起使用的问题汇总
			1.ScrollView 嵌套 ListView ,touch事件的截获问题. 参考 http://www.cnblogs.com/lqminn/archive/2013/03/02/2940194 ... 
- 怎么安装ABBYY FineReader
			ABBYY FineReader是市场领先的文字识别(OCR)软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索信息,ABBYY FineReader 12是目前最新版本 ... 
- MongoDB 连接池
			http://www.cnblogs.com/huangfox/archive/2012/04/01/2428947.html http://www.iteye.com/problems/97350 
- vim在系统剪切板的复制与粘贴
			https://blog.csdn.net/zhangxiao93/article/details/53677764 
