Android史上最も全gradleアップグレード3.0+問題まとめ(一)

6908 ワード

Android Gradle3.0は大きなバージョンのアップグレードで、アップグレードのメリットについては、ここではあまり言いません.直接乾かす.
アップグレード手順
現在、最新のgradleバージョンは3.2.0で、gradle-4.6-allに対応し、buildバージョン番号は28.2.2以上を必要としています.しかし28.2.2互換性には問題が多く、ここでは最新のものにアップグレードしません.
ここでは3.1.4にアップグレードしgradle 4.4,buildToolsVersionは27.03,targetSdkVarsion用27,compileSdkVarsion用27であった.
バージョン番号の変更
build.gradleファイル
dependencies {
    classpath 'com.android.tools.build:gradle:3.1.4'
    ....
}

allprojects {
    repositories {
        jcenter()
        google()//     
    }
}

gradle/wrapper/gradle-wrapper.propertiesファイル
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

app/build.gradleファイル
android {
    compileSdkVersion 27
    buildToolsVersion 27.0.3
    ....
    defaultConfig {
        targetSdkVersion 27
        ....
    }
}

//v4,v7      27.1.0
dependencies {
    implementation("com.android.support:support-v4:27.1.0") {
        exclude group:'com.android.support', module:'support-v4'
    }
    implementation("com.android.support:appcompat-v7:27.1.0") {
        exclude group:'com.android.support', module:'appcompat-v7'
    }
}

 
コンパイルを実行すると、さまざまなエラーが見つかります.次に、ゆっくり処理します.
問題の要約
1、outputFile
Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
なぜならoutputFileは読み取り専用属性になっており、これ以上中に書くことはできません.ここではパッケージ名の変更方法を変更する必要があります.以下はこちらの修正です
元のコード:
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('debug.apk')) {
        def fileName = "SFA_   .apk"
        output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

次のように変更します.
applicationVariants.all { variant ->
    variant.outputs.all {
        if (outputFile != null && outputFile.name.endsWith('debug.apk')) {
        outputFileName = "SFA_   .apk"
        }
    }
}

2、incremental属性は廃棄し、設定を削除する必要がある
DSL element 'DexOptions.incremental' is obsolete and will be removed at the end of 2018.
incrementalプロパティは破棄され、設定を削除する必要があります
dexOptions {
    //incremental true  //            
    ...
}

3、compile属性名変更
Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.umeng.analytics:analytics:6.1.2'
    ....
}

次のように変更します.
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    implementation 'com.umeng.analytics:analytics:6.1.2'
    ....
}

compile—>implementationまたはapi moduleに依存している場合はapiに変更する必要があります
testCompile—>testImplementationまたはtestApi
4、butterknife互換
Annotation processors must be explicitly declared now.  The following dependencies on the compile classpath are found to contain annotation processor.  Please add them to the annotationProcessor configuration.   - butterknife-7.0.1.jar (butterknife-7.0.1.jar)
この問題に対して、迅速な解決策がありますが、使用をお勧めしません.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
               includeCompileClasspath true
            }
        }
    }
}

gradle 3.0以降はこのプラグインの使用を推奨しないので、最新の使用方法を交換するのが望ましいです.以下のようにします.
ルートディレクトリのbuild.gradleファイルにこの文を追加します.
dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
}

app/build.gradleに次を追加します.
dependencies {
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

しかし、このように変更すると、bindの使用方法は以前とは異なり、コードには間違いが表示されるに違いありません.
エラー:シンボルが見つかりません:クラスBindの場所:パッケージbutterknife
@Bind(R.id.et_employee_id)は@BindView(R.id.et_employee_id)に変更する必要があります
コードが変更に関連しすぎる場合は、最初の方法を使用します.
5、moduleに依存して導入されたパッケージが見つからない
Compilation failed; see the compiler error output for details.
エラー:パッケージcom.loopj.android.httpは存在しません
これは、依存するmoduleにimplementationを使用すると、プライマリmoduleがパッケージを見つけられず、apiを使用して公開できるためです.
dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    implementation 'com.loopj.android:android-async-http:1.4.9'
}

変更する必要があります:
dependencies {
    api fileTree(dir: 'libs', include: '*.jar')
    api 'com.loopj.android:android-async-http:1.4.9'
}

6、AAPT 2エラー
AAPT2 error: check logs for details
Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
このエラーを報告する原因はたくさんありますが、結局はコード自体のエラーです.
多くの資料を参考にしたが、その一つの方法はgradle.properties androidを追加します.enableAapt 2=false、それから追加して、一部のプロジェクトは解決することができて、しかし一部のプロジェクトはやはり別の1つの間違いが現れます
The option 'android.enableAapt2' isdeprecated and should not be used anymore.
Use 'android.enableAapt2=true' to removethis warning.
It will be removed at the end of 2018..

これは、オプション「android.enableAapt 2」が破棄され、再使用されないためです.この警告を削除するには、「android.enableAapt 2=true」を使用します.2018年末に削除されます.
また、この設定も根本的に解決されていないのか、コードのエラーを見つけなければならないのか.
どうやって解決したのか、私のプロジェクトが28.2.2以上にアップグレードされたからこの問題が発生したことに気づきました.buildToolsVersionのバージョン番号を27.30に下げて、再コンパイルしてみましょう.そして完璧に通過しました.だから今は27.30のバージョンでいいです.最新のAS対応gradleは3.2.0ですが、buildToolsVersionバージョン番号は28.2.2以上であることが要求されていますので、3.1.4を使用したバージョンを選び、4.4に対応しました.
7、supportパッケージのクラスに問題が見つからない
エラー:シンボルが見つかりません:クラスKeyEventCompatの場所:パッケージandroid.support.v4.view
v 4パッケージは27.1.0の一部のクラスで見つからない可能性があるため、26.1.0に下げたり、代替クラスを探したりすることができます.
最後に私の構成を貼り付けます.
ext {
    minSdkVersion = 15
    targetSdkVersion = 27
    compileSdkVersion = 27
    buildToolsVersion = '27.0.3'
    supportVersion = '27.1.0'//
}

8、デバッグエラーInstant-Run
Installation failed with message Failed to establish session
次の2つの解決策をまとめます.
1.小米システムの携帯電話であれば、小米携帯開発者オプションの「miui最適化」オプションをオフにする
2.2.3を閉じたInstant-Runもこの問題を解決した.File---Settings---Build---Instant-Run---Enable Instant Run to hot swap code(チェックアウト)
上記の問題を効果的に解決することができる.
 
今直面している問題はこんなに多くて、後で続きます....
问题があったら交流を歓迎します....
機能業務については、Android史上最も全gradleアップグレード3.0+問題まとめを引き続きご覧ください(二)