Android 8.0 dexopt记录

本文探讨了Android 8.0中installd启动方式的变更,以及odex优化的多个场景,包括首次开机或升级、安装应用、OTA升级后的处理、系统空闲时的优化,并介绍了相关服务和接口的使用。

这里先初步看一下做odex优化的几个地方,以后再补充详细过程

一、installd的变化

首先回忆一下在7.0中installd是如何启动的:
在installd.rc中:

service installd /system/bin/installd
    class main
    socket installd stream 600 system system

这里启动installd的同时还启动了一个socket,在installd.cpp中有获取这个socket的地方android_get_control_socket

由于已经过时,其它的不再说了,下面看看8.0中是如何启动的:
在installd.rc中:

service installd /system/bin/installd
    class main

只是启动installd,进入installd看一下

[installd.cpp]
int main(const int argc, char *argv[]) {
    return android::installd::installd_main(argc, argv);
}

static int installd_main(const int argc ATTRIBUTE_UNUSED, char *argv[]) {
    ……
    if ((ret = InstalldNativeService::start()) != android::OK) {
        SLOGE("Unable to start InstalldNativeService: %d", ret);
        exit(1);
    }

    IPCThreadState::
### Android Dexopt 优化详解及常见问题解决方案 #### Dexopt 的作用 DexoptAndroid 系统中用于优化 Dex 文件的过程,主要目的是提高应用程序的启动速度和运行效率。它通过预先处理 Dex 文件中的字节码,减少首次运行时的 JIT(Just-In-Time)编译开销[^1]。 #### 优化过程 Dexopt 的优化过程包括以下几个关键阶段: 1. **验证阶段**:检查 Dex 文件的完整性与合法性,确保其符合 Dalvik 或 ART 虚拟机的要求。 2. **预处理阶段**:对 Dex 文件进行解析和转换,生成中间表示形式以便后续操作。 3. **优化阶段**:应用一系列优化技术,如方法内联、常量传播等,以减少执行时间和内存占用。 4. **生成 OAT 文件**:在 ART 环境下,Dexopt 将优化后的代码存储为 OAT(Optimized Application Transformer)文件,直接供虚拟机加载使用[^1]。 #### 常见问题及解决方案 1. **安装时间过长** 如果发现某些应用在安装过程中耗时较长,可能是由于 Dexopt 需要处理大量的 Dex 文件。可以通过减少每个 APK 中的类数量或采用多 Dex 技术来缓解此问题[^1]。 2. **启动速度慢** 应用首次启动时速度较慢可能与 Dexopt 的后台执行有关。启用 Instant Run 功能或者提前触发 Dexopt 操作可以帮助改善这一状况。 3. **内存泄漏** 在动态加载 Dex 文件时容易引发内存泄漏问题。建议使用 `PathClassLoader` 替代 `DexClassLoader`,并确保正确管理 ClassLoader 实例的生命周期[^1]。 ```java // 使用 PathClassLoader 加载 Dex 文件 PathClassLoader classLoader = new PathClassLoader(dexPath, parentClassLoader); ``` 4. **兼容性问题** 不同版本的 Android 系统对 Dex 文件的支持程度有所差异。开发时应尽量遵循官方推荐的最佳实践,并测试目标设备上的表现[^1]。 #### 示例代码 以下是一个简单的示例,展示如何在运行时动态加载 Dex 文件: ```java // 动态加载 Dex 文件 File dexOutputDir = getDir("dex", Context.MODE_PRIVATE); DexClassLoader loader = new DexClassLoader( dexInternalStoragePath.toString(), dexOutputDir.getAbsolutePath(), null, getClassLoader() ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值