【问题标题】:Using ProGuard with Android.将 ProGuard 与 Android 一起使用。
【发布时间】:2010-10-28 00:00:52
【问题描述】:

我正在尝试将 ProGuard 与 Android 一起使用。我找到了几个可以使用的 ProGuard 脚本,以下是一个示例(我发现了其他几个相同或非常相似的脚本)。但是,当我尝试使用此脚本运行 ProGuard 时,出现错误:

"在 ';' 之前期望 java 类型在文件的第 23 行..."

我对 ProGuard 完全陌生。有人可以解释这里出了什么问题

谢谢。

-injars      bin(!.svn/**)
-outjars     obfuscated
-libraryjars C:\android-sdk_r04-windows\android-sdk-windows\platforms\android-1.6\android.jar
-libraryjars C:\GoogleAnalyticsAndroid_0.7\libGoogleAnalytics.jar

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-printmapping proguard.map
-keepattributes SourceFile,LineNumberTable

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native ;
}

-keepclasseswithmembernames class * {
    public (android.content.Context, android.util.AttributeSet); 
}

-keepclasseswithmembernames class * {
    public (android.content.Context, android.util.AttributeSet, int); 
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

【问题讨论】:

  • 我不是反对者,但我认为像“我的错误在哪里”这样的问题更适合论坛,因为其他人不会从阅读解决方案中得到太多漏洞。如果问题稍微更改为:如何制作一个符合我要求的 proguard 配置文件,这将是一个更好的问题,因为答案对其他人有用。

标签: java android proguard


【解决方案1】:

问题出在这里:

native ;

尝试将其更改为:

native <methods>;

【讨论】:

  • 感谢您的回复。我实际上已经尝试过了,它修复了该行的错误,但随后我在“public (android.content.Context, android.util.AttributeSet);”上得到一个错误线。我不明白的是,根据我找到的帖子,其他人显然已经成功使用了这个脚本。他们使用的是旧版本的 ProGuard 还是什么?谢谢。
  • 好的,我相信我已经确定了问题所在。这些脚本发布在一些博客上,看起来这些博客“吃掉”了尖括号中的所有元素(例如“”标签)。追踪这些元素并恢复它们可以让它发挥作用。谢谢
【解决方案2】:

正如我在上面评论的那样,问题似乎源于我从中获取脚本的博客似乎“吃”了任何带尖括号的东西。我决定发布更正的代码会很好,以防其他人正在寻找它。更正后的代码如下:

-injars      bin(!.svn/**)
-outjars     obfuscated
-libraryjars C:\android-sdk\platforms\android-4\android.jar

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-printmapping proguard.map
-keepattributes SourceFile,LineNumberTable

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet); 
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int); 
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

【讨论】:

    【解决方案3】:

    通过查看编译器给出的错误消息,编译器似乎实际上是在告诉您问题所在。

    "Expecting java type before ';' in line 23 of file ..."

    我记错了,但看起来这一行是第 23 行:

    native ;

    我不了解你,但这看起来根本不像是有效的 Java。

    【讨论】:

    • 它不是java,它是一个输入到ProGuard 的脚本,ProGuard 是一个java 程序,它接受java 代码并对其进行优化和混淆处理。我希望有 ProGuard 经验的人知道答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多