AndroidStudio のアップグレード Gradle ピット

最近古いプロジェクトをアップグレードしています。元の 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 でコンパイルしましたが、もちろん、プロジェクトの実際のニーズに応じてこの値を適切に調整することもできます。

上記はピットを巡る旅です。皆さんのお役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/guo_zhen_qian/article/details/132347483