【Android 组件化】路由组件 ( 运行时获取 注解处理器 生成的路由表 )(一)

简介: 【Android 组件化】路由组件 ( 运行时获取 注解处理器 生成的路由表 )(一)

文章目录

一、获取应用的 APK

二、获取所有 APK 中 kim.hsl.router 包的类

三、获取其它 Module 中的路由表

四、Router 路由加载类代码

五、博客资源



组件化系列博客 :


【Android 组件化】从模块化到组件化

【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )

【Android 组件化】路由组件 ( 路由组件结构 )

【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )

【Android 组件化】路由组件 ( 注解处理器参数选项设置 )

【Android 组件化】路由组件 ( 构造路由表中的路由信息 )

【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )

【Android 组件化】路由组件 ( 组件间共享的服务 )

【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )





一、获取应用的 APK


获取应用的 APK 文件 :


首先 , 获取 ApplicationInfo 应用信息 ;


ApplicationInfo applicationInfo = null;
try {
    applicationInfo = mContext.getPackageManager().getApplicationInfo(mContext
            .getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}


然后 , 从应用中获取 APK 的安装路径 ;


// 使用集合存放应用安装的 APK 文件
List<String> sourcePaths = new ArrayList<>();
// 一般情况下 , 一个应用只有一个安装 APK
sourcePaths.add(applicationInfo.sourceDir);


最后 , 考虑 instant run 的情况 , 可能存在多个 APK 文件 , 如果有多个 , 也一并放入路径字符串集合中 ;


// 如果是 instant run 形式安装的 , 则有多个 APK 文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    if (null != applicationInfo.splitSourceDirs) {
        sourcePaths.addAll(Arrays.asList(applicationInfo.splitSourceDirs));
    }
}



代码示例 :


ApplicationInfo applicationInfo = null;
try {
    applicationInfo = mContext.getPackageManager().getApplicationInfo(mContext
            .getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
// 使用集合存放应用安装的 APK 文件
List<String> sourcePaths = new ArrayList<>();
// 一般情况下 , 一个应用只有一个安装 APK
sourcePaths.add(applicationInfo.sourceDir);
// 如果是 instant run 形式安装的 , 则有多个 APK 文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    if (null != applicationInfo.splitSourceDirs) {
        sourcePaths.addAll(Arrays.asList(applicationInfo.splitSourceDirs));
    }
}





二、获取所有 APK 中 kim.hsl.router 包的类


获取所有 APK 中 kim.hsl.router 包的类 :


首先 , 根据 APK 的地址 , 创建 DexFile 对象 ;


// 获取 APK 下的 dex 文件
DexFile dexfile = null;
try {
    dexfile = new DexFile(path);
} catch (IOException e) {
    e.printStackTrace();
}


然后 , 遍历 DexFile 对象中的所有的类 , 调用 dexfile.entries() 获取 Enumeration<String> 对象进行遍历 , 将 “kim.hsl.router” 包名下的类记录下来 ;


Enumeration<String> dexEntries = dexfile.entries();
// 遍历 DEX 文件中的所有的类
while (dexEntries.hasMoreElements()) {
    String className = dexEntries.nextElement();
    if (className.startsWith("kim.hsl.router")) {
        classNames.add(className);
    }
}


代码示例 :


/*
    根据获取所有 APK 下的类
    根据 kim.hsl.router 包名, 获取该包名下的所有路由类
 */
// 获取查找的 kim.hsl.router 包下的类 的 类名
Set<String> classNames = new HashSet<>();
// 遍历所有的 APK 路径 , 查找其中的 DEX 中的类
for (final String path : sourcePaths) {
    // 获取 APK 下的 dex 文件
    DexFile dexfile = null;
    try {
        dexfile = new DexFile(path);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Enumeration<String> dexEntries = dexfile.entries();
    // 遍历 DEX 文件中的所有的类
    while (dexEntries.hasMoreElements()) {
        String className = dexEntries.nextElement();
        if (className.startsWith("kim.hsl.router")) {
            classNames.add(className);
        }
    }
}


目录
相关文章
|
2天前
|
存储 设计模式 数据库
构建高效的安卓应用:探究Android Jetpack架构组件
【4月更文挑战第20天】 在移动开发的世界中,构建一个既高效又可维护的安卓应用是每个开发者追求的目标。随着Android Jetpack的推出,Google为开发者提供了一套高质量的库、工具和指南,以简化应用程序开发流程。本文将深入探讨Jetpack的核心组件之一——架构组件,并展示如何将其应用于实际项目中,以提升应用的响应性和稳定性。我们将通过分析这些组件的设计原则,以及它们如何协同工作,来揭示它们对于构建现代化安卓应用的重要性。
|
2天前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
15 4
|
1天前
|
Android开发 算法 架构师
android的基础ui组件,这些知识点你会吗
android的基础ui组件,这些知识点你会吗
android的基础ui组件,这些知识点你会吗
|
1天前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
2天前
|
Android开发
Android 修改盒子路由方式 Static / DHCP
Android 修改盒子路由方式 Static / DHCP
16 2
|
2天前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
26 0
|
2天前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
【4月更文挑战第17天】Android Jetpack是Google提供的一套工具集,助力开发者高效、稳定地开发Android应用。它包含架构、UI、行为和基础组件,简化了后台任务、导航和生命周期管理,使开发者能专注于创新。随着不断更新,如CameraX的推出,掌握Jetpack对开发者面试和工作至关重要。
24 0
|
2天前
|
存储 数据库 Android开发
使用Android Jetpack组件加速开发流程
【4月更文挑战第14天】Android Jetpack是为提升开发速度和代码质量而生的组件集合,包括`ViewModel`、`LiveData`、`RecyclerView`、`Room`、`WorkManager`等,它们遵循最新设计原则和最佳实践。例如,`RecyclerView`优化列表显示,`Room`简化数据库操作,`WorkManager`处理后台任务,`ViewModel`和`LiveData`分离业务和UI逻辑。此外,`Navigation`和`Paging`分别优化用户导航和数据加载。通过这些组件,开发者能更高效地构建高性能应用,值得学习和使用。
|
2天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
2天前
|
Java Android开发
Android四大组件之Activity组件
Android四大组件之Activity组件