---
slug: "flutter-android-applinks-app-start-with-keystore-codesign"
title: "Flutter で Android アプリをビルドして、AppLinks でhttps:// の URL からアプリを起動できるようになるまで"
description: "Flutter で Android アプリをビルドし、AppLinks (https:// から起動) を動かすために必要な keystore 署名・SHA256 フィンガープリント取得・Digital Asset Links 設定の手順。"
url: "https://www.ytyng.com/blog/flutter-android-applinks-app-start-with-keystore-codesign"
publish_date: "2021-12-26T13:14:51Z"
created: "2021-12-26T13:14:51Z"
updated: "2026-05-11T13:06:14.337Z"
categories: ["Android", "Flutter"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/dc02bb3dc04a4ba7a4494c66e5869f64.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Flutter で Android アプリをビルドして、AppLinks でhttps:// の URL からアプリを起動できるようになるまで

<p>Android の AppLinks は、Android の Chrome で https:// 〜 の URL に遷移する際、パターンにマッチした時にアプリを起動する機能です。従来からある Deep Link とは違い、アプリを署名で判断するので、ドメイン内でコントロールしている特定のアプリのみに、安全に情報を渡すことができます。</p>
<p>その機能が使えるようになるまで書きます。</p>
<pre>% flutter doctor<br />Doctor summary (to see all details, run flutter doctor -v):<br />[✓] Flutter (Channel stable, 2.8.1, on macOS 12.0.1 21A559 darwin-arm, locale ja-JP)<br />[✓] Android toolchain - develop for Android devices (Android SDK version 32.0.0)<br />[✓] Xcode - develop for iOS and macOS (Xcode 13.1)<br />[✓] Chrome - develop for the web<br />[✓] Android Studio (version 2020.3)<br />[✓] IntelliJ IDEA Ultimate Edition (version 2021.3)<br />[✓] VS Code (version 1.62.3)<br />[✓] Connected device (2 available)</pre>
<p>(使うエディターは VS Code ではなく Android Studio です)</p>
<h1>新規アプリの作成</h1>
<p>Android Studio &rarr; File メニュー &rarr; New &rarr; New Flutter Project</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_01.png" alt="" width="677" height="637" /></p>
<p>Flutter &rarr; Next</p>
<p>Project name: my_link_app (自由につける)</p>
<p>Organization: com.ytyng (自由につける)</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_02.png" alt="" width="719" height="635" /></p>
<p>一度起動してみる。デモのカウンターアプリが起動する。</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_03.png" alt="" width="419" height="864" /></p>
<h2>キーストアの作成</h2>
<p>参考 https://developer.android.com/studio/publish/app-signing?hl=ja#generate-key</p>
<p><br />File -&gt; Open... から android ディレクトリを指定して Open。Androidのプロジェクトフォルダを Android Studio で新たに開く。</p>
<p>キーストアを作成する。既にあるキーストアを使う場合はこの手順は不要。</p>
<p>Build メニューから Generate Signed Bundle / APK... を選択</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_04.png" alt="" width="540" height="506" /></p>
<p>APK を選択して Next<br />(Android App Bundle でも問題無い)</p>
<p>Key store path で Create new... を押す</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_05.png" alt="" width="556" height="425" /></p>
<p>key store path を適当に指定。今回は、android フォルダの下に keystore.jks とかで作った。<br />password, confirm<br />など、埋める。</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_06.png" alt="" width="952" height="530" /></p>
<p>キーストアを作ったら、Next を押す</p>
<p>Build Variants の設定は、debug, profile, release を Shift を押して全部選択して Finish。</p>
<p>そのまま、android プロジェクトを開いている Android Studio の File -&gt; Project Structure</p>
<p>Modules の Signing Config を 見る</p>
<p>debug の config ができているので、この詳細を書く。<br />Store File はさきほど作ったキーストア、 Key Alias はさきほどの Alias (key0)、パスワードも入力。OKで閉じる</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_06.png" alt="" width="952" height="530" /></p>
<p>再度Project Structure.<br />Modules -&gt; Default Config の、Signing Config に、さきほどの debug 設定を入れておく。</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_07.png" alt="" width="948" height="530" /></p>
<p>Project Structure の Build Variants の、各バリアントの Signing Config にも、さきほどの debug 設定を入れる。</p>
<p>エミュレータで起動しているアプリを止めて再実行する。<br />すると、アプリの起動ができなくなるかもしれない。</p>
<pre>FAILURE: Build failed with an exception.<br /><br />* What went wrong:<br />Execution failed for task ':app:packageDebug'.<br />&gt; A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable<br />   &gt; Entry name 'assets/flutter_assets/AssetManifest.json' collided<br /><br />* Try:<br />Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.<br /><br />* Get more help at https://help.gradle.org<br /><br />BUILD FAILED in 11s<br />Exception: Gradle task assembleDebug failed with exit code 1</pre>
<p>署名が変わっており、再インストールできないため。</p>
<p>一度、エミュレータでアプリをアンインストールして再度起動してみると起動できる。</p>
<h2>署名を確認する</h2>
<p>作ったキーストアのフィンガープリントを確認する。</p>
<pre>% keytool -J-Duser.language=en -list -v -keystore android/keystore.jks<br />Enter keystore password: <br />Keystore type: PKCS12<br />Keystore provider: SUN<br /><br />Your keystore contains 1 entry<br /><br />Alias name: key0<br />Creation date: Dec 26, 2021<br />Entry type: PrivateKeyEntry<br />Certificate chain length: 1<br />Certificate[1]:<br />Owner: O=ytyng<br />Issuer: O=ytyng<br />Serial number: 4b0bf92f<br />Valid from: Sun Dec 26 21:16:44 JST 2021 until: Thu Dec 20 21:16:44 JST 2046<br />Certificate fingerprints:<br />    SHA1: 9D:CB:5B:FC:DE:30:94:5B:8B:AC:AC:B3:89:69:CE:3C:E8:6C:5A:2A<br />    SHA256: B3:A2:05:04:F6:75:A7:27:A3:77:96:E2:E1:CF:1B:9A:4B:90:3D:25:E6:67:D0:78:A5:C9:72:1C:D8:93:77:52<br />Signature algorithm name: SHA256withRSA<br />Subject Public Key Algorithm: 2048-bit RSA key</pre>
<p>もし、内容が日本語で表示されると、SHA256箇所がちゃんと表示されない不具合があるので、<code>-J-Duser.language=en</code> を指定して英語出力を強制する。</p>
<p><br />SHA256 のフィンガープリントを覚えておく。</p>
<p>デバッグビルドして Android エミュレータにインストールされたアプリの署名も確認する。</p>
<p></p>
<pre>% keytool -J-Duser.language=en -list -printcert -jarfile build/app/outputs/flutter-apk/app-debug.apk<br />Signer #1:<br /><br />Signature:<br /><br />Owner: O=ytyng<br />Issuer: O=ytyng<br />Serial number: 4b0bf92f<br />Valid from: Sun Dec 26 21:16:44 JST 2021 until: Thu Dec 20 21:16:44 JST 2046<br />Certificate fingerprints:<br />    SHA1: 9D:CB:5B:FC:DE:30:94:5B:8B:AC:AC:B3:89:69:CE:3C:E8:6C:5A:2A<br />    SHA256: B3:A2:05:04:F6:75:A7:27:A3:77:96:E2:E1:CF:1B:9A:4B:90:3D:25:E6:67:D0:78:A5:C9:72:1C:D8:93:77:52<br />Signature algorithm name: SHA256withRSA<br />Subject Public Key Algorithm: 2048-bit RSA key<br />Version: 3<br /><br />Extensions: </pre>
<p><br />署名が同じなので、さきほどのキーストアで署名ができていることが確認できた。</p>
<h2>インテントフィルタを書く</h2>
<p>参考 <a href="https://developer.android.com/studio/write/app-link-indexing?hl=ja">https://developer.android.com/studio/write/app-link-indexing?hl=ja</a></p>
<p><a href="https://qiita.com/noboru_i/items/fd4634ecb326b3749ac0">https://qiita.com/noboru_i/items/fd4634ecb326b3749ac0</a></p>
<p>android/app/src/main/AndroidManifest.xml を開いて<br />activity の中に &lt;intent-filter&gt; を追加する。</p>
<pre>&lt;intent-filter android:autoVerify="true"&gt;<br /> &lt;action android:name="android.intent.action.VIEW"/&gt;<br /><br /> &lt;category android:name="android.intent.category.DEFAULT"/&gt;<br /> &lt;category android:name="android.intent.category.BROWSABLE"/&gt;<br /><br /> &lt;data<br /> android:host="www.ytyng.com"<br /> android:pathPrefix="/my-app-link"<br /> android:scheme="https"/&gt;<br />&lt;/intent-filter&gt;</pre>
<p>今回は、 https://www.ytyng.com/my-app-link/xxxx を指定した時、アプリが起動するようにした。</p>
<h2>Min API Level の設定</h2>
<p>上記インテントフィルタを設定した時、AndroidManifest.xml を android フォルダを開いている Android Studio で見ると、<br />autoVerify="true" の箇所に警告が出て、 API level 23 and higher (current min is 16) と表示される。</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_09.png" alt="" width="959" height="476" /></p>
<p>Min API Level を設定するには、android ディレクトリ以下の <code>local.properties</code> を開いて、</p>
<pre>flutter.minSdkVersion=23</pre>
<p>を記入する。</p>
<p></p>
<h2><img src="https://www.ytyng.com/media/uploads/applink/applink_10.png" alt="" width="574" height="250" /><br /><br />uni_links の導入</h2>
<p>Pub から uni_links を入れる。</p>
<p><a href="https://pub.dev/packages/uni_links">https://pub.dev/packages/uni_links</a></p>
<p><code>pubspeck.yaml</code> の <code>dependencies</code> の中に</p>
<pre>uni_links: ^0.5.1</pre>
<p>を追加して、 Pub get する。</p>
<h2>ウィジェットの修正</h2>
<p>動作確認用に、起動URL を見れるようにしておく</p>
<p>簡易的に、デモアプリの main.dart に、uni_links の pub のページにある<br />getInitialLink() の結果を表示するコードを書いておく。</p>
<p>アプリ側の準備はこれで終わり。</p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_11.png" alt="" width="525" height="504" /></p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_12.png" alt="" width="747" height="317" /></p>
<h1><br />サーバサイドの設定</h1>
<p>サーバの <code>/.well-known/assetlinks.json</code> に、下記の内容を配置する。</p>
<pre>[<br />  {<br />    "relation": ["delegate_permission/common.handle_all_urls"],<br />    "target": {<br />      "namespace": "android_app",<br />      "package_name": "com.ytyng.my_link_app",<br />      "sha256_cert_fingerprints":<br />      ["B3:A2:05:04:F6:75:A7:27:A3:77:96:E2:E1:CF:1B:9A:4B:90:3D:25:E6:67:D0:78:A5:C9:72:1C:D8:93:77:52"]<br />    }<br />  }<br />]</pre>
<p>sha256_cert_fingerprints は、先程 keytool で確認した署名を入れる。</p>
<p>assetlinks.json をデプロイしたら、このツールで確認する</p>
<p><a href="https://developers.google.com/digital-asset-links/tools/generator?hl=ja">https://developers.google.com/digital-asset-links/tools/generator?hl=ja</a></p>
<p><img src="https://www.ytyng.com/media/uploads/applink/applink_13.png" alt="" width="867" height="520" /></p>
<p></p>
<p>起動動作確認用に、App Link を起動するページをデプロイする。</p>
<pre>&lt;a href="https://www.ytyng.com/auth?token=xxxxxx"&gt;アプリでログイン&lt;/a&gt;</pre>
<p>みたいなリンクを作って、そのページを Android の Chrome で表示する。</p>
<p>アプリは閉じておく。</p>
<p>リンクをクリックして、アプリが起動することを確認する。</p>
