【问题标题】:ProGuard Reading library directoryProGuard 阅读库目录
【发布时间】: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 时该行被剥离,则会产生更多错误。

【问题讨论】:

    标签: android intellij-idea 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 版本以避免该问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        相关资源
        最近更新 更多