2

私はJavaの反射を使用するコードを書いています。私は、このメソッドを使用して、特定のクラスのための私のパッケージをスキャンしています:Java ReflectionsはAndroidのインスタント実行では機能しません

/** 
* 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()]); 
} 

最近、私はインスタント実行機能を試すため2.1.0に私のGradleバージョンをアップグレードしたが、私は私のアプリのパッケージは通常、このメソッドから空String[]を返すことに気づきましたこのメソッドは、名前のパッケージ内のクラスのみを返しますcom.android.tools.fd.*

私のアプリパッケージにクラスが表示されないのはなぜですか?

答えて

0

Instant Run展開と単純インストールの後に「packageCodePath」値が表示される場合は、値が異なることがわかります。例えば

、私のプロジェクトで私はこのような何かを見た:私はDexFileインスタンスにmNameListのために見て、私はそれがこれらの2つのモードが異なることに驚きました。その後

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

を!インスタント・ラン・モードでは、インスタント・ラン・モードではなく、約30クラスしか見ませんでした。

私はそのプロセスの詳細はわかりませんが、私はそれが変更されたクラスを置き換えてInstant Runのイデオロギーによって引き起こしたと思います。

おそらく私の答えはあなたにとって役に立ちました。

関連する問題