ProGuard读取库目录

时间:2014-07-14 14:46:31

标签: android intellij-idea proguard

我现在已经挣扎了一段时间了。我试图在IntelliJ IDEA 13.1.3中Generate Signed APK和在APK上运行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项目文件:

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

更新

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

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

2 个答案:

答案 0 :(得分:3)

感谢您的回答,Eric。

实际上,我已经解决了这个问题。到目前为止,还没有更新答案。

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

以下是正常运行的配置:

-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.**

答案 1 :(得分:2)

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

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