在安卓系统中查找软件包中的所有类

2022-09-03 03:46:16

如何在Android上找到软件包中的所有类?我使用PathClassLoader,但它总是返回一个空枚举?

附加信息

已尝试建议的反射方法。关于反射库的几个要点。通过maven central提供的库与Android不兼容,并给出dex错误。我必须包含源代码并编译dom4j,java-assist。

反射的问题,我最初的解决方案是Android中的PathClassLoader返回包的空枚举。

方法的问题在于Android中的getResource总是返回空枚举。

final String resourceName = aClass.getName().replace(".", "/") + ".class";

for (ClassLoader classLoader : loaders) {
      try {
            final URL url = classLoader.getResource(resourceName);
            if (url != null) {
                final String normalizedUrl = url.toExternalForm().substring(0, url.toExternalForm().lastIndexOf(aClass.getPackage().getName().replace(".", "/")));
                return new URL(normalizedUrl);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
   }

答案 1

使用DexFile列出apk中的所有类:

    try {
        DexFile df = new DexFile(context.getPackageCodePath());
        for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) {
            String s = iter.nextElement();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

其余的是使用正则表达式或其他方法来过滤掉所需的类。


答案 2

实际上我找到了解决方案。感谢您的回复

private String[] getClassesOfPackage(String packageName) {
    ArrayList<String> classes = new ArrayList<String>();
    try {
        String packageCodePath = getPackageCodePath();
        DexFile df = new DexFile(packageCodePath);
        for (Enumeration<String> iter = df.entries(); iter.hasMoreElements(); ) {
            String className = iter.nextElement();
            if (className.contains(packageName)) {
                classes.add(className.substring(className.lastIndexOf(".") + 1, className.length()));
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return classes.toArray(new String[classes.size()]);
}

在 Android 5.0 Lolipop 上测试


推荐