Utiliser un jar embarqué plutôt qu'un jar système
Bonjour,
Je travaille actuellement sur un projet pour une flasheuse Zebra TC800, un lecteur de code barre connecté tournant sous Android. Ces lecteurs fonctionnent sous Android, et le développement d'applications se fait sous Android Studio. Le développement se fait comme sur smartphone, et une librairie en Java, EMDK, permet de lire les codes barre.
Les premières versions de l'application fonctionnaient bien, jusqu'à ce que j'essaye de modifier le paramètre aimType de la configuration du scanner. (Il permet, entre autre, de demander à ne prendre en compte un code barre qu'après que l'utilisateur l'ai pointé pendant un délai minimum, pour éviter les erreurs de saisie, mais ce n'est pas important pour comprendre le problème.) Le code compile sans problème, mais à l'exécution, j'obtiens :
Code:
java.lang.NoSuchFieldError: No instance field aimType of type Lcom/symbol/emdk/barcode/ScannerConfig$AimType; in class Lcom/symbol/emdk/barcode/ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific; or its superclasses (declaration of 'com.symbol.emdk.barcode.ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific' appears in /system/framework/com.symbol.emdk.jar)
A en croire ce message, le champ aimType de la configuration n'existe pas, alors qu'Android Studio confirme son existence. J'ai décompilé l'apk et la classe ScannerConfig.ReaderParams.ReaderSpecific.LaserSpecific s'y trouve bien, et elle a un champ aimType. En revanche, si j'utilise l'introspection de code ( getClass().getDeclaredFields() ) , LaserSpecific n'a pas de champ aimType à l'exécution.
J'ai vérifié la documentation, et aimType est un ajout récent à cette librairie, les versions précédentes ne l'ont pas. A ce stade, je soupçonne que l'application ignore la copie d'EMDK embarquée dans mon apk au profit d'un version plus ancienne pré existant sur le lecteur de code barre, sans pouvoir le confirmer.
A toutes fins utiles, voici le code que j'utilise pour accéder au champ aimType:
Code:
1 2 3 4 5
| ScannerConfig config = scanner.getConfig();
ScannerConfig.AimType aimType = ScannerConfig.AimType.TIMED_HOLD;
config.readerParams.readerSpecific.laserSpecific.aimType = aimType;
config.readerParams.readerSpecific.laserSpecific.aimTimer = 500;
scanner.setConfig(config); |
Ici, le fichier build.gradle indiquant l'utilisation d'EMDK:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.bonduelle.agreoscan.agreoscan"
minSdkVersion 22
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
emdk6 {
targetSdkVersion 23
minSdkVersion 21 // EMDK 6.0 supports as far back as KitKat (19)
versionCode 30000 + android.defaultConfig.versionCode
versionNameSuffix "-emdk6"
}
emdk5 {
// Not compatible with Marshmallow devices
minSdkVersion 16
targetSdkVersion 16 // Though EMDK 5 actually supported up to Lollipop, we are only using it for JB deployments
maxSdkVersion 22 // Note: Google would still allow installation on 23+ devices (https://developer.android.com/guide/topics/manifest/uses-sdk-element.html)
versionCode 75000 + android.defaultConfig.versionCode
versionNameSuffix "-emdk5"
}
}
}
dependencies {
provided fileTree(include: ['com.symbol.emdk.jar'], dir: 'D:\\Andoid\\sdk\\add-ons\\addon-symbol_emdk-symbol-23\\libs')
compile fileTree(exclude: ['com.symbol.emdk.jar'], dir: 'libs')
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.mcxiaoke.volley:library:1.0.19'
testCompile 'junit:junit:4.12'
} |
J'ai essayé de mettre la dépendance EMDK en compile, sans changement.
Quelqu'un a-t-il déjà eu un problème similaire, où la version d'une dépendance changeait entre l'environnement de développement et l'exécution? A moins que ce ne soit un autre problème entièrement?