3

我正在编写一些使用 java 反射的代码。我正在使用这种方法扫描我的包中的某个类:

/**
 * Called to get list of classes included in the current project
 *
 * @param packageName the name of application package
 * @return array of classes' names
 */
private String[] getClassesOfPackage(String packageName) {
    ArrayList<String> classes = new ArrayList<>();
    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);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

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

最近我升级了我的Gradle版本以2.1.0尝试即时运行功能,但我注意到我的应用程序包通常String[]从这个方法返回空,并且这个方法只返回一个包内的类名称com.android.tools.fd.*

为什么我在我的应用程序包中看不到类?!

4

1 回答 1

0

如果您在 Instant Run 部署和简单安装后看到“packageCodePath”值,您可以看到该值不同。

例如,在我的项目中,我看到了这样的内容:

Instant run: /data/app/com.app-1/base.apk
Not instant run: /data/app/com.app-1.apk

之后,我在 DexFile 实例中观察了 mNameList,我很惊讶它在这两种模式中有所不同!在即时运行模式下,我只看了大约 30 节课,而不是即时运行模式。

我不知道该过程的详细信息,但我认为它是由 Instant Run 的意识形态与替换修改的类引起的。

也许我的回答对你有用。

于 2016-08-09T14:16:04.693 回答