ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android上的Proguard和Netty 5

2019-07-25 03:35:24  阅读:327  来源: 互联网

标签:android proguard obfuscation netty


我已经看到了关于这个问题的几个问题,但它们适用于旧版本的Netty.
我已经尝试了他们的答案,用io.netty切换org.jboss.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中的签名保留此信息.

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

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

最后,Proguard正在删除一些成员(如ctl,见前文),因为Netty只通过反射使用它们.最后的规则-keepclasseswithmembers确保Proguard不会删除它们.

如果你采用这种方法,我强烈建议你只使用你需要的Netty罐子,而不是-all jar.从-all切换到所需的Netty罐子后,在我超过65k限制后,我的方法计数下降了.减少你的罐子需要一点反复试验,因为分离不清楚,并没有任何资源说什么是什么.

*根本不小心,我只是将规则打入文件中,如果没有做任何事情就将其删除.可能有一种更好的方法可以将这些信息保存在整个程序中,而不仅仅是Netty.

标签:android,proguard,obfuscation,netty
来源: https://codeday.me/bug/20190725/1529280.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有