首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java proguard:库在优化后不工作

java proguard:库在优化后不工作
EN

Stack Overflow用户
提问于 2009-11-09 00:21:17
回答 3查看 2.2K关注 0票数 0

我正在用proguard优化一个jar,但优化后它崩溃了。这是我的前卫任务:

代码语言:javascript
运行
复制
    <proguard>
        -injars     ${dist}/${jarname}
        -outjars    ${dist}-proguard/${jarname}

        -target 5

        -libraryjars '${java.home}/lib/rt.jar'

        -dontobfuscate            
        -optimizationpasses 4
        -overloadaggressively
        -repackageclasses ''
        -allowaccessmodification

        -keep public class * {
            public static void main(java.lang.String[]);
        }
    </proguard>

只要我输入-dontoptimize选项,它就能正常工作。

根据异常的堆栈,当使用空指针访问类的静态公共成员时,它会崩溃。代码如下:

代码语言:javascript
运行
复制
public static Texture ring, dust, spikering, thinring, crystal, clouds;

public static void init() {
    Field [] fields = TexturePool.class.getDeclaredFields();

    for (Field field : fields) {
        if(field.getType() == Texture.class) {
            field.set( null, /*imagine new object here*/ );
        }
    }
}

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-09 23:32:52

好吧,我自己也发现了。我认为优化完全优化了类成员,因为它们不是在这个类中直接访问的。如果我指定选项:

代码语言:javascript
运行
复制
        -keepclassmembers public class com.package.** {
            public static * ;
        }

即使在优化的情况下,它也能正常工作。

票数 2
EN

Stack Overflow用户

发布于 2009-11-09 07:19:33

根据Best Java Obfuscation Application For Size Reduction的说法

“我总是能够通过不使用Proguard参数”-overloadaggressively“来解决这个问题。”

也许你也应该试一试?

编辑:问题很容易就是分配被优化掉了。在定义字段的源代码中发生的初始化实际上是由编译器在静态代码块中完成的。似乎优化对此进行了修补。使用更少的优化通道会发生什么?

票数 1
EN

Stack Overflow用户

发布于 2014-11-22 04:27:21

我在ProGuard优化只使用反射API修改的类字段时也遇到了同样的问题。然而,建议的答案对我不起作用,因为代码库中有太多分散在代码中的类,无法指定类过滤器。

取而代之的是,禁用字段优化为我带来了好处:

代码语言:javascript
运行
复制
-optimizations !field/*
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1697025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档