Java反射与Android即时运行不兼容。

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.*的包中的类。为什么我看不到我的应用程序包中的类?!
1个回答

0
如果您在使用即时运行部署和简单安装后看到“packageCodePath”值,您会发现这些值是不同的。
例如,在我的项目中,我看到了类似于以下内容的东西:
Instant run: /data/app/com.app-1/base.apk
Not instant run: /data/app/com.app-1.apk

之后,我观察了DexFile实例中的mNameList,并惊讶地发现它在这两种模式下有所不同!在即时运行模式下,我只观察了大约30个类,而在非即时运行模式下则没有。

我不知道这个过程的深层细节,但我认为这是即时运行的思想,通过替换修改后的类来实现。

也许我的答案对你有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接