这是我的代码:
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)
-------------------------------
答案 0 :(得分:0)
例外不是缺少java.io.File
,而是关于缺少类的调用
来自您自己的包 - mypakage.d.a.b.d
。
这当然不是您的某个课程的名称。您的代码似乎是混淆的,I.E。你是(或你的IDE)在编译代码上运行Proguard之前将其安装在设备上。
Proguard对您的代码执行了很多更改。其中两个相关变化是:
更改类名(因此.d.a.b.d)。
删除Proguard的感觉是一个死代码,I.E。从未被调用的代码。
Proguard的错误配置可能导致您使用的课程被删除。
所以请:
禁用Proguard并尝试运行应用程序而不会混淆它,因此我们可以验证Proguard确实是罪魁祸首。
Use ReTrace to deobfuscate mypakage.d.a.b.d
,因此您可以知道遗失班级的真实姓名。
粘贴我们MyUtil.java第210行的内容。
粘贴Proguard的配置文件(proguard.conf)。