最近古いプロジェクトをアップグレードしています。元の Gradle バージョンは 4.6 で、7.6 にアップグレードする必要があります。JDK は 8 から 17 にアップグレードされています。途中で落とし穴がたくさんあります。一つずつ記録してみましょう。
1. Maven ウェアハウスを https にアップグレードする必要があります
このエラーが発生します
明示的なオプトインを行わずに、リポジトリで安全でないプロトコルを使用することはサポートされていません。Maven リポジトリ「maven(http://mapmo.baidu.com/artifactory/libs-release)」を切り替えて、安全なプロトコル (HTTPS など) にリダイレクトするか、安全でないプロトコルを許可します。詳細については、https://docs.gradle.org/7.6.1/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol を参照してください。
https化できない場合は対応させる方法がありますので、以下の方法に変更してください。
maven {
url "http://xxxxxx.com/artifactory/libs-release"
allowInsecureProtocol = true
credentials {
username ""
password ""
}
}
2. Gradle 構文をアップグレードすると、次のエラーが発生します。
org.gradle.api.internal.artifacts.dsl.dependency.DefaultDependencyHandler 型のオブジェクトの引数 [com.android.support:appcompat-v7:26.+] のメソッド provided() が見つかりませんでした
org.gradle.api.internal.artifacts.dsl.dependency.DefaultDependencyHandler 型のオブジェクトの引数 [ディレクトリ 'libs'] のメソッドcompile()が見つかりませんでした
変更は簡単です
提供--->compileOnly
コンパイル--->実装
3. Proguard が見つからない
org.gradle.api.Project タイプのプロジェクト ':XXXXX' の不明なプロパティ 'proguard' を取得できませんでした。
これは、gradle の上位バージョンがデフォルトで R8 に設定されているためです。proguard を自分で導入する必要があります。GPT ももっともらしい答えを返しました。この問題は解決するまで長い間苦しみました。方法は次のとおりです。
プロジェクトの build.gradle ファイルに proguard を導入します。
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath 'com.guardsquare:proguard-gradle:7.1.0'
}
4. BuildConfig ファイルが見つかりません
古いバージョンの Gradle ファイルの場合、buildTypes でリリース オプションを構成でき、デバッグ BuildConfig ファイルも生成され、プロジェクト内で参照できます。アップグレード後、buildTypes でデバッグ オプションが構成されていない場合、デバッグ BuildConfig ファイルは生成されず、プロジェクトが参照されていないときにエラーが報告されます。
前のファイルを変更する
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
frame {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
修正後
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
frame {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
デバッグを追加するだけです
5. BuildConfig ファイル内に見つからない属性があります。
これも非常に面倒です。私の BuildConfig ファイルには、見つからない VERSION_NAME 属性があります。生成された BuildConfig ファイルにも見つかりません。また、build.gradle ファイルにも同様のものは見つかりませんでした。
buildConfigField "文字列"、"VERSION_NAME"、"11.2"
このような記述なので、前のコードがどのようにコンパイルされたのか非常に興味があります。
最後に、古いバージョンの gradle は、defaultConfig の versionCode 属性と versionName 属性を自動的に VERSION_CODE 属性と VERSION_NAME 属性に変更し、BuildConfig ファイルに追加しますが、新しいバージョンの gradle ファイルはこれを気にしないことが判明しました。
だから自分で追加してください
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName rootProject.ext.MAPCOM_VERSION
buildConfigField "String", "VERSION_NAME", "\"${rootProject.ext.MAPCOM_VERSION}\""
buildConfigField "String", "MECP_VERSION", "\"${rootProject.ext.MECP_VERSION}\""
buildConfigField "String", "MAPCOM_VERSION", "\"${rootProject.ext.MAPCOM_VERSION}\""
buildConfigField "String", "ENGINE_VERSION", "\"${rootProject.ext.ENGINE_VERSION}\""
buildConfigField "String", "MANUFACTURER", "\"${rootProject.ext.MANUFACTURER}\""
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
6.class.jarが見つかりません
私のプロジェクトでは、いくつかのプロジェクトを jar にコンパイルする必要があり、gradle 関数の実装を自分で作成しましたが、このエラーが発生しました。
ZIP '/home/GitDownload/mappreset/mapcom/android/ComBase/build/intermediates/packaging-classes/release/classes.jar' が存在しないため展開できません
元のコードは次のように書かれています
def zipFile = file('build/intermediates/packaging-classes/release/classes.jar')
または、新しいバージョンの gradle によって生成された class.jar のパスが変更されている場合は、以下のパスに変更してください。
def zipFile = file('build/intermediates/aar_main_jar/release/classes.jar')
7. 戦略の重複問題
エラーは次のように報告されます
エントリassets/CircleDashTexture.pngは重複していますが、重複処理戦略が設定されていません。詳細については、https://docs.gradle.org/7.6.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy を参照してください。
jar パッケージのコンパイル機能でエラーを報告しました。修正は難しくありません。次のように、最初の文に競合処理戦略を追加するだけです。
task makeJar(type:Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveName = SDK_BASENAME + "_" + SDK_VERSION + '.jar'
// 复制资源文件
from fileTree(dir: 'src/main', includes: ['assets/**'])
***********
}
8.AIDLファイルのコンパイルエラー
このエラーが発生した場合は、org.gradle.api.tasks.TaskExecutionException: タスク ':app:compileDebugAidl' の実行に失敗しました。
同時に、
* 例外は次のとおりです: [2023-08-24 11:28:29] java.lang.OutOfMemoryError: メタスペース
これは通常、コンパイル時に使用されるメタデータがMetaspace
制限を超えていることが原因であり、gradle.properties ファイルにメタデータを追加することで解決できます。
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
増加したMetaspace
サイズは 512MB です。私は 512MB でコンパイルしましたが、もちろん、プロジェクトの実際のニーズに応じてこの値を適切に調整することもできます。
上記はピットを巡る旅です。皆さんのお役に立てれば幸いです。