ProGuard 阅读库目录

Posted

技术标签:

【中文标题】ProGuard 阅读库目录【英文标题】:ProGuard Reading library directory 【发布时间】:2014-09-04 12:43:13 【问题描述】:

我已经为此苦苦挣扎了一段时间。我正在尝试在 IntelliJ IDEA 13.1.3 中 Generate Signed APK 并在 APK 上 Run ProGuard 4.7 但我无法摆脱以下错误:

错误:ProGuard:[project_name] 错误:无法读取 [C:\Program Files (x86)\android\android-sdk\tools\proguard\libs](没有这样的文件或目录)

错误消息前面是这条消息:

信息:ProGuard:[project_name]读取库目录[C:\Program Files (x86)\Android\android-sdk\tools\proguard\libs]

该位置只有一个lib 目录,其中包含proguard.jar 和另外两个jar 文件。我创建了一个空的libs 目录,但之后出现了更多错误。

否则,混淆似乎可以正常工作,并且在没有混淆的情况下,签名的 APK 会正确生成。

Android SDK Build-tools 版本为 20。

这是 proguard-project 文件:

-libraryjars libs

-keep class android.support.v4.app.**  *; 
-keep interface android.support.v4.app.**  *; 

-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;

更新

看来这个问题归结为proguard-project 文件中的-libraryjars libs 行。当我从proguard-project.txt 中删除该行时,我设法通过一个简单的测试项目正确地Generate Signed APK。但是,当-libraryjars libs 未被删除时,混淆失败。

如果在实际项目上尝试运行 ProGuard 时该行被剥离,则会产生更多错误。

【问题讨论】:

【参考方案1】:

谢谢你的回答,埃里克。

其实我已经解决了这个问题。只是直到现在才在这里更新答案。

是的,proguard-project.txt 中的-libraryjars 是万恶之源。我只是因为遇到了一些示例配置而将其包含在其中。

以下是正常工作的配置:

-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 public class com.google.android.gms.ads.**

   public *;


-keep public class com.google.ads.**

   public *;


-keep class com.android.vending.billing.**

-dontwarn android.support.v4.**
-keep class android.support.v4.**  *; 

-dontwarn com.google.android.gms.**

【讨论】:

【参考方案2】:

您的配置中应该有 -libraryjars 或 -injars。 Android 构建过程(Ant、Eclipse、Gradle,可能还有 IntelliJ IDEA)已经在内部为您指定了这些选项。

我没有遇到将-libraryjars添加到proguard-project.txt的Android SDK(并且指定的路径是相对于配置文件本身的目录,而不是相对于.../tools/proguard),但也许你应该更新到最新SDK 版本以避免该问题。

【讨论】:

以上是关于ProGuard 阅读库目录的主要内容,如果未能解决你的问题,请参考以下文章

你如何阻止 Proguard 删除类型参数?

Proguard 使用 DNSJava 库混淆 Android 代码

尽管阅读了常见问题解答,ProGuard 仍因“警告:类 [*] 意外包含类 [*]”而失败

proguard.cfg 文件丢失

在proguard android中忽略警告是正确的

多库项目中的 Android Studio proguard 处理