【问题标题】:Java Reflections doesn't work with Android instant runJava 反射不适用于 Android 即时运行
【发布时间】:2016-10-01 13:40:01
【问题描述】:

我正在编写一些使用 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[],并且该方法仅返回名称为@ 的包内的类987654325@

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

【问题讨论】:

    标签: android android-studio gradle reflections android-instant-run


    【解决方案1】:

    如果您在 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 的意识形态和替换修改的类引起的。

    也许我的回答对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2011-12-20
      相关资源
      最近更新 更多