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 使用 DNSJava 库混淆 Android 代码