【问题标题】:Netty library not work in android release apk?Netty 库在 android 发布 apk 中不起作用?
【发布时间】:2020-12-10 17:22:52
【问题描述】:

我通过使用netty GitHub示例上提供的代码在android上使用netty制作了代理服务器,实际上,我只是复制它们并在android中使用它们。 这是 netty 代理服务器示例: https://github.com/netty/netty/tree/4.0/example/src/main/java/io/netty/example/proxy 现在我遇到了两个问题,第一个 netty 在第一次运行时无法正常工作,但是在关闭应用程序并再次打开后它运行良好我不知道为什么在第一次运行时它不起作用。 2. netty 在发布模式下不工作,查看日志时看到这个错误

Rejecting re-init on previously-failed class java.lang.Class<g.b.b.k>: java.lang.ExceptionInInitializerError: 
        at void g.b.b.m.<clinit>() (ByteBufUtil.java:82)
        at void g.b.b.k.<clinit>() (ByteBufAllocator.java:24)
        at void g.b.c.f0.<init>(g.b.c.e, g.b.c.y0) (DefaultChannelConfig.java:59)
        at void g.b.c.f0.<init>(g.b.c.e) (DefaultChannelConfig.java:72)
        at void g.b.c.i1.e.<init>(g.b.c.i1.g, java.net.ServerSocket) (DefaultServerSocketChannelConfig.java:50)
        at void g.b.c.i1.k.b$b.<init>(g.b.c.i1.k.b, g.b.c.i1.k.b, java.net.ServerSocket) (NioServerSocketChannel.java:201)
        at void g.b.c.i1.k.b$b.<init>(g.b.c.i1.k.b, g.b.c.i1.k.b, java.net.ServerSocket, g.b.c.i1.k.b$a) (NioServerSocketChannel.java:199)
        at void g.b.c.i1.k.b.<init>(java.nio.channels.ServerSocketChannel) (NioServerSocketChannel.java:90)
        at void g.b.c.i1.k.b.<init>() (NioServerSocketChannel.java:75)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
        at g.b.c.e g.b.c.z0.a() (ReflectiveChannelFactory.java:44)
        at g.b.c.j g.b.a.a.v() (AbstractBootstrap.java:310)
        at g.b.c.j g.b.a.a.o(java.net.SocketAddress) (AbstractBootstrap.java:272)
        at g.b.c.j g.b.a.a.g(java.net.SocketAddress) (AbstractBootstrap.java:268)
        at g.b.c.j g.b.a.a.e(int) (AbstractBootstrap.java:246)
        at void d.a.a.f.d.run() (MainProxyServer.java:55)
        at void d.a.a.j.j$c$a.a(m.a.a.a) (Main.kt:115)
        at java.lang.Object d.a.a.j.j$c$a.invoke(java.lang.Object) (Main.kt:94)
        at void m.a.a.b$a.a() (Async.kt:138)
        at java.lang.Object m.a.a.b$a.invoke() (Async.kt:-1)
        at java.lang.Object m.a.a.c.call() (Async.kt:-1)
        at void java.util.concurrent.FutureTask.run() (FutureTask.java:266)
        at void java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run() (ScheduledThreadPoolExecutor.java:301)
        at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1167)
        at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:641)
        at void java.lang.Thread.run() (Thread.java:919)

但它在调试模式下运行良好。

【问题讨论】:

  • 我和你做同样的工作,我找到了这个代码(github.com/monkeyWie/proxyee),我修改了一些代码让它可以在android上运行,没有错误发生,但其他设备无法访问这个代理服务器。你能给我一些想法吗?

标签: android netty


【解决方案1】:

关于第一个问题,您可能需要将 ProviderInstaller 添加到您的应用中,因为某些 android 版本(如 android 5)似乎无法处理 SSL,但通过添加此问题,我认为问题将得到解决。

【讨论】:

    【解决方案2】:

    关于第二个问题,有两种解决方案:

    1. 只需添加-keep class io.netty.**{*;} 到这个模块下名为proguard-rules.pro的文件。

    2. 禁用代码混淆,修改此模块下名为build.gradle的文件如下:

    .....
    buildTypes {
    ....
          release {
              minifyEnabled false
              .....
          }
    ....
    }
    ....
    

    选择一个适合您的情况。

    【讨论】:

    • 请在 cmets 中添加任何其他问题或作为新问题。
    • @Yatin 什么?为什么你可以编辑我的答案?我也想要这个权力……我只是说,因为也许他可以在交流中给我一些想法。顺便说一句,我觉得不受尊重,因为你随意编辑我的内容。
    • 你好,我的意图不是不尊重你。答案不是为了进一步澄清。您可以在 cmets 中提出这些问题。我已将您的答案恢复为原始形式。
    • @Yatin 其实不需要全部回滚。你的语法和格式更好。我是一个理性的人,可以接受批评。如果可以的话,我的问题就足够了。
    • 我知道了,下次我会在评论中提问。
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2020-02-21
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多