簡體   English   中英

使用 ProGuard 發布的應用程序中的 Android 錯誤

[英]Android Errors in released app with ProGuard

我已經完成了一個應用程序,我在其中使用了EPSON Printer SDK 所以我有一些 EPSON 熱敏打印機的庫文件我正在使用它們在我的應用程序中

所以這里應用程序運行成功,我正在打印數據

現在我制作了我的 apk 的發布版本並對其進行了簽名

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

所以當我嘗試打印應用程序時它崩潰了

我遵循了許多 proguard 形式,並在proguard-rules添加了它

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

但是當minifyEnabled true時我仍然面臨同樣的問題

如果它是錯誤的,它對於 Release 版本的工作正常,可以向我建議我缺少 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)

藍牙打印機和愛普生打印機也有同樣的錯誤..更好用

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

不要忘記保留我們的類/包名稱

希望這有效

我知道這是一個古老的威脅,但我希望這會幫助將來遇到這個話題的人。

添加如下所示的廣泛的 -keep 選項是一種不好的做法,這將防止 ProGuard 縮小、優化和混淆整個項目(標記為protected部分代碼除外)。

-keep class * {
    public private *
}

相反,當遇到ClassNotFoundException ,您應該為丟失的類添加一個-keep選項。 在 OP 的情況下,這將是-keep class com.epson.epsonio.bluetooth.NetBt

您可以查看ProGuard Playground上的差異,它可以很好地顯示哪些類受您的-keep選項影響,而無需一遍又一遍地編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM