Android 使用 ProGuard 发布的应用程序出错
Android Errors in released app with ProGuard
我做了一个应用程序,我正在使用 EPSON Printer SDK
所以我有一些爱普生热敏打印机的库文件,我正在我的应用程序中使用它们
所以这里的应用程序 运行 成功并且我正在打印数据
现在我制作了我的 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.access0(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)
我在使用蓝牙打印机和爱普生打印机时也遇到了同样的错误。更好用
-ignorewarnings / -dontwarn class/package name
-keep class * {
public private *;
}
别忘了保留我们的 class/package 名字
希望这有效
我知道这是一个老威胁,但我希望这对以后遇到这个话题的人有所帮助。
添加如下所示的 broad -keep 选项是一种不好的做法,这将阻止 ProGuard 缩小、优化和混淆整个项目(标记为 protected
的部分代码除外)。
-keep class * {
public private *
}
相反,当遇到 ClassNotFoundException
时,您应该只为缺少的 class 添加一个 -keep
选项。在OP的情况下
-keep class com.epson.epsonio.bluetooth.NetBt
您可以在 ProGuard Playground 上查看差异,它可以很好地显示哪些 class 受您的 -keep
选项影响,而无需一遍又一遍地编译。
我做了一个应用程序,我正在使用 EPSON Printer SDK 所以我有一些爱普生热敏打印机的库文件,我正在我的应用程序中使用它们
所以这里的应用程序 运行 成功并且我正在打印数据
现在我制作了我的 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.access0(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)
我在使用蓝牙打印机和爱普生打印机时也遇到了同样的错误。更好用
-ignorewarnings / -dontwarn class/package name
-keep class * {
public private *;
}
别忘了保留我们的 class/package 名字
希望这有效
我知道这是一个老威胁,但我希望这对以后遇到这个话题的人有所帮助。
添加如下所示的 broad -keep 选项是一种不好的做法,这将阻止 ProGuard 缩小、优化和混淆整个项目(标记为 protected
的部分代码除外)。
-keep class * {
public private *
}
相反,当遇到 ClassNotFoundException
时,您应该只为缺少的 class 添加一个 -keep
选项。在OP的情况下
-keep class com.epson.epsonio.bluetooth.NetBt
您可以在 ProGuard Playground 上查看差异,它可以很好地显示哪些 class 受您的 -keep
选项影响,而无需一遍又一遍地编译。