Gradle 2.4.1=>Gradle 4.1アップグレードログ

10912 ワード

[TOC]2017年11月初めにAndroid Studioを3.0.0にアップグレードし、このバージョンのasは多くの更新を行い、java 8、kotlinなどをサポートし、gradleも4.1にアップグレードし、コンパイルのスピードを速めたなど、多くの機能を追加した(Android Studio Release Notes).そこで筆者はASのアップグレード3.0、gradleプラグインのアップグレード4.1に対してテストを行ったが、使いにくいところは発見されなかった(as 1.5が2.0にアップグレードする時、jniのプログラミングをテストするのは1.5に及ばない)、アップグレードの過程でいくつかの問題に遭遇し、gradleの認識とネット上の検索の結果を結びつけて、アップグレードログを整理した.

All flavors must now belong to a named flavor dimension.

Error:All flavors must now belong to a named flavor dimension.  Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

Gradle 4.1はチャネルごとにdimensionを構成する必要があります.デフォルトはdefaultで簡単に指定できます(flavorはdefaultの構成をデフォルトで使用します).
android {
    defaultConfig {
        flavorDimensions "mcpe"
    }
}

もちろんflavorごとに単独で上書きすることもできます
mcpe1010 {
    applicationId "com.mojang.minecraftpe11"
    versionCode 871010000
    versionName "1.1.0"
    flavorDimensions "mcpe1.1.0"
}

test1 {
    applicationId "com.test"
    versionCode 100
    versionName "0.2.0"
    flavorDimensions "mcpetest"
}

Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated

//2.14.1
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            def flavor = variant.productFlavors[0]
            def versionName = (flavor.versionName == null ? defaultConfig.versionName : flavor.versionName)
            def fileName = "mcpetool_v${versionName}_${flavor.name}.apk"
            output.outputFile = new File(outputFile.parent + "/apk", fileName)
        }
    }
}


//4.1
applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def outputFile = output.outputFile
        println "output file : ${outputFile}"
        def flavor = variant.productFlavors[0]
        def versionName = (flavor.versionName == null ? defaultConfig.versionName : flavor.versionName)
        outputFileName = "mcpetool_v${versionName}_${flavor.name}.apk"
    }
}

output.outputFileは出力ファイルを指し、4.1はoutputFileNameを使用して出力ファイル名を指定し、位置は${module}/build/outputs/apk/${flavor.name}である.

Annotation processors must be explicitly declared now.

> 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 (com.jakewharton:butterknife:7.0.1)
  Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior.  Note that this option is deprecated and will be removed in the future.
  See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.

  • ButterKnifeは
  • をアップグレードした
    com.jakewharton:butterknife:7.0.1 => com.jakewharton:butterknife:8.4.0
    
    Annotation processorsを指定する必要がある場合:
    dependencies{
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
        compile 'com.jakewharton:butterknife:8.4.0'
    }
    

    注:butterknife:8.4.0中移ButterKnife.unbind(Context)を除く
  • は従来の方法で注釈を処理し、エラープロンプトにはすでに
  • の解決方法がある.
    set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
    android{
        defaultConfig{
            //...
            javaCompileOptions {
                annotationProcessorOptions {
                    includeCompileClasspath true
                }
            }
        }
        //...
    }
    

    butterknife:7.0.1とbutterknife:8.4.0の差は大きい.例えば7.0.1のBind注釈はもうなく、BindXxx(BindViewなど)の代わりにbutterknife:8.4.0を使用するには、工事全体のコードを交換する必要があるに違いない.代価が高すぎる.もう1つのkotlinの解決策は、新しいbutterknifeにアップグレードした後、インポート別名を使用することです.
    import butterknife.BindView as Bind
    

    この方法はjavaを使用する場合、kotlinに変換するのも膨大な工事である.
  • 最新butterknifeバージョンは8.8.1です.https://github.com/JakeWharton/butterknife

  • Error:The specified Android SDK Build Tools version (23.0.2) is ignored

    Error:The specified Android SDK Build Tools version (23.0.2) is ignored, as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.0.
    Android SDK Build Tools 26.0.2 will be used.
    To suppress this warning, remove "buildToolsVersion '23.0.2'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
    
    buildToolsVersionを26.2.2に設定(Gradle Plugin 3.0からbuildToolsVersionを指定する必要がなく、必要な最低バージョンを自動的に構成できる)、Gradle Plugin3.0.0に設定

    Error:Failed to resolve: com.android.support:multidex:1.0.2


    Add Google Maven repository and sync project
    //root project's build.gradle
    buildscript {
        repositories {
            mavenCentral()
            jcenter()
            google()//add this
        }
    }
    
    allprojects{
        repositories {
            jcenter()
            google()//add this
        }
    }
    

    style attribute '@android:attr/windowExitAnimation' not found.


    ネット上のやり方は基本的にgradle.propertiesにandroidを入れるenableAapt 2=false、aapt 2を無効にする(新しい機能は基本的に古い機能に取って代わるので、直接無効にすることを提案しないで、先に修復を試みて、だめになってから禁止して、原理を理解してプロジェクトを結びつけて適切な調整をするのが望ましい).ここでエラーのコードを探して修正します.
     
    

    この声明は以前のバージョンで間違いなくバグだった可能性がありますが、修正後は
     
    

    パッケージ署名


    アップグレード後に署名パッケージを打つ場合、強制的に署名方法を選択する必要があります(V 1:Jar signature V 2:Full Apk signature)
    V 2の紹介は中国語公式サイトより
    APK signature scheme v2
    Android 7.0は、APK Signature Scheme v 2の新しいアプリケーション署名スキームを導入し、アプリケーションのインストール時間を短縮し、許可されていないAPKファイルの変更に対する保護を提供します.デフォルトでは、Android Studio 2.2とAndroid Plugin for Gradle 2.2は、APK Signature Scheme v 2と従来の署名スキームを使用してアプリケーションに署名します.
    アプリケーションにAPK Signature Scheme v 2を使用することをお勧めしますが、この新しいスキームは強制的ではありません.アプリケーションがAPK Signature Scheme v 2で正しく開発されていない場合は、この新しいスキームを無効にできます.プロセスを無効にすると、Android Studio 2.2とAndroid Plugin for Gradle 2.2は、従来の署名スキームのみを使用してアプリケーションに署名します.従来のシナリオのみで署名するには、モジュールレベルbuildを開きます.gradleファイルを使用して、バージョン署名構成に行v 2 SigningEnabled falseを追加します.
      android {
        ...
        defaultConfig { ... }
        signingConfigs {
          release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
            v2SigningEnabled false
          }
        }
      }
      
    

    注意:APK Signature Scheme v 2を使用してアプリケーションに署名し、アプリケーションをさらに変更した場合、アプリケーションの署名は無効になります.そのため、アプリケーションに署名する前に、後でzipalignなどのツールを使用するのではなく、APK Signature Scheme v 2を使用してください.
    詳細については、Android Studioでアプリケーションに署名する方法と、Android Plugin for Gradleを使用してアプリケーションに署名するためのプロファイルを説明したAndroid Studioに関するドキュメントを参照してください.
    そこで以下の実験を行いました.
  • 応用署名パッケージ、伝統的な方式:dev 0、V 1署名:dev 1、V 2署名:dev 2、V 1 V 2都署名:dev 12、テスト携帯電話は先にdev 0
  • をインストールする
  • Android-5.0
  • $ adb install -r dev1.apk 
        pkg: /data/local/tmp/dev1.apk 
    Success
    $ adb install -r dev2.apk 
        pkg: /data/local/tmp/dev2.apk 
    Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
    $ adb install -r dev12.apk 
        pkg: /data/local/tmp/dev12.apk 
    Success
    
  • Android-7.0
  • $ adb install -r dev1.apk 
        pkg: /data/local/tmp/dev1.apk 
    Success
    $ adb install -r dev2.apk 
        pkg: /data/local/tmp/dev2.apk 
    Success
    $ adb install -r dev12.apk 
        pkg: /data/local/tmp/dev12.apk 
    Success
    

    実験とネットでの解決法:1)v 1のみチェックしても何の影響もありませんが,7.0ではより安全な検証方式は使用されません2)V 2のみチェックして7.0以下では直接インストールされていません表示がインストールされていません.7.0以上ではV 2を使用して検証されています3)V 1とV 2をチェックするとすべての機種に問題はありません
    参考:Android Studioの本格パッケージ化で出会ったSignature Version V 1 V 2

    Error:Execution failed for task ':launcherActivity:transformNativeLibsWithMergeJniLibsForDebug'.

    Error:Execution failed for task ':launcherActivity:transformNativeLibsWithMergeJniLibsForDebug'.
    > More than one file was found with OS independent path 'lib/armeabi-v7a/libmcpelauncher_tinysubstrate.so'
    
    sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
            jni.srcDirs = [] //disable automatic ndk-build call
        }
    }
    
    ==>
    
    sourceSets{
        main{
            jniLibs.srcDirs = []
            jni.srcDirs = [] //disable automatic ndk-build call
        }
    }
    

    できます.参考概ね整理してAndroid Studio 3にアップグレードします.0で発生した問題

    No such property: sdkHandler for class: com.android.build.gradle.AppPlugin Open File


    sdkHandler 2.14.1以降はなくなったようですが、主にndkコンパイルでndkパスを取得するために使用されており、以下のより一般的な方法を完全に使用することができます(純javaのため)
    
        def ndkDir = plugins.getPlugin('com.android.application').sdkHandler.getNdkFolder()
    
        ==>
    
        def file = project.file("${rootProject.rootDir}/local.properties")
        Properties pro = new Properties()
        pro.load(new FileInputStream(file))
        def ndkDir = pro.getProperty("ndk.dir")
    

    gradle4.1アップグレードの推奨事項
  • gradle-wrapperを修正する.properties
    distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
    
  • Android gradle pluginアップグレード
    //build.gradle
    buildscript {
       ...
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.0'
        }
    }
    
    
  • buildToolsVersion="26.0.2"または
  • を直接削除する.
  • 注記プロセッサ修正
    dependenceies{
     apt  ==> annotationProcessor
    }
    
    // 
    android{
        defaultConfig{
            ...
            flavorDimensions "any-string-you-want-here-to-specify-a-dimension"  
            javaCompileOptions {
                annotationProcessorOptions {
                    includeCompileClasspath true
                }
            }
        }
        ...
    }
    
  • check-styleは使えないかもしれませんが、しばらくは使わないで、関連するプラグイン
    //apply from: '../config/quality.gradle'
    
  • を注釈します.
    この部分はまだ修復されていないが、Butterknifeソースコードにはcheck-styleの新版gradleの使用について参考にすることができ、読者の補充修正を歓迎する.