0

我有一个项目来处理一些现有的 dex 文件。要求之一是去除所有不必要的信息并减小它们的大小。

如果您尝试使用 Eclipse 插件并按照向导构建一个简单的“hello world”应用程序(SDK 和插件是我昨晚刚刚下载并安装的最新版本),您将创建一个classes.dex超过 300KB 的文件。

但是,如果您查看该项目,您会发现 lib 文件夹中出现了一个支持 lib 文件。如果你摆脱它,应用程序仍然可以工作,但 dex 文件的大小突然下降到 3KB。

所以我认为我们现有的文件也可能包含类似的不必要的引用。现在的问题是如何找到它们并摆脱它们。

有什么工具可以做到这一点吗?

4

2 回答 2

2

在 project.properties 文件中,您必须添加此行

proguard.config=proguard.cfg

你会在 proguard-project.txt 文件中找到 proguard 属性

这是一个android应用程序的示例

-injars      bin/classes
-outjars     bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic

-keep public class mypackage.MyActivity

这个适用于整个 android 应用程序

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-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 * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

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

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

-keepclassmembers class * extends android.content.Context {
    public void *(android.view.View);
    public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

您可以使用 injars、libraryjars 等来控制您需要的 jar 文件

您可以从这里获得必要的示例,完整的 android 应用程序在这里

于 2012-11-01T04:19:57.437 回答
0

用于此的标准工具是 proguard,Android SDK 已经支持。你可以在这里找到更多信息

于 2012-11-01T01:49:05.777 回答