gpt4 book ai didi

android - Android 上的 Proguard 和 Netty 5

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:05 24 4
gpt4 key购买 nike

我已经看到几个关于这个问题的问题,但它们是针对旧版本的 Netty。
我已经尝试了他们的答案,将 org.jboss.netty 换成 io.netty,但出现了同样的错误。

我正在尝试编译一个使用启用了 Proguard 的 Netty 5.0.0Alpha2(build #16)的 Android 应用。

没有 Proguard,应用程序运行良好。
启用 Proguard 后,当它尝试使用 Netty 时,我会收到此异常:

java.lang.IllegalStateException: unknown type parameter 'I': class io.netty.channel.SimpleChannelInboundHandler
at io.netty.util.internal.TypeParameterMatcher.find0(Unknown Source)
at io.netty.util.internal.TypeParameterMatcher.find(Unknown Source)
at io.netty.channel.SimpleChannelInboundHandler.<init>(Unknown Source)
at io.netty.channel.SimpleChannelInboundHandler.<init>(Unknown Source)
...

这是我的 Proguard 配置:

# billing
-keep class com.android.vending.billing.**

# butterknife
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector {
*;
}
-keepnames class * {
@butterknife.InjectView *;
}

# admob
-keep public class com.google.android.gms.ads.** {
public *;
}

-keep public class com.google.ads.** {
public *;
}

# logging
-assumenosideeffects class android.util.Log

# netty (partial)
-dontwarn io.netty.**
-dontwarn sun.**

我已经在没有 -dontwarn 选项的情况下对其进行了测试,以查看警告是否会指向正确的方向,但它都缺少可选的依赖项,如 slf4j 和 Tomcat。

我也试过像这样排除所有 Netty 类:

-keep class io.netty.** {
*;
}

...但这似乎也无法解决问题。

最佳答案

在阅读了相当庞大的 Netty 资源的部分内容后,我已经使用一些仔细*应用的 Proguard 规则解决了这个问题:

-keepattributes Signature,InnerClasses
-keepclasseswithmembers class io.netty.** {
*;
}
-keepnames class io.netty.** {
*;
}

我最初的异常是由于从字节码中删除了类型变量引起的,而 Netty 通过反射使用了字节码。 -keepattributes 中的Signature 保留此信息。

如果你只在 -keepattributes 上执行 Signature,你会得到一个稍微不同的异常 - 添加 InnerClasses 通过带回更多信息修复这个问题在类文件中。

后来,我得到了java.lang.NoSuchFieldException: ctl;这就是 -keepnames 的用途。这样,该字段仍然像 Netty 期望的那样被称为 ctl

最后,Proguard 删除了一些成员(如 ctl),因为 Netty 仅通过反射使用它们。最终规则 -keepclasseswithmembers 确保 Proguard 不会删除它们。

如果你采用这种方法,我强烈建议你只使用你需要的 Netty jar ,而不是 -all jar 。在我超过 65k 限制后,从 -all 切换到仅需要 Netty jars 使我的方法计数方式减少。减少 jar 需要反复试验,因为分离不明确,而且实际上没有任何资源说明什么是什么。

* 一点都不仔细,我只是将规则放入文件中,如果它们什么都不做就将其删除。可能有一种更好的方法可以做到这一点,即不将此信息保留在整个程序中,而是仅保留在 Netty 中。

关于android - Android 上的 Proguard 和 Netty 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083667/

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