导出已签名、混淆的 Android 应用程序时,如何在 Eclipse 中设置 ProGuard?

Posted

技术标签:

【中文标题】导出已签名、混淆的 Android 应用程序时,如何在 Eclipse 中设置 ProGuard?【英文标题】:How to set up ProGuard in Eclipse when exporting a signed, obfuscated Android application? 【发布时间】:2011-04-15 07:54:26 【问题描述】:

我正在发布一个在 Eclipse 中开发的 android 应用程序,如标题所述,我想将 Proguard 混淆功能集成到构建中,专门用于导出已签名的应用程序。

有没有人走上了蚂蚁之路?

【问题讨论】:

***.com/a/11351168/2291 的答案描述了已更新以尊重 SDK 中的更改。 【参考方案1】:

我也想在不使用 Ant 或命令行方法的情况下做到这一点。以下是有效的(仅在 Eclipse + Windows 上):

(您需要下载 Proguard。脚本预计在此处找到它:C:\android-sdk_r04-windows\proguard\lib\proguard.jar)。

创建一个 Windows 批处理文件,“C:\android-sdk_r04-windows\obfusc.bat”:


    DEL /S /Q obfuscated
    MKDIR obfuscated

    java -jar C:\android-sdk_r04-windows\proguard\lib\proguard.jar @android.pro

    DEL /S /Q bin\com\
    DEL /S /Q bin\org\

    ROBOCOPY obfuscated\com bin\com /S

在 Eclipse 中,打开您的 Android 项目的属性页面,选择“Builders”窗格并添加一个类型为“Program”的新构建器。在主选项卡的“位置”字段中,放置上一步中脚本的绝对路径。在“工作目录”字段中放置变量 $build_project。在“构建选项”选项卡中,选择“运行构建器”下的“清理后”。

确保此构建工具排在最后,就在 Android 包构建器之前。

在 Android 项目的根文件夹中创建一个 proguard 配置文件。我稍微定制了这些并将它们包含在修订控制中,但这取决于你。我使用的文件名为“android.pro”,在脚本中命名,与开发博客中的配置类似,但包含带有 injar、outjar 和 libraryjar 语句的标题,例如:

李>

    -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);
    
您会希望在大多数情况下都关闭此 Builder。当需要测试或导出混淆的 APK 时,将其打开,然后从 Eclipse 执行“项目 > 清理”,包括项目和它所依赖的任何库项目。

我想就是这样。

【讨论】:

今天仍然需要新的 Eclipse 和 Android SDK 吗? 那么经过所有步骤后,混淆后的 apk 会存储在哪里?【参考方案2】:

好的,这是关于该主题的最相关和最近的帖子:

http://android-developers.blogspot.com/2010/09/proguard-android-and-licensing-server.html

它使用 Ant,但所有困难的部分都为您完成,只要您按照说明操作,它就可以工作。注意:不要跳过仅适用于 SDK r7+ 的更新,运行 eclipse 的更新也不错,对于 AVD 更新也是如此。

而且,对于任何添加外部 jar 的人,设置 ProGuards procfg.txt 并添加:

-libraryjars pathfile_name.jar

【讨论】:

【参考方案3】:

如果您使用的是 eclipse,只需取消注释 project.properties

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=$sdk.dir/tools/proguard/proguard-android.txt:proguard-project.txt

【讨论】:

以上是关于导出已签名、混淆的 Android 应用程序时,如何在 Eclipse 中设置 ProGuard?的主要内容,如果未能解决你的问题,请参考以下文章

使用 android.support.v4.app 蜂窝兼容包导出签名应用时出现 Proguard 错误

您如何从 Eclipse 内部制作签名和混淆的 android 版本?

Android数字签名和打包2

使用 Ant 构建已签名和未签名的版本

使用 GSON 库导出/签署 Android 项目

Android Studio环境下代码混淆+签名打包