見出し画像

【Flutter】Algorithm HmacPBESHA256 not availableを解決する

   > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
     > com.android.ide.common.signing.KeytoolException: Failed to read key release from store "/Users/tanukidevelop/Documents/Sourcetree/pokeca_deck_manager/pokeca_deck_manager/android/app/release.jks": Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available

以前記事でも触れたのですがnull safety対応ではないプラグインでのビルドを行なって、null safetyに対応していないことを許容した上でapkファイルを生成する方法までは辿り着きました。

それですが冒頭のようなエラーを出されて、1日悩みました。
ガチで24時間対応している中で解決したのでトラブルシューティング記しておきます。(記事にいいね!の方よろしくお願いします)

結論

証明書を作り直すでした。ただコマンドが異なるので注意して下さい。

keytool -genkey -v -keystore ~/release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias release -storetype JKS

こちらのコマンドを実行してください。
keystore名はrelease.jksでキーエイリアス名はreleaseです。(任意に変更して下さい。)

このコマンドで大事なのは-storetype JKSです。

そしてこちらをandroid/app直下にコピーしてFinder(フォルダ)上で置いてください。

証明書の作り方は普通の作り方と変わりません(姓名と2桁のJPのみは入れましょう)


/app/build.gradleファイルを更新する

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
   localPropertiesFile.withReader('UTF-8') { reader ->
       localProperties.load(reader)
   }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
   throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
   flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
   flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
   compileSdkVersion 30

   sourceSets {
       main.java.srcDirs += 'src/main/kotlin'
   }

   defaultConfig {
       // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
       applicationId "com.pokeca_deck_manager"
       minSdkVersion 16
       targetSdkVersion 30
       versionCode flutterVersionCode.toInteger()
       versionName flutterVersionName
       testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
   }

   signingConfigs {
       release {
           storeFile file("release.jks")
           storePassword "release000"
           keyAlias "release"  
           keyPassword "release000"
       }
   }

   buildTypes {
       release {
           // TODO: Add your own signing config for the release build.
           // Signing with the debug keys for now, so `flutter run --release` works.
           signingConfig signingConfigs.release
       }
   }
}

flutter {
   source '../..'
}

dependencies {
   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

signingConfigs内のreleaseは証明書発行時のパスなどを設定して下さい。
ここが隠されていると分からなくなりそうなので試しに適当な文字列で入力したコードの状態にしております。

これでいけます。

key.propertiesを作成してbuild.gradleを参照するだけで分からなくして、key.propertiesをgit ignoreにするのもありだと思います。


追記

1回アプリ名に類似した証明書を作成したら失敗しました。名前だけ変えたら成功しました。一度下記そのまんまでやってみてください。

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS



この記事が気に入ったらサポートをしてみませんか?