Android Proguard存在严重问题-NoClassDefFoundError 背景

Android Proguard存在严重问题-NoClassDefFoundError 背景,android,proguard,noclassdeffounderror,Android,Proguard,Noclassdeffounderror,最近我进行了更新,出于某种原因,Proguard似乎破坏了我编写的代码,在一个非常特殊的情况下导致崩溃,尽管我没有添加任何其他库 我之所以如此确定这是Proguard的错,是因为当我在没有导出的情况下测试它时,它运行良好 问题 在看到崩溃报告的堆栈跟踪(并且亲眼看到它确实发生)之后,我运行了“proguardgui”工具,并选择使用映射文件进行回溯 遗憾的是,它没有显示代码失败的真实位置,而是显示了完全相同的堆栈。我尝试再次导出项目并使用它创建的新映射文件,但仍然得到相同的模糊堆栈跟踪 不仅如此

最近我进行了更新,出于某种原因,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)
当我选择共享一个应用程序时,就会出现这种情况。在很短的时间内,该应用程序在运行异步任务时会显示一个进度对话框,然后显示一个您希望如何共享的对话框(就像play store链接的屏幕截图一样,如果您看不到它,可以使用它)

我试过的 我尝试在多个位置添加日志,发现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),但我不相信这是问题的原因(因为我没有使用它)

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


将来如何避免此类问题?

NoClassDefFoundError通常指向构建过程中的一个问题:某些必需的类最终不会出现在应用程序中

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

-printconfiguration configuration.txt
获取ProGuard使用的完整配置,包括输入和输出。这将帮助您确定是否存在所有预期的输入jar


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

我明白了。奇怪的是,我所做的事情以某种方式解决了这个问题(将库项目与主项目合并)。即使在使用Eclipse时,使用您编写的代码也能工作吗?对于大多数开发人员来说,ProGuard在Eclipse的Android插件中似乎工作得很好。一些开发人员报告了在他们的项目中看似不相关的更改之后出现和消失的虚假问题。这对我来说意味着同步问题,但我自己从来没能重现这样的问题。我明白了。非常感谢。我希望我不会再看到这些问题。我花了几个小时试图理解它为什么会发生(我仍然不知道),并找到解决它的方法(我仍然不知道下次看到它时应该做什么)。