Introduction

忘備録。
Zscaler を使っていると開発ツールが予期せぬ挙動を示すことが本当に多い。
さらにプロキシも使用して外部に接続しているとなお面倒だ。

掲題の通り、Flutter で Android アプリをビルドする際、Gradle が動くが、ロキシや証明書が邪魔をして、外部からのプラグイン等のダウンロードに失敗する。
当然、対策は用意されていて、証明書に関して言えば、Java に証明書を認識させればいい。
例えば OSX ならこんな感じ。

1
$ sudo keytool -import -trustcacerts -file cert.cer -keystore /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home/jre/lib/security/cacerts -alias ca

無論、Gradle を実行する Java と証明書のインストール先の Java は同一である。
が、それでも Gradle が認識しない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ flutter build apk

...

* What went wrong:
Execution failed for task ':shared_preferences_android:extractReleaseAnnotations'.
> Error while evaluating property 'hasAndroidAnnotations' of task ':shared_preferences_android:extractReleaseAnnotations'
> Could not resolve all artifacts for configuration ':shared_preferences_android:releaseCompileClasspath'.
> Failed to transform flutter_embedding_release-1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf.jar (io.flutter:flutter_embedding_release:1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf) to match attributes {artifactType=android-classes-jar, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-api}.
> Could not download flutter_embedding_release-1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf.jar (io.flutter:flutter_embedding_release:1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf)
> Could not get resource 'https://storage.googleapis.com/download.flutter.io/io/flutter/flutter_embedding_release/1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf/flutter_embedding_release-1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf.jar'.
> Could not GET 'https://storage.googleapis.com/download.flutter.io/io/flutter/flutter_embedding_release/1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf/flutter_embedding_release-1.0.0-b20183e04096094bcc37d9cde2a4b96f5cc684cf.jar'.
> The server may not support the client's requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. See: https://docs.gradle.org/7.5/userguide/build_environment.html#gradle_system_properties
> PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

なぜ?

How to resolve?

Gradle の設定に証明書の場所を指定されればいい。
Gradle の設定は ~/.gradle/gradle.properties にある。

1
2
3
4
5
6
7
8
systemProp.http.nonProxyHosts=localhost
systemProp.http.proxyHost=proxyhost.co.jp
systemProp.http.proxyPort=8080
systemProp.https.nonProxyHosts=localhost
systemProp.https.proxyHost=proxyhost.co.jp
systemProp.https.proxyPort=8080
+ systemProp.javax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home/jre/lib/security/cacerts
+ systemProp.javax.net.ssl.trustStorePassword=changeit

プロキシの設定と一緒に記載すればOK。
当然、keytool で上記のファイルに証明書を追加する必要があるのは変わらない。