Proguard的似乎以除去包含在该路径的整个包路径、Proguard

2023-09-07 14:08:32 作者:北络

我用Proguard的混淆我的code,并使其更小。我建立使用Eclipse,并有一段时间了。我最近有一个版本,在调试版本,我想释放的伟大工程。我一直试图让这个做了大部分的最后一天,我不断收到以下错误,当我尝试使用发布版本(我能产生更多的,如​​果它帮助)来运行我的code

I use Proguard to obfuscate my code, and make it smaller. I build using Eclipse, and have for some time. I've recently had a build that works great in the debug version, which I'm trying to release. I've been trying to get this done for most of the last day, and I keep getting the following error when I try to run my code using the released build (I can produce more if it helps).

16 02-25:39:58.844:E / AndroidRuntime(27593):产生的原因:  抛出java.lang.ClassNotFoundException:找不到类  在路径com.kd7uiy.hamfinder.MainActivity:DexPathList [zip文件  \"/data/app/com.kd7uiy.hamfinder-2.apk\"],nativeLibraryDirectories=[/data/app-lib/com.kd7uiy.hamfinder-2,  /供应商/ lib中/系统/ lib目录]

02-25 16:39:58.844: E/AndroidRuntime(27593): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.kd7uiy.hamfinder.MainActivity" on path: DexPathList[[zip file "/data/app/com.kd7uiy.hamfinder-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.kd7uiy.hamfinder-2, /vendor/lib, /system/lib]]

真正奇怪的是,我没有改变我的proguard的文件,至少不是我第一次这样做。因为我已经在玩它,看看我是否能得到任何得到它的工作,但似乎没有这样的伎俩。由于这个版本,我添加了一个新的图书馆我的code基地,谷歌地图工具库。我最后的版本只是在几天前。

The really strange thing is, I didn't change my proguard file, at least not the first time I did this. I've since been playing with it, to see if I can get anything to get it to work, but nothing seems to do the trick. Since this build, I have added a new library to my code base, the Google Maps utility library. My last build was only a few days ago.

尝试解决这个问题,我发现有不路径列表上显示整个文件夹。我看到在编译的二进制类此文件夹,但他们没有生存的过程。如果我停止使用ProGuard,如预期的发行版本的作品。

Trying to troubleshoot this issue, I've found that there is an entire folder that doesn't appear on the path list. I see this folder in the compiled binary classes, but they don't survive the process. If I stop using Proguard, the release version works as intended.

我的code依赖于6包是我在 / src目录目录。我没有显著改变这种结构对于此版本,虽然我可能添加了一个或两个文件到不同的文件夹,并可能已搬到一个或两个文件夹。 6包是:

My code relies on 6 packages that are in my /src directory. I did not significantly alter this structure for this release, although I probably added a file or two to various folders, and might have moved a folder or two. The 6 packages are:

com.kd7uiy.hamfinder
com.kd7uiy.hamfinder.dialogs
com.kd7uiy.hamfinder.ObserverOutPairs
com.kd7uiy.hamfinder.Subjects
com.kd7uiy.library
com.robobunny

这些,我可以找到以下的包没有直接的证据我ProGuard的映射文件,至少在这个特定的审判

Of these, I can find no direct evidence of the following packages in my proguard mapping file, at least for this particular trial

com.kd7uiy.hamfinder
com.kd7uiy.hamfinder.ObserverOutPairs
com.kd7uiy.hamfinder.Subjects

有些还引用了几个变量名,但被包括在整个包装没有证据。我检查了.dex文件,其中不包含丢失的包无论是。我要补充,有时看似随意一些其他的包都会出现,但从来没有在 com.kd7uiy.hamfinder ,那里有我MainActivity所在。有时,他们没有出现。

Some have a few variable names referenced, but not evidence of the entire package being included. I've checked the .dex file, which does not contain the missing packages either. I should add, sometimes seemingly randomly some of the other packages will appear, but never the com.kd7uiy.hamfinder, where my MainActivity resides. Sometimes none of them appear.

下面是我的project.properties文件:

Here's my project.properties file:

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-19
android.library.reference.1=..\\..\\..\\Documents\\GitHub\\android-maps-utils\\library
android.library.reference.2=..\\..\\..\\..\\..\\Program Files (x86)\\Android\\android-sdk\\extras\\android\\support\\v7\\appcompat
android.library.reference.3=..\\..\\..\\..\\..\\Program Files (x86)\\Android\\android-sdk\\extras\\google\\google_play_services\\libproject\\google-play-services_lib
android.library.reference.4=..\\..\\..\\Documents\\GitHub\\android-styled-dialogs\\library\\src\\main
android.library.reference.5=..\\..\\..\\Documents\\GitHub\\drag-sort-listview\\library

和我原来的ProGuard-project.txt文件,它已被证明无法正常工作。

And my original proguard-project.txt file, which has been shown not to work.

-keep class com.kd7uiy.hamfinder.MainSettingsActivity$GeneralPreferenceFragment
-keep class com.kd7uiy.hamfinder.MainSettingsActivity$LocationPreferenceFragment
-keep class com.android.vending.billing.**
-keep class jsqlite.** { *;}
-ignorewarnings

我做了改变,增加了对Proguard的适当的谷歌地图所需的更改也是如此。但是都没有成功。

I did change it to add the appropriate Google Maps required changes for Proguard as well. Neither worked.

-keep class com.kd7uiy.hamfinder.MainSettingsActivity$GeneralPreferenceFragment
-keep class com.kd7uiy.hamfinder.MainSettingsActivity$LocationPreferenceFragment
-keep class com.android.vending.billing.**
-keep class jsqlite.** { *;}
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

#-keep class com.kd7uiy.hamfinder.AbstractReverseGeoCoder
-keep class com.kd7uiy.hamfinder.AbstractWebReverseGeoCoder

-dontwarn java.awt.**

-ignorewarnings

有关参考,这里是我的ProGuard-android.txt文件,在正确的位置找到。

For reference here's my proguard-android.txt file, found in the correct location.

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

下面是我的文件快照

这是我的构建路径

纵观一些其他文件,我已经看到了 /bin/proguard.txt 文件中的文件的证据,但他们似乎只是后消失。编译大小没有明显小下去,但可能是因为我有了更多的非code比东西code,它会是很难发现的几个java文件的差异。这里就是整个/bin/proguard.txt文件。

Looking at some other files, I have seen evidence of the files in the /bin/proguard.txt file, but they just seem to disappear after that. The compiled size isn't noticeably smaller either, but that could be because I have far more non-code stuff than code, it'd be hard to detect a difference of a few java files. Here's the entire /bin/proguard.txt file.

# view res/layout/activity_main.xml #generated:14
-keep class android.support.v4.view.ViewPager { <init>(...); }

# view large-land\res/layout-large-land/activity_main.xml #generated:2
# view large-port\res/layout-large-port/activity_main.xml #generated:2
# view res/layout/activity_main.xml #generated:1
# view xlarge-land\res/layout-xlarge-land/activity_main.xml #generated:2
# view xlarge-port\res/layout-xlarge-port/activity_main.xml #generated:2
-keep class android.support.v4.widget.DrawerLayout { <init>(...); }

# view res/layout/abc_action_menu_item_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ActionMenuItemView { <init>(...); }

# view res/layout/abc_action_menu_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ActionMenuView { <init>(...); }

# view res/layout/abc_expanded_menu_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ExpandedMenuView { <init>(...); }

# view res/layout/abc_list_menu_item_layout.xml #generated:17
# view res/layout/abc_popup_menu_item_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ListMenuItemView { <init>(...); }

# view res/layout/abc_action_bar_decor_include.xml #generated:19
# view res/layout/abc_action_bar_decor_include.xml #generated:47
# view res/layout/abc_action_bar_decor_overlay.xml #generated:30
# view res/layout/abc_action_bar_decor_overlay.xml #generated:53
-keep class android.support.v7.internal.widget.ActionBarContainer { <init>(...); }

# view res/layout/abc_action_bar_decor_include.xml #generated:31
# view res/layout/abc_action_bar_decor_overlay.xml #generated:41
# view res/layout/abc_action_mode_bar.xml #generated:19
-keep class android.support.v7.internal.widget.ActionBarContextView { <init>(...); }

# view res/layout/abc_action_bar_decor_overlay.xml #generated:17
-keep class android.support.v7.internal.widget.ActionBarOverlayLayout { <init>(...); }

# view res/layout/abc_action_bar_decor_include.xml #generated:25
# view res/layout/abc_action_bar_decor_overlay.xml #generated:36
-keep class android.support.v7.internal.widget.ActionBarView { <init>(...); }

# view res/layout/abc_action_bar_home.xml #generated:17
-keep class android.support.v7.internal.widget.ActionBarView$HomeView { <init>(...); }

# view res/layout/abc_action_bar_tabbar.xml #generated:17
# view res/layout/abc_activity_chooser_view.xml #generated:19
-keep class android.support.v7.internal.widget.LinearLayoutICS { <init>(...); }

# view v11\res/layout-v11/abc_action_bar_decor.xml #generated:17
-keep class android.support.v7.internal.widget.NativeActionModeAwareLayout { <init>(...); }

# view res/layout/abc_action_bar_tab.xml #generated:17
-keep class android.support.v7.internal.widget.ScrollingTabContainerView$TabView { <init>(...); }

# view res/layout/abc_search_view.xml #generated:85
-keep class android.support.v7.widget.SearchView$SearchAutoComplete { <init>(...); }

# view AndroidManifest.xml #generated:72
-keep class com.google.analytics.tracking.android.CampaignTrackingReceiver { <init>(...); }

# view AndroidManifest.xml #generated:70
-keep class com.google.analytics.tracking.android.CampaignTrackingService { <init>(...); }

# view AndroidManifest.xml #generated:56
-keep class com.google.android.gms.ads.AdActivity { <init>(...); }

# view large-land\res/layout-large-land/activity_main.xml #generated:13
# view large-port\res/layout-large-port/activity_main.xml #generated:13
# view res/layout/activity_main.xml #generated:26
# view xlarge-land\res/layout-xlarge-land/activity_main.xml #generated:13
# view xlarge-port\res/layout-xlarge-port/activity_main.xml #generated:15
-keep class com.google.android.gms.ads.AdView { <init>(...); }

# view res/layout/google_map_dialog_preference.xml #generated:7
-keep class com.google.android.gms.maps.MapFragment { <init>(...); }

# view res/layout/google_map.xml #generated:2
# view res/layout/google_map_support_dialog_preference.xml #generated:7
-keep class com.google.android.gms.maps.SupportMapFragment { <init>(...); }

# view res/layout/text_bubble.xml #generated:8
-keep class com.google.maps.android.ui.RotationLayout { <init>(...); }

# view large-land\res/layout-large-land/activity_main.xml #generated:24
# view large-port\res/layout-large-port/activity_main.xml #generated:24
# view xlarge-land\res/layout-xlarge-land/activity_main.xml #generated:24
# view xlarge-port\res/layout-xlarge-port/activity_main.xml #generated:26
-keep class com.kd7uiy.hamfinder.LocationDisplayFragment { <init>(...); }

# view large-land\res/layout-large-land/activity_main.xml #generated:34
# view large-port\res/layout-large-port/activity_main.xml #generated:44
# view xlarge-land\res/layout-xlarge-land/activity_main.xml #generated:35
# view xlarge-port\res/layout-xlarge-port/activity_main.xml #generated:46
-keep class com.kd7uiy.hamfinder.LogBookFragment { <init>(...); }

# view AndroidManifest.xml #generated:40
-keep class com.kd7uiy.hamfinder.MainActivity { <init>(...); }

# view AndroidManifest.xml #generated:49
-keep class com.kd7uiy.hamfinder.MainSettingsActivity { <init>(...); }

# view res/xml/pref_location.xml #generated:43
-keep class com.kd7uiy.hamfinder.MapDialogPreference { <init>(...); }

# view large-land\res/layout-large-land/activity_main.xml #generated:45
# view large-port\res/layout-large-port/activity_main.xml #generated:33
# view xlarge-land\res/layout-xlarge-land/activity_main.xml #generated:47
# view xlarge-port\res/layout-xlarge-port/activity_main.xml #generated:35
-keep class com.kd7uiy.hamfinder.dialogs.SimpleLogFragment { <init>(...); }

# view res/layout/list_item_simple_checkable.xml #generated:3
# view v11\res/layout-v11/list_item_simple_checkable.xml #generated:3
-keep class com.kd7uiy.library.CheckableLinearLayout { <init>(...); }

# view AndroidManifest.xml #generated:59
-keep class com.kd7uiy.library.ManageAddOnPurchaseActivity { <init>(...); }

# view res/layout/mistake_form.xml #generated:14
-keep class com.kd7uiy.library.MapSpinner { <init>(...); }

# view res/layout/offline_map_dialog_preference.xml #generated:6
-keep class com.kd7uiy.library.SimpleMapView { <init>(...); }

# view res/xml/pref_general.xml #generated:19
# view res/xml/pref_general.xml #generated:26
# view res/xml/pref_location.xml #generated:4
-keep class com.kd7uiy.library.SortableListPreference { <init>(...); }

# view res/layout/wise_sayings_fragment.xml #generated:2
-keep class com.kd7uiy.library.WiseSayings { <init>(...); }

# view res/layout/sort_list_array_dialog_preference.xml #generated:2
-keep class com.mobeta.android.dslv.DragSortListView { <init>(...); }

# view res/xml/pref_location.xml #generated:12
# view res/xml/pref_location.xml #generated:20
# view res/xml/pref_location.xml #generated:28
-keep class com.robobunny.SeekBarPreference { <init>(...); }

我也试过在禁用 ignorewarnings 标志进行编译。列出的错误是巨大的,但这里是他们的取样,从结尾:

I've also tried compiling with the ignorewarnings flag disabled. The errors listed are huge, but here's a sampling of them, from the end:

[2014-02-26 10:03:37 - HamFinder] Proguard returned with error code 1. See console
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MainActivity: can't find superclass or interface com.kd7uiy.hamfinder.LogBookFragment$OnEditView
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MapQuestReverseCoder: can't find superclass or interface com.kd7uiy.hamfinder.AbstractWebReverseGeoCoder
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.OfflineLocator: can't find superclass or interface com.kd7uiy.hamfinder.AbstractReverseGeoCoder
[2014-02-26 10:03:37 - HamFinder] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced class com.google.android.gms.R
...Continues like this. My searching shows mainly R files missing, although I did see this:
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MainActivity: can't find referenced class com.kd7uiy.hamfinder.MainActivity$2
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MainActivity: can't find referenced class com.kd7uiy.hamfinder.MainActivity$2
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MainActivity: can't find referenced class com.kd7uiy.hamfinder.MainActivity$3
[2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MainActivity: can't find referenced class com.kd7uiy.hamfinder.MainActivity$3
...
[2014-02-26 10:03:37 - HamFinder] Warning: eu.inmite.android.lib.dialogs.SimpleTimePickerDialogFragment: can't find referenced class eu.inmite.android.lib.dialogs.R$layout
[2014-02-26 10:03:37 - HamFinder] Warning: eu.inmite.android.lib.dialogs.SimpleTimePickerDialogFragment: can't find referenced class eu.inmite.android.lib.dialogs.R$layout
[2014-02-26 10:03:37 - HamFinder] Warning: eu.inmite.android.lib.dialogs.SimpleTimePickerDialogFragment: can't find referenced class eu.inmite.android.lib.dialogs.R
[2014-02-26 10:03:37 - HamFinder] Warning: there were 678 unresolved references to classes or interfaces.
[2014-02-26 10:03:37 - HamFinder]          You may need to add missing library jars or update their versions.
[2014-02-26 10:03:37 - HamFinder]          If your code works fine without the missing classes, you can suppress
[2014-02-26 10:03:37 - HamFinder]          the warnings with '-dontwarn' options.
[2014-02-26 10:03:37 - HamFinder]          (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
[2014-02-26 10:03:37 - HamFinder] Warning: there were 11 unresolved references to program class members.
[2014-02-26 10:03:37 - HamFinder]          Your input classes appear to be inconsistent.
[2014-02-26 10:03:37 - HamFinder]          You may need to recompile the code.
[2014-02-26 10:03:37 - HamFinder]          (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
[2014-02-26 10:03:37 - HamFinder] java.io.IOException: Please correct the above warnings first.
[2014-02-26 10:03:37 - HamFinder]   at proguard.Initializer.execute(Initializer.java:369)
[2014-02-26 10:03:37 - HamFinder]   at proguard.ProGuard.initialize(ProGuard.java:211)
[2014-02-26 10:03:37 - HamFinder]   at proguard.ProGuard.execute(ProGuard.java:86)
[2014-02-26 10:03:37 - HamFinder]   at proguard.ProGuard.main(ProGuard.java:483)

我已经试过相当多的事情要得到这个工作,包括升级proguard的,更新的SDK,更新Eclipse工具,下载Eclipse的新版本,并从头开始,无数的变化ProGuard的文件,没有这似乎丝毫帮助。任何其他的想法?

I've tried quite a number of things to get this to work, including upgrading proguard, updating the SDK, updating the Eclipse tools, downloading a new version of Eclipse and starting from scratch, numerous changes to the proguard file, none of which seems to help in the slightest. Any other ideas?

编辑 - 下面是我倾向于几件事情,作为一种可能性。

EDIT- Here's a few things that I'm leaning towards, as a possibility.

我已经注意到,警告名单的变化,即使我什么都不做比干净的项目,并重新构建多。错误的数量似乎与时代我已经打开了日食的数量成长,打造构建。 Eclipse中似乎与堆错误更频繁地崩溃。

不知道任何这会有所帮助,但我想我会扔它在那里。

Not sure if any of this helps, but I thought I'd toss it in there.

推荐答案

摘要:我是pretty确定的关键问题是在文件夹中的 / JAVA 源文件夹,而不是 / src目录。确保任何依赖库有一个 / src目录文件夹源头code,如果可能的话。

Summary: I'm pretty sure the key problem was the folder with the /java source folder instead of /src. Make sure any dependent libraries have their source code in a /src folder, if at all possible.

我在编辑暗示,我相信这是一个记忆的问题。事实上,我能得到了大量的试验和错误的建构建,和我的日食内存配置做了一些调整。具体来说,我从 ,即:

As I hinted in my edit, I believe this is a memory problem. In fact, I was able to get the build built with a lot of trial and error, and a few adjustments made to my eclipse memory configuration. Specifically, I used the advice from this article, namely:

增加 -Xmx256m -Xmx2048m 中的eclipse.ini文件。添加-XX:MaxPermSize参数=256米到eclipse.ini文件添加 -Xms256M -Xmx512M 来的JVM,在窗口 - > preferences发现 - >爪哇 - >已安装的JRE - >点击JRE - >修改删除 -ignorewarnings 。这只是掩盖了问题,我早就想通了什么事情很多早期如果我没有做到这一点。 -dontwarn 的已知问题(我用可选一个lib使用 java.awt中,但不适合我用的东西... 尝试多次获得构建工作,你就会知道它的工作原理如果没有控制台的错误。使用ANT /摇篮,使 Increase the -Xmx256m to -Xmx2048m in the eclipse.ini file. Add -XX:MaxPermSize=256m to the eclipse.ini file. Add -Xms256M -Xmx512M to the JVM, found at Window-> Preferences -> Java -> Installed JREs -> clicking on JRE -> Edit Removing -ignorewarnings. That just masked the problem, I would have figured out what was going on a lot earlier if I hadn't done that. -dontwarn for the known issues (A lib I use optionally uses java.awt, but not for the stuff I use... Try multiple times to get the build to work, you'll know it works if there are no console errors. Use Ant/ Gradle to make

这些步骤的帮助,但最终,我能解决这个问题,尽管我做了几件事情一下子,所有这些都可能有固定的问题。这个事情我所做的:

These steps helped, but in the end, I was able to fix it, although I did several things all at once, any of which could have fixed the problem. The things I did:

正确设置依赖关系的顺序,以便第一库包括的是先编译,等等。我有依赖于图书馆的几个库,所以... 我的一个项目,曾在/ JAVA而不是/ src中的code。这可能造成一些混乱,我不知道。确保所有库针对最新的Andr​​oid版本。

我的project.properties看起来像现在这样:

My project.properties looks like this now:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-19
android.library.reference.1=../../../workspace/android-support-v7-appcompat
android.library.reference.2=..\\..\\..\\workspace\\google-play-services_lib
android.library.reference.3=..\\..\\..\\Documents\\GitHub\\android-styled-dialogs\\library\\src\\main
android.library.reference.4=..\\..\\..\\Documents\\GitHub\\drag-sort-listview\\library
android.library.reference.5=..\\..\\..\\Documents\\GitHub\\android-maps-utils\\library