【问题标题】:Proguard seeming to remove an entire packages that are included in the pathProguard 似乎删除了路径中包含的整个包
【发布时间】:2014-03-28 10:40:25
【问题描述】:

我使用 Proguard 来混淆我的代码,并使其更小。我使用 Eclipse 构建,并且有一段时间了。我最近有一个在调试版本中运行良好的构建,我正在尝试发布它。在过去的大部分时间里,我一直在尝试完成这项工作,当我尝试使用已发布的构建运行我的代码时,我不断收到以下错误(如果有帮助,我可以生成更多)。

02-25 16: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, /vendor/lib, /system/lib]]

真正奇怪的是,我没有更改我的 proguard 文件,至少不是我第一次这样做。从那以后我一直在玩它,看看我是否能得到任何东西来让它工作,但似乎没有任何作用。自此构建以来,我在我的代码库中添加了一个新库,Google Maps utility library。我的最后一次构建是在几天前。

尝试解决此问题时,我发现整个文件夹没有出现在路径列表中。我在编译的二进制类中看到了这个文件夹,但它们在这个过程中无法生存。如果我停止使用 Proguard,发布版本将按预期工作。

我的代码依赖于我的 /src 目录中的 6 个包。虽然我可能在不同的文件夹中添加了一个或两个文件,并且可能已经移动了一个或两个文件夹,但我并没有为这个版本显着改变这个结构。这 6 个包是:

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

其中,我在我的 proguard 映射文件中找不到以下包的直接证据,至少对于这个特定的试验而言

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

有些引用了一些变量名,但没有证据表明包含整个包。我检查了 .dex 文件,它也不包含丢失的包。我应该补充一点,有时似乎会随机出现一些其他包,但绝不会出现我的 MainActivity 所在的com.kd7uiy.hamfinder。有时它们都没有出现。

这是我的 project.properties 文件:

# 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 文件,它已被证明不起作用。

-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 添加适当的 Google 地图所需的更改。都没有用。

-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 文件,在正确的位置找到。

# 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 文件中看到了这些文件的证据,但之后它们似乎就消失了。编译后的大小也没有明显更小,但这可能是因为我的非代码内容比代码多得多,很难检测到几个 java 文件的差异。这是整个 /bin/proguard.txt 文件。

# 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 标志的情况下进行编译。列出的错误非常多,但这里是它们的一个示例,从最后开始:

[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 文件进行了大量更改,没有其中似乎有一点帮助。还有其他想法吗?

编辑-这是我倾向于的一些事情,作为一种可能性。

  1. 我注意到警告列表发生了变化,即使我只是清理项目并重新构建。
  2. 错误的数量似乎随着我打开 Eclipse 并构建构建的次数而增加。
  3. Eclipse 似乎因堆错误而崩溃的频率更高。

不确定这是否有帮助,但我想我会把它扔在那里。

【问题讨论】:

  • 我没有看到你把这个保存在你的 proguard cfg [2014-02-26 10:03:37 - HamFinder] Warning: com.kd7uiy.hamfinder.MapQuestReverseCoder: can't find superclass or interface com.kd7uiy.hamfinder.AbstractWebReverseGeoCoder
  • AbstractWebReverseGeoCoder 中存在,我不确定为什么 proguard 找不到。我不知道为什么它应该在 proguard 配置中,我不需要在那里命名每个类,是吗?此外,我之前已经用那个文件编译过......
  • 在 proguard cfg 中将该类命名为测试,如果日志错误发生变化,可能就是它。
  • 我应该如何命名它? -keep class com.kd7uiy.hamfinder.AbstractWebReverseGeoCoder?
  • 是的。我几乎可以肯定这不会解决整个问题。由于它的抽象,它的实现很可能需要命名。但是,如果它更改了缺失类的错误消息,那么它就是一个开始。 Proguard 要求您保留所有按名称访问的类。我知道这听起来很奇怪,但一个很好理解的例子是使用 GSON 时。 GSON 将触及的任何类都必须保持未混淆,以便 GSON 可以通过其名称找到它。我认为这是相同的路线。

标签: android eclipse proguard


【解决方案1】:

现在你有

# 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);
}

您的类扩展了支持库 v7(从您的 project.properties 判断)而不是标准的 android.app.Activity,因此您需要类似的东西:

-dontwarn android.support.v7.**
-keep public class * extends android.support.v7.app.Fragment
-keep public class * extends android.support.v4.app.Activity

或者如果您想尝试保留更多(但更大的最终 apk):

-keep class android.support.v7.** { *; }

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

Fragments 等也一样


请注意,您的日志显示找不到LogBookFragment$OnEditView,这是一个内部类视图。要么将它们一一列出以由 proguard 保存,要么将它们移出到自己的类文件中。

【讨论】:

  • ActionBarActivity 最终扩展了 Activity,因此该 Activity 应该仍然存在...不过,片段部分仍然有用,并且可以为我节省一两次崩溃,所以...
  • 我现在已经尝试了所有这些,但似乎并没有解决问题。无论如何谢谢!
  • 它似乎找不到您的任何内部类(SomeClass$InnerClassName 表示内部类)。需要列出它们的组合 + -keepattributes InnerClasses
  • 我不知道该错误出现了多长时间,但我知道我已经发布了几个版本,但没有指定内部类。此外,大多数列为缺失的文件都是 R 文件,根据 Android Proguard 文件,Proguard 应该已经忽略了这些文件。
  • /bin/proguard.txt 包含所有看起来需要的东西,我也可以发布它。我很确定这是实际使用的文件...
【解决方案2】:

在 Windows 中使用 ProGuard 在 Eclipse 中构建时,我偶尔会收到有关缺失类的报告。到目前为止,原因是一个谜。 ProGuard 在 Eclipse 中作为单独的脚本/java 进程运行。问题是虚假发生的。我猜编译的类文件没有及时刷新到文件系统中,以便 ProGuard 读取它们。您可以尝试添加暂停或仅列出 ProGuard 脚本 android-sdk/tools/proguard/bin/proguard.bat 中的文件。

我没有收到任何关于 Ant 或 Gradle 的类似报告,因此这些可能是实用的替代方案。

(我是ProGuard的开发者)

【讨论】:

  • 我应该在 proguard.bat 的哪里添加暂停?
  • 顺便说一句,我非常愿意帮助您解决这个问题,如果您有什么想要我尝试的,请告诉我。
  • 我尝试输入暂停语句,但没有成功。其实已经编译好了,但是我安装后更容易出现问题,所以我又回到了之前的迭代。
  • 如果让脚本在实际调用 ProGuard 之前记录 ProGuard 的临时输入 jar 的内容,是否所有类都存在?临时输入 jar 的名称是脚本的参数之一(它也应该列在 ProGuard 的日志中,但为时已晚)。如果 jar 被截断或不完整,则存在同步问题。如果类存在,禁用 ProGuard 中的所有处理是否有帮助(-dontshrink -dontoptimize -dontobfuscate)?
  • 我设法修复了它(请参阅我的答案),虽然我仍在努力找出原因,但我怀疑它确保库的顺序是正确的,这样如果一个库取决于另一个,那个图书馆是第一个。明天我会做一些实验,看看我是否可以重现它,但这可能是线索。
【解决方案3】:

总结:我很确定关键问题是带有/java 源文件夹而不是/src 的文件夹。如果可能,请确保所有依赖库的源代码都位于 /src 文件夹中。

正如我在编辑中暗示的那样,我相信这是一个内存问题。事实上,我能够通过大量的试验和错误构建构建,并对我的 eclipse 内存配置进行一些调整。具体来说,我使用了this article的建议,即:

  1. 在 eclipse.ini 文件中将 -Xmx256m 增加到 -Xmx2048m
  2. 将 -XX:MaxPermSize=256m 添加到 eclipse.ini 文件中。
  3. -Xms256M -Xmx512M 添加到JVM,在Window-> Preferences -> Java -> Installed JREs -> 点击JRE -> Edit
  4. 删除-ignorewarnings。这只是掩盖了问题,如果我没有这样做,我会更早地弄清楚发生了什么。 -dontwarn 用于已知问题(我使用的库可以选择使用java.awt,但不适用于我使用的东西......
  5. 多次尝试让构建工作,如果没有控制台错误,您就会知道它工作正常。
  6. 使用 Ant/Gradle 制作

这些步骤有所帮助,但最终,我能够修复它,尽管我同时做了几件事,其中任何一个都可以解决问题。我做过的事情:

  1. 正确设置依赖的顺序,使包含的第一个库先编译,以此类推。我有一些依赖库的库,所以...
  2. 我的一个项目的代码位于 /java 而不是 /src。这可能会引起一些混乱,我不确定。
  3. 确保所有库都以最新的 Android 版本为目标。

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

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

【讨论】:

  • 如果这是内存问题,我想知道building from the command line using ant 是否可以快速解决您的问题。根据我的一些经验,将已经从 Eclipse 运行的项目调整为也从命令行构建通常很容易(主要涉及为所有项目运行 android update project,将密钥库信息添加到主项目的 ant.properties 文件中,然后运行ant release)。祝你好运!
  • 这正是我的想法,事实上,我一直渴望尝试一下。我也考虑过迁移到 Android Studio,这也可能完成同样的事情......
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2016-10-31
  • 2014-05-09
  • 2021-12-14
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多