Android支持Split Apks后,如何获得指定包名下的所有类

从Android5.0以后,支持多个apk动态部署,这导致以前通过单一apk获取包路径下的所有类的方法失效,不过稍微修改一下原先的代码就可以,代码如下

 1 public static final List<Class<?>> getClassesFromPackage(Context ctx, String pkgName) {
 2         List<Class<?>> rtnList = new ArrayList<Class<?>>();
 3         String[] apkPaths = ctx.getApplicationInfo().splitSourceDirs;// 获得所有的APK的路径
 4         DexFile dexfile = null;
 5         Enumeration<String> entries = null;
 6         String name = null;
 7         for (String apkPath : apkPaths) {
 8             try {
 9                 dexfile = new DexFile(apkPath);// 获得编译后的dex文件
10                 entries = dexfile.entries();// 获得编译后的dex文件中的所有class
11                 while (entries.hasMoreElements()) {
12                     name = (String) entries.nextElement();
13                     if (name.startsWith(pkgName)) {// 判断类的包名是否符合
14                         rtnList.add(Class.forName(name));
15                     }
16                 }
17             } catch (ClassNotFoundException | IOException e) {
18             } finally {
19                 try {
20                     if (dexfile != null) {
21                         dexfile.close();
22                     }
23                 } catch (IOException e) {
24                 }
25             }
26         }
27         return rtnList;
28     }

原文地址:https://www.cnblogs.com/janken/p/10588169.html

时间: 2024-08-04 18:51:04

Android支持Split Apks后,如何获得指定包名下的所有类的相关文章

java 遍历指定包名下所有的类(支持jar)

package com.shdl.htscada.utils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import 

遍历指定包名下所有的类(支持jar)(转)

支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClassLoader()获取ClassLoader实例将包名转为路径名后,做为参数传给CloassLoader.getResources(),以得到该路径下所有资源的URL;通过URL.getProtocol()方法,判断资源是在本地(file:)或是第三方jar包(jar:)内;在本地的类直接文件遍历即可;第三方jar则通过

加载指定包名下的所有类或根据类的annotation进行过滤的工具类

版权声明:本文为博主原创文章,未经博主允许不得转载.

加载指定包名下的全部类以及指定annotation进行过滤的工具类

package org.konghao.sys.kit; import java.io.File; import java.io.FileFilter; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import o

加载指定包下的所有类

package util; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEnt

获取指定包名下继承或者实现某接口的所有类(扫描文件目录和所有jar)

import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedHashSet; im

Android应用被卸载后,自动使用 浏览器打开指定连接

本文,提供"Android应用被卸载后,自动使用 浏览器打开指定连接"的方法. 原理:在安卓程序中某处,基于JNI调用C代码开启一个子进程监控应用在系统中的文件目录,一旦应用被卸载,该目录将会被系统删除,此时触发子进程执行相关代码(本例调用浏览器执行打开一个连接) 1.在安卓项目下创建jni目录 2.在jni目录下创建文件observer.c /* * Copyright (C) 2009 The Android Open Source Project * * Licensed und

Android - 支持不同的设备 - 支持不同的屏幕

Android - 支持不同的设备 - 支持不同的屏幕 Android整体上按照两大类来分类设备屏幕:尺寸和分辨率.app在设备上运行应该考虑大小和分辨率.同样的,你应该包含不同的资源来让app适应不同的屏幕大小和分辨率. 整体上有四种尺寸:小的,正常的,大的,超级大的 和四种分辨率:低分辨率(ldpi),中分辨率(mdpi),高分辨率(hdpi),超高分辨率(xhdpi) 为了声明不同屏幕的不同的布局和突变,你需要把不同的资源放在不同的文件夹下,和处理不同语言的方法一样. 同样要注意到在考虑屏

掌握android支持库

Android支持库是每个Android应用程序中必不可少的一部分,你会发现它们无处不在.支持库为开发人员提供了将Android的最新和最强大功能添加到应用程序的能力,同时保持与旧版本Android的向后兼容性.随着Android SDK的新版本不断推出,对支持库的更新也随之展开:保持最新版本并安装正确的版本是Android开发的一个重要(有时令人沮丧)的一部分.在这个博客,我希望他们揭秘支持库,帮助您升级到最新版本 版本控制 首先要明白的是如何支持库版本.我们在几个星期前与Jon Dick在X