繁体   English   中英

Java Reflections不适用于Android即时运行

[英]Java Reflections doesn't work with Android instant run

我正在编写一些使用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.*的包内的类com.android.tools.fd.*

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

如果在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的意识形态引起的,它取代了修改过的类。

也许我的回答对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM