gpt4 book ai didi

obfuscation - 使用 proguard 混淆后,使用 google guice 注入(inject)不再起作用

转载 作者:行者123 更新时间:2023-12-04 05:21:46 26 4
gpt4 key购买 nike

有没有人尝试过将 google guice 的使用与混淆(特别是 proguard)结合起来?
我的代码的混淆版本不适用于 google guice,因为 guice 提示缺少类型参数。这个信息似乎被 proguard 所做的转换步骤删除了,即使相关类被排除在混淆之外。

堆栈跟踪如下所示:

com.google.inject.CreationException: Guice creation errors:

1) Cannot inject a Provider that has no type parameter
while locating com.google.inject.Provider
for parameter 0 at de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel.setPasswordPanelProvider(SourceFile:499)
at de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel.setPasswordPanelProvider(SourceFile:499)
while locating de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel
for parameter 0 at de.repower.lvs.client.admin.user.administration.b.k.setParentPanel(SourceFile:65)
at de.repower.lvs.client.admin.user.administration.b.k.setParentPanel(SourceFile:65)
at de.repower.lvs.client.admin.user.administration.o.a(SourceFile:38)

2) Cannot inject a Provider that has no type parameter
while locating com.google.inject.Provider
for parameter 0 at de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel.setWindTurbineAccessGroupProvider(SourceFile:509)
at de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel.setWindTurbineAccessGroupProvider(SourceFile:509)
while locating de.repower.lvs.client.admin.user.administration.AdminUserCommonPanel
for parameter 0 at de.repower.lvs.client.admin.user.administration.b.k.setParentPanel(SourceFile:65)
at de.repower.lvs.client.admin.user.administration.b.k.setParentPanel(SourceFile:65)
at de.repower.lvs.client.admin.user.administration.o.a(SourceFile:38)

2 errors
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
at com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
at com.google.inject.Guice.createInjector(Guice.java:92)
at com.google.inject.Guice.createInjector(Guice.java:69)
at com.google.inject.Guice.createInjector(Guice.java:59)

我试图创建一个似乎重现问题的小示例(不使用 guice):
package de.repower.common;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

class SomeClass<S> {
}

public class ParameterizedTypeTest {

public void someMethod(SomeClass<Integer> param) {
System.out.println("value: " + param);
System.setProperty("my.dummmy.property", "hallo");
}

private static void checkParameterizedMethod(ParameterizedTypeTest testObject) {
System.out.println("checking parameterized method ...");
Method[] methods = testObject.getClass().getMethods();
for (Method method : methods) {
if (method.getName().equals("someMethod")) {
System.out.println("Found method " + method.getName());
Type[] types = method.getGenericParameterTypes();
Type parameterType = types[0];
if (parameterType instanceof ParameterizedType) {
Type parameterizedType = ((ParameterizedType) parameterType).getActualTypeArguments()[0];
System.out.println("Parameter: " + parameterizedType);
System.out.println("Class: " + ((Class) parameterizedType).getName());
} else {
System.out.println("Failed: type ist not instance of ParameterizedType");
}
}
}
}

public static void main(String[] args) {
System.out.println("Starting ...");
try {
ParameterizedTypeTest someInstance = new ParameterizedTypeTest();
checkParameterizedMethod(someInstance);
} catch (SecurityException e) {
e.printStackTrace();
}

}

}

如果您运行此代码 unsbfuscated,输出如下所示:
Starting ...
checking parameterized method ...
Found method someMethod
Parameter: class java.lang.Integer
Class: java.lang.Integer

但是运行使用 proguard 混淆的版本会产生:
Starting ...
checking parameterized method ...
Found method someMethod
Failed: type ist not instance of ParameterizedType

这些是我用于混淆的选项:
-injars classes_eclipse\methodTest.jar
-outjars classes_eclipse\methodTestObfuscated.jar

-libraryjars 'C:\Program Files\Java\jre6\lib\rt.jar'

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontshrink
-printusage classes_eclipse\shrink.txt
-dontoptimize
-dontpreverify
-verbose


-keep class **.ParameterizedTypeTest.class {
<fields>;
<methods>;
}

-keep class ** {
<fields>;
<methods>;
}

# Keep - Applications. Keep all application classes, along with their 'main'
# methods.
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver

# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
native <methods>;
}

# Keep names - _class method names. Keep all .class method names. This may be
# useful for libraries that will be obfuscated again with different obfuscators.
-keepclassmembers,allowshrinking class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String,boolean);
}

有没有人知道如何解决这个问题(除了将相关文件放入单独的 jar 并且不混淆它的明显解决方法)?

最好的祝福,
斯特凡

最佳答案

在使用 proguard 很长一段时间后,我决定如何解决有关反射的问题(Guice 只是它的一个用例)。

反射可以与 Proguard 一起使用,只要没有输入类或方法名作为字符串。

也就是说这段代码是有效的,经过ProGuard混淆后可以工作

Class someClass = Class.forName(SomeClass.class.getName());

虽然这段代码不起作用
Class someClass = Class.forName("SomeClass");

此外,Proguard 将收缩未调用的方法和构造函数。因此, Class.newInstance方法行不通。不幸的是,通常的 Guice 绑定(bind)使用这种方法。

这对 Guice 代码有一些影响。
  • 所有的注入(inject)都必须使用 @Provides 注释的方法来生成,因为 ProGuard 会收缩类,因为它们的构造函数没有被显式调用。
  • Proguard 不得压缩模块类的代码。
  • ProGuard 不能缩小注释,无论它们在哪里,无论它们在哪里(可以配置,但我不记得在哪里)。
  • 关于obfuscation - 使用 proguard 混淆后,使用 google guice 注入(inject)不再起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369939/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com