Reputation: 19263
My project contains three modules: main - pure Java, 3rd-party app - pure Java and another 3rd-party app - Kotlin, 1.5.10
Project isn't maintained, but still works and I've got a task to implement some lib in it, in main module. I've developed whole solution without a problem on debug, but now when I'm trying to build release APK I'm getting 4 errors in :lintVitalBasicRelease
stage similar to below
..f4b73468ce598bb17f04/kotlin-stdlib-1.6.0.jar!/META-INF/kotlin-stdlib.kotlin_module:
Module was compiled with an incompatible version of Kotlin.
The binary version of its metadata is 1.6.0, expected version is 1.4.0.
same for kotlin-stdlib-common-1.6.0.jar
, preference-1.2.0.jar
and slidingpanelayout-1.2.0.jar
, same versions 1.6/1.4 mentioned in all
project gradle:
buildscript {
ext.kotlin_version = '1.5.10'
repositories {
jcenter()
flatDir {
dirs 'libs'
}
maven {
url 'https://maven.google.com/'
name 'Google'
}
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
...
gradle for 3rd-party Kotlin app/module:
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
...
dependencies {
compile "androidx.core:core-ktx:1.6.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
...
main module (no Kotlin!):
apply plugin: 'com.android.application'
android {
compileSdkVersion 31
buildToolsVersion '30.0.3'
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
...
dependencies {
...
implementation('com.dji:dji-sdk:4.16.4', {
exclude module: 'fly-safe-database'
})
compileOnly 'com.dji:dji-sdk-provided:4.16.4'
...
implementation project(path: ':somekotlininhere')
implementation project(path: ':purejavamodule')
}
without posted above implementation of THIS SDK project is building and signing fine, I'm producing APK without a problem
fun fact that in linked sdk repo we can find Sample Code, which have exactly same Kotlin version (1.5.10) and dependecies, even declared same way (using shared ext.kotlin_version
)
updating Kotlin to newest one 1.8.10 introduced some new errors/deprecations, after resolving I've got back to same point and initial error... I've reverted this change back, I'm not an author of Kotlin-module, I would prefer to not touch
so: what is proper declarations for my case, how can I release my project now, as it works pretty good "via cable" (debug)
PS. yep, this question is a duplicate of THIS, but I believe I've posted more useful and detailed info for resolving this...
Upvotes: 0
Views: 1142
Reputation: 1054
Maybe putting the following lines of code in the project's Gradle works for you
afterEvaluate {
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
apiVersion = "1.5"
languageVersion = "1.5"
}
}
}
Or maybe you need just turn off your lint warning
android {
lintOptions {
checkReleaseBuilds false
//If you want to continue even if errors found use following line
abortOnError false
}
}
But I didn't recommend those.
The most difficult way is upgrading your dependencies, but it's more reliable.
// use this dependency if your java target is 1.8 or above
org.jetbrains.kotlin:kotlin-stdlib:
In you're app Gradle use the following code depending on your Java version
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
Edited answer __________________________________
Also try following packaging option in your app Gradle
:
android {
...
defaultConfig {
...
ndk {
// On x86 devices that run Android API 23 or above, if the application is targeted with API 23 or
// above, FFmpeg lib might lead to runtime crashes or warnings.
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
packagingOptions {
doNotStrip "*/*/libdjivideo.so"
doNotStrip "*/*/libSDKRelativeJNI.so"
doNotStrip "*/*/libFlyForbid.so"
doNotStrip "*/*/libduml_vision_bokeh.so"
doNotStrip "*/*/libyuv2.so"
doNotStrip "*/*/libGroudStation.so"
doNotStrip "*/*/libFRCorkscrew.so"
doNotStrip "*/*/libUpgradeVerify.so"
doNotStrip "*/*/libFR.so"
doNotStrip "*/*/libDJIFlySafeCore.so"
doNotStrip "*/*/libdjifs_jni.so"
doNotStrip "*/*/libsfjni.so"
doNotStrip "*/*/libDJICommonJNI.so"
doNotStrip "*/*/libDJICSDKCommon.so"
doNotStrip "*/*/libDJIUpgradeCore.so"
doNotStrip "*/*/libDJIUpgradeJNI.so"
doNotStrip "*/*/libDJIWaypointV2Core.so"
doNotStrip "*/*/libAMapSDK_MAP_v6_9_2.so"
doNotStrip "*/*/libDJIMOP.so"
doNotStrip "*/*/libDJISDKLOGJNI.so"
exclude 'META-INF/rxjava.properties'
exclude 'assets/location_map_gps_locked.png'
exclude 'assets/location_map_gps_3d.png'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
And this progaurd rule in your app progaurd file
:
-keepattributes Exceptions,InnerClasses,*Annotation*,Signature,EnclosingMethod
-dontoptimize
-dontpreverify
-dontwarn okio.**
-dontwarn org.bouncycastle.**
-dontwarn dji.**
-dontwarn com.dji.**
-dontwarn sun.**
-dontwarn java.**
-dontwarn com.amap.api.**
-dontwarn com.here.**
-dontwarn com.mapbox.**
-dontwarn okhttp3.**
-dontwarn retrofit2.**
-keepclassmembers enum * {
public static <methods>;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class * extends android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keep,allowshrinking class * extends dji.publics.DJIUI.** {
public <methods>;
}
-keep class net.sqlcipher.** { *; }
-keep class net.sqlcipher.database.* { *; }
-keep class dji.** { *; }
-keep class com.dji.** { *; }
-keep class com.google.** { *; }
-keep class org.bouncycastle.** { *; }
-keep,allowshrinking class org.** { *; }
-keep class com.squareup.wire.** { *; }
-keep class sun.misc.Unsafe { *; }
-keep class com.secneo.** { *; }
-keep class org.greenrobot.eventbus.**{*;}
-keep class it.sauronsoftware.ftp4j.**{*;}
-keepclasseswithmembers,allowshrinking class * {
native <methods>;
}
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keep class androidx.appcompat.widget.SearchView { *; }
-keepclassmembers class * extends android.app.Service
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keep class androidx.** { *; }
-keep class android.media.** { *; }
-keep class okio.** { *; }
-keep class com.lmax.disruptor.** { *; }
-keep class com.qx.wz.dj.rtcm.* { *; }
-dontwarn com.mapbox.services.android.location.LostLocationEngine
-dontwarn com.mapbox.services.android.location.MockLocationEngine
-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver {
<init>(...);
}
# ViewModel's empty constructor is considered to be unused by proguard
-keepclassmembers class * extends android.arch.lifecycle.ViewModel {
<init>(...);
}
# keep Lifecycle State and Event enums values
-keepclassmembers class android.arch.lifecycle.Lifecycle$State { *; }
-keepclassmembers class android.arch.lifecycle.Lifecycle$Event { *; }
# keep methods annotated with @OnLifecycleEvent even if they seem to be unused
# (Mostly for LiveData.LifecycleBoundObserver.onStateChange(), but who knows)
-keepclassmembers class * {
@android.arch.lifecycle.OnLifecycleEvent *;
}
-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver {
<init>(...);
}
-keep class * implements android.arch.lifecycle.LifecycleObserver {
<init>(...);
}
-keepclassmembers class android.arch.** { *; }
-keep class android.arch.** { *; }
-dontwarn android.arch.**
-keep class org.apache.commons.** {*;}
#<------------ utmiss config start------------>
-keep class dji.sdk.utmiss.** { *; }
-keep class utmisslib.** { *; }
#<------------ utmiss config end------------>
Hope this pushing you forward :)
Upvotes: 3