【问题标题】:Gradle build flavors for specific devicesGradle 为特定设备构建风味
【发布时间】:2016-02-12 14:42:23
【问题描述】:

我的应用程序应该使用相机扫描条形码,如果用户有 TC55 摩托罗拉设备,则使用内置扫描仪。为了让它工作,我必须在 build.gradle 文件中指定:

dependencies {
provided files('libs/com.symbol.emdk.jar')

但是,如果我在非 TC55 设备上使用此行运行 apk,则应用程序会崩溃。 如何创建适用于 TC55 和非 TC55 设备的单一风味构建?

编辑 1:

AndroidRuntime: FATAL EXCEPTION: main
Process: company.mobile.application.app, PID: 28701
java.lang.RuntimeException: Unable to instantiate activity     ComponentInfo{company.mobile.application.app/com.company.mobile.application.ui.Pr    oductionActivity}: java.lang.ClassNotFoundException: Didn't find class     "com.company.mobile.application.ui.ProductionActivity" on path: DexPathList[[zip     file "/data/app/company.mobile.application.app-3.apk"],nativeLibraryDirectories=    [/data/app-lib/company.mobile.application.app-3, /vendor/lib, /system/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class     "com.company.mobile.application.ui.ProductionActivity" on path: DexPathList[[zip     file "/data/app/company.mobile.application.app-3.apk"],nativeLibraryDirectories=    [/data/app-lib/company.mobile.application.app-3, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
at android.app.ActivityThread.access$900(ActivityThread.java:161) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5356) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at dalvik.system.NativeStart.main(Native Method) 

【问题讨论】:

  • "但是,如果我在非 TC55 设备上使用此行运行 apk,应用程序会崩溃" -- 请提供崩溃的 Java 堆栈跟踪,以及堆栈跟踪中引用的代码. “我如何创建适用于 TC55 和非 TC55 设备的单一风味构建?” -- 如果我们知道您在哪里以及如何崩溃,我们会更容易回答这个问题。
  • 那么,到目前为止还没有想法吗?

标签: android gradle build motorola motorola-emdk


【解决方案1】:

要在 TC55 上使用 Zebra 的 EMDK,您需要使用仅在 TC55 等 Zebra 设备上可用的 EMDK 库。
因此,如果您尝试打开实现 EMDK 接口(EMDKListener、DataListener 或 StatusListener)之一的 Activity,如果 EMDK 不可用,您的应用程序将崩溃。

所以,从AndroidManifest.xml开始,你需要认为EMDK库可能在设备上不可用:

<uses-library android:name="com.symbol.emdk" android:required="false" />

关键点是:不要在您的主 Activity 中实现 EMDK 的侦听器之一,否则您的应用在非 Zebra 设备上运行时会崩溃(缺少所需的 EMDK 库)。

您可以查看this sample application,在使第二个活动(基于 EMDK 侦听器)可用之前检查 EMDK 是否可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多