文件目录:

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 源码分析的更多相关文章

  1. Android Small插件化框架源码分析

    Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...

  2. Java源码分析 | CharSequence

    本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身 ...

  3. Android服务之PackageManagerService启动源码分析

    了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ...

  4. Java源码分析:关于 HashMap 1.8 的重大更新(转载)

    http://blog.csdn.net/carson_ho/article/details/79373134 前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap ...

  5. Android线程间异步通信机制源码分析

    本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...

  6. 【Android】Handler、Looper源码分析

    一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...

  7. Android View事件分发-从源码分析

    View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...

  8. Android JobService的使用及源码分析

    Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗.本文首先介 ...

  9. JAVA源码分析-HashMap源码分析(二)

    本文继续分析HashMap的源码.本文的重点是resize()方法和HashMap中其他的一些方法,希望各位提出宝贵的意见. 话不多说,咱们上源码. final Node<K,V>[] r ...

随机推荐

  1. CSS :after、before、<!DOCTYPE>

    <!DOCTYPE> <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. CSS :选择器 after,before

  2. ICMP Ping模版实现对客户端网络状态的监控

    Zabbix使用外部命令fping处理ICMP ping的请求,fping不包含在zabbix的发行版本中,需要额外去下载安装fping程序,安装完毕之后需要zabinx_server.conf中的参 ...

  3. JSP九大内置对象与Servlet学习笔记[转]

    我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...

  4. shell脚本重启tomcat

    1. 新建shell空脚本文件,如 /home/tr.sh,并设置权限 # chmod 750 /home/tr.sh 2. 设置文件形式: # sed -e 's/\^M//g' /home/tr. ...

  5. JNDI 在 J2EE 中的角色

    JNDI 在 J2EE 中的角色 Spring整合HIbernate时,三种数据库连接池的配置和比较 Tomcat 6 JNDI数据源详解 Tomcat 6 --- JNDI详解 Spring整合HI ...

  6. 树莓派挂载ntfs优盘

    步骤一:解压安装NTFS-3G,使用如下命令.    sudo apt-get install ntfs-3g 步骤二:配置挂载NTFS格式的移动硬盘 1. 首先得到NTFS分区的信息  sudo f ...

  7. 【Machine learning】余弦相似度

  8. 从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!

    i386体系的依赖.典型的libuuid1依赖问题,需要downgrade保持版本一致! amd64的rpm依赖低版本的perl-base,需要downgrade保持版本一致!

  9. 如何更改webstrom的默认端口63342

  10. git push 问题汇总

    Q:git push时卡死 这个问题找的快要放弃的时候... A: git config --global http.postBuffer [via] Q:git push 报错 Counting o ...