Proguard的严重问题 - NoClassDefFoundError

时间:2014-05-06 21:48:45

标签: android proguard noclassdeffounderror

背景

最近我更新了my app,由于某些原因,Proguard似乎破坏了我所制作的代码,导致特定情况下的崩溃,即使我没有添加任何其他库。

我之所以确定这是Proguard的错,是因为当我测试它而不导出它时,它运行正常。

问题

在看到崩溃报告的堆栈跟踪(并且看到它确实发生了,我自己)之后,我运行了“proguardgui”工具并选择使用映射文件进行回溯。

可悲的是,它没有显示代码失败的真实位置,而是显示完全相同的堆栈。我试图再次导出项目并使用由它创建的新映射文件,但我仍然得到相同的混淆堆栈跟踪。

不仅如此,异常本身也很成问题:java.lang.NoClassDefFoundError。

这是堆栈跟踪,但我不认为它是可读的:

java.lang.NoClassDefFoundError: com.lb.app_manager.utils.r
at com.lb.app_manager.utils.e.c(Unknown Source)
at com.lb.app_manager.activities.app_list_activity.AppListActivity.onContextItemSelected(Unknown Source)
at android.app.Activity.onMenuItemSelected(Activity.java:2620)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(Unknown Source)
at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(Unknown Source)
at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:3864)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
at android.widget.AbsListView$3.run(AbsListView.java:3638)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:133)
at dalvik.system.NativeStart.main(Native Method)

当我选择共享应用程序时会出现这种情况,该应用程序在运行AsyncTask时会在很短的时间内显示进度对话框,然后显示您希望如何共享的对话框(就像在游戏的屏幕截图中一样)商店链接,如果您看不到,请提供here

我尝试了什么

我试图在多个地方添加日志,并发现AsyncTask运行正常,但它没有达到“onPostExecute”。我知道这一点,因为我把日志放在“doInBackground”的末尾和“onPostExecute”的开头。

当我删除“onPostExecute”的大部分代码时,这甚至更奇怪了,现在我只有这个:

protected void onPostExecute(final Void result)
  {
  Log.d("Applog","onPostExecute 0");
  super.onPostExecute(result);
  Log.d("Applog","onPostExecute 1");
  progressDialog.dismiss();
  }

它甚至没有以这种方式到达第一行。

最后,我决定合并两个项目(我之前发过几个版本),这样我就不会有任何Android库项目了。只有一个。

我还删除了一个看起来没有被使用过的库(Apache commons),但我无法相信这是问题的原因(因为我没有使用它)。

问题

为什么会出现这样的问题?

将来我怎样才能避免这样的问题?

1 个答案:

答案 0 :(得分:1)

NoClassDefFoundError通常指向构建过程中的问题:某些所需的类不会在您的应用程序中结束。

ProGuard在构建日志中打印出有关它读取的输入jar和它写入的输出jar的信息。您也可以指定

-printconfiguration configuration.txt

获取ProGuard使用的完整配置,包括输入和输出。这可以帮助您找出是否存在所有预期的输入罐。

如果您正在使用Eclipse构建应用程序,那么当可能尚未将所有已编译的文件写入磁盘时,您可能会遇到似乎运行ProGuard的同步问题。这个神秘的问题已被报道过几次,但仍未解决。然后你应该尝试使用Ant或Gradle。