旧プロジェクトをTargetSDK 35に更新する際の問題記録
2025, Mar 12
プロジェクトのTargetSDK 35への更新問題記録
- プレビュー段階 (2024)
target sdk 35に更新時のgradle互換性の問題
- この問題を解決するにはgradleを8.0+にアップグレードする必要がありますが、様々な問題が発生します…
Inconsistent JVM-target compatibility
- 解決策1:
gradle.propertiesに以下を追加
kotlin.jvm.target.validation.mode = IGNORE
- 解決策2:
Kidプロジェクトを参考に、gradle.propertiesに以下を追加
COMPILE_JAVA_VERSION=17
そして対応するbuild.gradleでJavaバージョンを指定
Product Flavor 'global' contains custom BuildConfig fields, but the feature is disabled
- 解決策:
gradle.propertiesに以下を追加
android.defaults.buildfeatures.buildconfig=true
AIDL error
- 解決策:
gradle.propertiesに以下を追加
android.defaults.buildfeatures.aidl=true
Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG
- 解決策:
AirDroid/build.gradle
でcom.google.firebase:firebase-adsを22.3.0にダウングレードAdmobModule/build.gradle
でcom.google.android.gms:play-services-adsを22.3.0にダウングレード
- 参考: https://issuetracker.google.com/issues/327696048 https://stackoverflow.com/questions/78085458/manifest-merger-failed-with-agp-8-3-0 https://stackoverflow.com/questions/78350965/manifest-merger-failed-attribute-propertyandroid-adservices-ad-services-confi
AndroidAnnotation error
- gradle.propertiesに以下を追加
android.nonFinalResIds=false
-
エラーが変わりました:
- AA(AndroidAnnotation)が作成すべきファイルが正常に作成されていません。AAのデバッグ方法に従って、buildフォルダ内のandroidannotations.logを確認:
10:13:18.48 [WorkerExecutor Queue Thread 2] ERROR o.a.i.h.AndroidManifestFinder:152 - Could not find the AndroidManifest.xml file, using generation folder [/Users/sion/gerrit/airmirror/airdroid/AirDroid/build/generated/source/kapt/channelDebug])
- AndroidManifest.xmlファイルが見つからないことがわかりました。
- 他のプロジェクトを参考に、AirDroid/Build.gradleに以下を追加:
javaCompileOptions { annotationProcessorOptions { arguments["androidManifestFile"] = "$projectDir/src/main/AndroidManifest.xml" } }
- AAが作成すべきファイルはまだ正常に作成されていません。
- 再度androidannotations.logを確認:
10:25:09.812 [WorkerExecutor Queue] ERROR o.a.i.r.ProjectRClassFinder:49 - The generated .R class cannot be found
.Rファイルが見つからない問題に変わりました。
- AirDroid/Build.gradleのjavaCompileOptionsを以下のように変更:
javaCompileOptions { annotationProcessorOptions { arguments = [ 'androidManifestFile': "$projectDir/src/main/AndroidManifest.xml", 'resourcePackageName': getPackageName("sandstudio") ] } }
コンパイルに成功しました! しかし、アプリを開くとクラッシュします
Default FirebaseApp is not initialized
-
FirebaseはFirebaseInitProviderというContentProviderを通じて自動初期化を行うため、別途FirebaseApp.initializeApp(Context)を追加する必要はありません。
- 関連ログを確認:
2025-02-13 15:12:46.078 4449-4449 FirebaseApp com.sand.airmirror W Default FirebaseApp failed to initialize because no default options were found. This usually means that com.google.gms:google-services was not applied to your gradle project. 2025-02-13 15:12:46.078 4449-4449 FirebaseInitProvider com.sand.airmirror I FirebaseApp initialization unsuccessful
初期化に失敗していることがわかりました。
- 解決策: ルートディレクトリのbuild.gradleで、google-servicesを4.4.2にアップグレード ```java buildscript { dependencies { classpath ‘com.google.gms:google-services:4.4.2’ } }
<div class="c-border-main-title-2">Release build error while uploadCrashlyticsMappingFileIntlRelease</div>
```java
* What went wrong:
A problem was found with the configuration of task ':AirDroid:uploadCrashlyticsMappingFileIntlRelease' (type 'UploadMappingFileTask').
- In plugin 'com.google.firebase.crashlytics' type 'com.google.firebase.crashlytics.buildtools.gradle.tasks.UploadMappingFileTask' property 'googleServicesFile' specifies file '/media/build/workspace/airmirror-release/AirDroid/build/generated/res/google-services/intl/release/values/values.xml' which doesn't exist.
Reason: An input file was expected to be present but it doesn't exist.
- 解決策:
ルートディレクトリのbuild.gradleで、firebase-crashlyticsを3.0.3にアップグレード
buildscript { dependencies { classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.3' } }
Missing classes detected while running R8
- channelRelease buildが失敗した情報:
```java
Task :AdmobModule:minifyChinaReleaseWithR8 FAILED ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in /media/build/workspace/airmirror-release/AdmobModule/build/outputs/mapping/chinaRelease/missing_rules.txt. ERROR: R8: Missing class java.lang.invoke.StringConcatFactory (referenced from: java.lang.String com.sand.admobmodule.SandAdRewardManager$AdSource.toString() and 41 other contexts)
* 確認:
`/AdmobModule/build/outputs/mapping/chinaRelease/missing_rules.txt`
```java
# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn java.lang.invoke.StringConcatFactory
- 解決策:
AdmobModuleのproguard-rules.proに以下を追加:
-dontwarn java.lang.invoke.StringConcatFactory
AGPを8.0+にアップグレード時のGreenDao互換性問題
GreenDao
は更新が停止しており、GitHub上のリリースは最大でも3.3.0までですが、 mvnrepositoryやGitHubのコミットメッセージを確認すると、greendaoPlugin
は2023年に密かに更新された記録があります。 実際にgreen dao plugin
を3.3.1
にアップグレードするとsync project
が通るようになります。- https://mvnrepository.com/artifact/org.greenrobot/greendao-gradle-plugin
- https://github.com/greenrobot/greenDAO/commit/1c45c2c581a5cd1dc2da025b3628d60dcf65bbed
- 後でさらに別のエラーが発生します
- この場合、gradleのgreendao設定のtargetGenDirを
targetGenDir = file("$buildDir/generated/source/greendao")
に変更します
- 同時にkaptに対応するargumentsを追加します
kapt { correctErrorTypes = true arguments { arg("greendao.targetGenDir", file("$buildDir/generated/source/greendao").absolutePath) arg("greendao.schema", "$projectDir/src/main/java") arg("greendao.daoPackage", "com.sand.airsos.database") arg("greendao.targetGenDir", "$projectDir/src/main/java") } }
- この場合、gradleのgreendao設定のtargetGenDirを