背景
項目在使用greendao的時候,debug安裝沒有問題,一到打包簽名就報了。
環境
win10
jdk17
gradle8+
項目依賴情況
博主的greendao是一個獨立的module項目,項目目前只適配了java,不支持Kotlin。然后被外部集成。greendao版本3.0.0。主項目和其他module都是Kotlin+Java混合環境。
問題集合
問題一
> Could not create task ':libpersistence:greendaoPrepare'.> Cannot use @TaskAction annotation on method DetectEntityCandidatesTask.execute() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.
在編譯的過程,gradle報錯,提示task錯誤。
解決方法:
在項目根部build.gradle文件,添加一下代碼
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.1'
具體添加位置如下圖:
這樣就能正常進行gradle編譯了。
問題二
FAILURE: Build completed with 2 failures.1: Task failed with an exception.
-----------
* What went wrong:
A problem was found with the configuration of task ':libpersistence:greendao' (type 'DefaultTask').- Gradle detected a problem with the following location: 'E:\workstation\android\clawclaw\clawclaw\libpersistence\src\main\java'.Reason: Task ':libpersistence:kaptGenerateStubsReleaseKotlin' uses this output of task ':libpersistence:greendao' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.Possible solutions:1. Declare task ':libpersistence:greendao' as an input of ':libpersistence:kaptGenerateStubsReleaseKotlin'.2. Declare an explicit dependency on ':libpersistence:greendao' from ':libpersistence:kaptGenerateStubsReleaseKotlin' using Task#dependsOn.3. Declare an explicit dependency on ':libpersistence:greendao' from ':libpersistence:kaptGenerateStubsReleaseKotlin' using Task#mustRunAfter.For more information, please refer to https://docs.gradle.org/8.9/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================
這個錯誤很詭異,按照官方issus,是很難解決的,如果你的greendao模塊,原本只支持Java編譯。得按以下的步驟進行解決。
(一)對module進行kotlin支持
這個無可厚非的,很簡單的配置一下就好了,我目前的kotlin版本是1.9.25,gradle是8.5,配置一下就好了。選中Module中的build.gradle文件,先apply一下Kotlin安卓支持,代碼截圖如下:
plugins {id 'com.android.library'id 'kotlin-android'id 'kotlin-kapt'id 'org.greenrobot.greendao'
}
然后引入依賴:
"androidx.core:core-ktx:1.7.0"
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.10"
上述版本與你們實際版本可能存在差異,但是博主這個版本是實測過的,可以正常打包,具體的版本,應該配合gradle來決定,不能一概而論。
最后,在模塊builde.gradle底部增加如下命令的配置:
//適用于greendao打包報錯
tasks.configureEach { task ->if (task.name.matches("\\w*compile\\w*Kotlin")) {task.dependsOn('greendao')}if (task.name.matches("\\w*kaptGenerateStubs\\w*Kotlin")) {task.dependsOn('greendao')}if (task.name.matches("\\w*kapt\\w*Kotlin")) {task.dependsOn('greendao')}
}
上述配置的思路,其實就是為了適配kotlin與java混合打包過程中,一些Kotlin編譯與Java差異化的一種兼容手段。
配置完上面代碼后,就可以正常運行了。
最后,放出greendao模塊中,build.gradle文件的全部代碼
plugins {id 'com.android.library'id 'kotlin-android'id 'kotlin-kapt'id 'org.greenrobot.greendao'
}android {namespace 'com.north.light.libpersistence'compileSdkVersion rootProject.ext.android.compileSdkVersionbuildToolsVersion rootProject.ext.android.buildToolsVersiondefaultConfig {minSdkVersion rootProject.ext.android.minSdkVersiontargetSdkVersion rootProject.ext.android.targetSdkVersionversionCode rootProject.ext.android.versionCodeversionName rootProject.ext.android.versionName}buildTypes {release {minifyEnabled falseconsumerProguardFiles 'proguard-rules-lib-greendao.pro'}pre {minifyEnabled falseconsumerProguardFiles 'proguard-rules-lib-greendao.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}buildFeatures{buildConfig = true}
}greendao {// 指定數據庫schema版本號,遷移等操作會用到schemaVersion 1// 設置生成數據庫文件的目錄,默認是在build中,可以將生成的文件放到我們的java目錄中targetGenDir 'src/main/java'// 設置生成的數據庫相關文件的包名,默認為entity所在的包名daoPackage 'com.north.light.libpersistence.gen'
}dependencies {api rootProject.ext.dependencies["kotlin"]api rootProject.ext.dependencies["kotlin-stdlib"]api project(":libcommonresp")implementation 'org.greenrobot:greendao:3.3.0'
}//適用于greendao打包報錯
tasks.configureEach { task ->if (task.name.matches("\\w*compile\\w*Kotlin")) {task.dependsOn('greendao')}if (task.name.matches("\\w*kaptGenerateStubs\\w*Kotlin")) {task.dependsOn('greendao')}if (task.name.matches("\\w*kapt\\w*Kotlin")) {task.dependsOn('greendao')}
}
that’s all-----------------------------------------------------------------------------------