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の認識とネット上の検索の結果を結びつけて、アップグレードログを整理した.
Gradle 4.1はチャネルごとにdimensionを構成する必要があります.デフォルトは
もちろんflavorごとに単独で上書きすることもできます
ButterKnifeは をアップグレードした
注:は従来の方法で注釈を処理し、エラープロンプトにはすでに の解決方法がある.
set
butterknife:7.0.1とbutterknife:8.4.0の差は大きい.例えば7.0.1のBind注釈はもうなく、BindXxx(BindViewなど)の代わりにbutterknife:8.4.0を使用するには、工事全体のコードを交換する必要があるに違いない.代価が高すぎる.もう1つのkotlinの解決策は、新しいbutterknifeにアップグレードした後、インポート別名を使用することです.
この方法はjavaを使用する場合、kotlinに変換するのも膨大な工事である.最新butterknifeバージョンは8.8.1です.https://github.com/JakeWharton/butterknife
Add Google Maven repository and sync project
ネット上のやり方は基本的に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を追加します.
注意: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 Android-7.0
実験とネットでの解決法: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
できます.参考概ね整理してAndroid Studio 3にアップグレードします.0で発生した問題
sdkHandler 2.14.1以降はなくなったようですが、主にndkコンパイルでndkパスを取得するために使用されており、以下のより一般的な方法を完全に使用することができます(純javaのため)
gradle4.1アップグレードの推奨事項 gradle-wrapperを修正する.properties Android gradle pluginアップグレード を直接削除する.注記プロセッサ修正 check-styleは使えないかもしれませんが、しばらくは使わないで、関連するプラグイン を注釈します.
この部分はまだ修復されていないが、Butterknifeソースコードにはcheck-styleの新版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.
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に変換するのも膨大な工事である.
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 Plugin
を3.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に関するドキュメントを参照してください.
そこで以下の実験を行いました.
$ 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
$ 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アップグレードの推奨事項
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
//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
}
}
}
...
}
//apply from: '../config/quality.gradle'
この部分はまだ修復されていないが、Butterknifeソースコードにはcheck-styleの新版gradleの使用について参考にすることができ、読者の補充修正を歓迎する.