文章目录
一、获取应用的 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); } } }