0

これは私のコードです:

 public static void deleteFile(stPath){
     File yourDir = new File(stPath); **// Line 210 in MyUtil.java**
    //
    ....
    ///
}

そして私はそれを AsynTask メソッドで呼び出します:

private class Backup extends AsyncTask<String, Void, Exception> {
        @Override
        protected void onPreExecute() {
            showProgressDialog(StringUtil.getString(R.string.backucking));
        }

        @Override
        protected Exception doInBackground(String... params) {
            deleteFile(stPath);
            return null;
        }

        @Override
        protected void onPostExecute(Exception result) {
          showProgressDialog(StringUtil.getString(R.string.downloading));
        }
    }

実行すると、エラー java.lang.NoClassDefFoundError がスローされます。Android は java.io.File を見つけられませんか?? 理解できない。説明してもらえますか?

これは私のlogcatです:

java.lang.RuntimeException: An error occured while executing doInBackground()

--------- Stack trace ---------

    android.os.AsyncTask$3.done(AsyncTask.java:299)
    java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    java.util.concurrent.FutureTask.run(FutureTask.java:137)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    java.lang.Thread.run(Thread.java:856)
-------------------------------

--------- Cause ---------

java.lang.NoClassDefFoundError: mypakage/d/a/b/d
    com.mypakage.util.b.e(MyUtil.java:210)
    com.mypakage.view.main.f.a(OneView.java:1046)
    com.mypakage.view.main.f.doInBackground(OneView.java:1)
    android.os.AsyncTask$2.call(AsyncTask.java:287)
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    java.util.concurrent.FutureTask.run(FutureTask.java:137)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    java.lang.Thread.run(Thread.java:856)
-------------------------------
4

1 に答える 1

0

例外は missing についてjava.io.Fileではなく、独自のパッケージから欠落しているクラスへの呼び出しについてです - mypakage.d.a.b.d

もちろん、これはクラスの名前ではありません。あなたのコードは難読化されているようです。つまり、デバイスにインストールする前に、コンパイルされたコードで Proguard を実行している (または IDE が実行している) ようです。

Proguard は、コードに多くの変更を加えます。関連する変更点は次の 2 つです。

  1. クラス名の変更 (したがって .dabd)。

  2. Proguard が感じるものを削除することは、一度も呼び出されたことのないデッド コード、つまり IE コードです。

それにもかかわらず、Proguard の構成ミスにより、使用しているクラスが削除される可能性があります。

だからお願い:

  1. Proguard を無効にして、難読化せずにアプリを実行してみます。これにより、Proguard が実際に原因であることを確認できます。

  2. ReTrace を使用して難読化を解除する mypakage.d.a.b.dと、欠落しているクラスの実際の名前がわかります。

  3. MyUtil.java の 210 行目にあるものを貼り付けます。

  4. Proguard の構成ファイル (proguard.conf) を貼り付けます。

于 2013-10-24T10:00:32.897 に答える