Netty 库在 android 发布 apk 中不起作用?
Netty library not work in android release apk?
我通过使用 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)
但它在调试模式下运行良好。
关于第一个问题,您可能需要将 ProviderInstaller 添加到您的应用程序中,因为某些 android 版本(例如 android 5 似乎无法处理 SSL,但通过添加它我认为问题将得到解决。
关于第二个问题,有两种方案可以解决:
只需添加-keep class io.netty.**{*;}
到此模块下名为 proguard-rules.pro
的文件。
禁用代码混淆,修改此模块下名为build.gradle
的文件如下:
.....
buildTypes {
....
release {
minifyEnabled false
.....
}
....
}
....
根据你的情况选一个。
我通过使用 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)
但它在调试模式下运行良好。
关于第一个问题,您可能需要将 ProviderInstaller 添加到您的应用程序中,因为某些 android 版本(例如 android 5 似乎无法处理 SSL,但通过添加它我认为问题将得到解决。
关于第二个问题,有两种方案可以解决:
只需添加
-keep class io.netty.**{*;}
到此模块下名为proguard-rules.pro
的文件。禁用代码混淆,修改此模块下名为
build.gradle
的文件如下:
.....
buildTypes {
....
release {
minifyEnabled false
.....
}
....
}
....
根据你的情况选一个。