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.0String[]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 を監視したところ、これら 2 つのモードで異なることに驚きました。インスタント実行モードでは、インスタント実行モードではなく、約 30 のクラスしか見ませんでした。

そのプロセスの詳細はわかりませんが、変更されたクラスを置き換えるという Instant Run のイデオロギーによるものだと思います。

多分私の答えはあなたにとって役に立ちました。

于 2016-08-09T14:16:04.693 に答える