JAVA基础 - ArrayMap

ArrayMap

优势:

  1. 相比 hashMap 不会重建 hash映射,不会创建额外的对象。
    1. 删除时 缩小存储当前数组 (重点)
      1. remove()
      2. removeAt()
// 满足 大于  (BASE_SIZE * 2) 且  长度 小于 mHashes 三分之一
if (mHashes.length > (BASE_SIZE * 2) && mSize < mHashes.length / 3) {
   
   
### PackageManagerService.java 源码解析 #### 1. **类定义与初始化** `PackageManagerService` 是 Android 系统中的核心组件之一,负责管理应用程序包的相关操作。其主要功能包括但不限于应用的安装、卸载以及权限分配等。 该服务的核心入口位于 `main` 方法中[^2]: ```java public static PackageManagerService main(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { PackageManagerService m = new PackageManagerService(context, installer, factoryTest, onlyCore); m.enableSystemUserPackages(); ServiceManager.addService("package", m); // 将自己注册为系统服务 return m; } ``` 上述代码展示了如何创建并初始化 `PackageManagerService` 实例,并将其作为 `"package"` 名称的服务添加到系统的 Binder 服务列表中。 --- #### 2. **Binder 通信机制** 为了支持跨进程调用 (IPC),`PackageManagerService` 使用了 AIDL 定义接口文件 `IPackageManager.aidl` 来描述远程方法签名。AIDL 工具会自动将 `.aidl` 文件转换成 Java 接口和服务端代理类 `IPackageManager.Stub` 和客户端代理类 `IPackageManager.Stub.Proxy`[^3]。 这种设计使得其他进程可以通过 Binder 调用 `PackageManagerService` 提供的功能。 --- #### 3. **核心功能模块** 以下是 `PackageManagerService` 的几个重要功能模块及其作用: - **Package Installation**: 应用程序的安装过程涉及多个子阶段,例如解压 APK 文件、验证签名、存储元数据等。这些逻辑通常封装在内部辅助类中,如 `Installer` 或者 `PackageParser`。 - **Permission Management**: 对于每个已安装的应用程序,`PackageManagerService` 都会维护一份详细的权限记录表。它还提供了 API 给外部调用来查询某个特定 UID 是否具有某项权限。 - **Application Querying**: 开发人员可以利用此服务来获取设备上所有已知软件包的信息,或者针对单个软件包执行更细致的操作(例如读取图标资源路径)。 --- #### 4. **关键成员变量及方法** 下面列举了一些重要的字段和函数原型: - 成员变量: - `Context mContext`: 表示当前运行环境上下文对象。 - `final ArrayMap<String, PackageParser.Package> mPackages`: 存储已经加载过的所有 package 数据结构实例集合。 - 主要方法: - `void scanDirLI(String path, int parseFlags, long currentTime)`:扫描指定目录下的 .apk 文件并尝试更新数据库条目。 - `boolean installPackageAsUser(Uri packageFile, @Nullable InstallOption options, int flags, String installerPackageName, UserHandle user)`:实现标准形式下的一次完整的 app setup 流程[^1]。 --- #### 5. **总结** 综上所述,`PackageManagerService` 不仅承担着基础性的职责——即维持整个平台对于第三方开发者提交作品的认知体系;而且还在安全性保障方面扮演不可替代的角色。通过深入理解它的运作原理可以帮助我们更好地掌握安卓框架底层工作机制。 ```java // 示例代码片段展示部分功能 @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args){ synchronized(this){ final Iterator<PackageSetting> it = mSettings.mPackages.values().iterator(); while(it.hasNext()){ PackageSetting ps = it.next(); pw.println(ps.name+" : "+ps.codePathString); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值