【问题标题】:Android Errors in released app with ProGuard使用 ProGuard 发布的应用程序中的 Android 错误
【发布时间】:2021-03-17 20:04:40
【问题描述】:

我已经做了一个应用程序,我正在使用 EPSON Printer SDK 所以我有一些 EPSON 热敏打印机的库文件我在我的应用程序中使用它们

所以这里应用程序运行成功,我正在打印数据

现在我制作了我的 apk 的发布版本并对其进行了签名

我的应用程序在不同的包(com.mytest.mapp)中,打印机在其他包(com.epson.epos2_printer)中,我正在使用库libepos2.so

所以当我尝试打印应用程序时它崩溃了

我遵循了许多 proguard 表格,并在 proguard-rules 中添加了这个

-keep class  com.epson.epos2** {
    *;
}

但是当minifyEnabled true时我仍然面临同样的问题

如果它是假的,它在发布版本中的工作正常,任何 1 都可以建议我为 EPSON SDK 库缺少什么

这是我的错误日志

   No pending exception expected: java.lang.ClassNotFoundException: Didn't find class "com.epson.epsonio.bluetooth.NetBt" on path: DexPathList[[zip file "/data/app/com.mytest.mapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mytest.mapp-1/lib/arm, /vendor/lib, /system/lib]]
   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:511)
   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:469)
   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
   at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:428)
   at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:369)
   at void java.lang.System.loadLibrary(java.lang.String) (System.java:989)
   at void com.epson.epos2.discovery.Discovery.<clinit>() ((null):-1)
   at void com.mytest.mapp.pdata.PrintMActivity.onCreate(android.os.Bundle) ((null):-1)
   at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6289)
   at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1119)
   at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2655)
   at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2767)
   at void android.app.ActivityThread.access$900(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:177)
   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1449)
   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
   at void android.os.Looper.loop() (Looper.java:145)
   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:5951)
   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[], boolean) (Method.java:-2)
   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:372)
   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1400)
   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1195)

【问题讨论】:

  • 发布崩溃日志。
  • 你遇到了什么错误?
  • 是否有任何常量或实用程序类(如 JavaBeans)与此库一起使用?
  • 也可以使用look here - 尝试-keep class com.epson.** { *; },同时保持与此库一起使用的任何实用程序类或常量不被混淆。希望这会有所帮助:)
  • 感谢它为同一个库提供了一个很好的例子

标签: android printing android-proguard


【解决方案1】:

蓝牙打印机和爱普生打印机也出现同样的错误。更好用

-ignorewarnings / -dontwarn class/package name
-keep class * {
    public private *;
}

不要忘记保留我们的类/包名

希望这可行

【讨论】:

  • 感谢它的工作
【解决方案2】:

我知道这是一个古老的威胁,但我希望这将有助于将来遇到此主题的人。

添加如下所示的广泛的 -keep 选项是一种不好的做法,这将防止 ProGuard 缩小、优化和混淆整个项目(标记为 protected 的部分代码除外)。

-keep class * {
    public private *
}

当遇到ClassNotFoundException 时,您应该为缺少的类添加一个-keep 选项。在OP的情况下,那将是 -keep class com.epson.epsonio.bluetooth.NetBt

您可以查看ProGuard Playground 上的差异,它可以很好地显示哪些类受您的-keep 选项影响,而无需一遍又一遍地编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多