この記事を作った動機
React で作った Web アプリを Android に移植しようとしたら超絶めんどくさかったので、記録するだけ。
自分の試した構成
- Vite
- React
- TypeScript
- Android Studio (with SDK)
npm create vite@latest
使った汎用コマンド集
すべての環境変数をリスト (Windows,PowerShell)
gci env:* | sort-object name
環境変数を新規作成 (Windows,PowerShell)
# 具体例 ANDROID_HOME にパスを設定する
$env:ANDROID_HOME = "C:\Users\[userName]\AppData\Local\Android\Sdk"
特定の環境変数に対してパスを追加 (Windows,PowerShell)
# 具体例 ANDROID_HOME にパスを追加設定する
$env:ANDROID_HOME += ";C:\Users\[userName]\AppData\Local\Android\Sdk"
準備
Capacitor を使えるようにする
必要なパッケージのインストール
npm i @capacitor/core
npm i @capacitor/android
初期化する
npx cap init
android 向けに初期化する
npx cap add android
ANDROID_HOMEを設定する
Android SDK のパスが、エラー例
ANDROID_HOMEとして環境変数に設定されていない場合は、以下のようなエラーが出てくる。npx cap build android
# × Running Gradle build - failed!
# [error]
# > Configure project :app
# WARNING: Using flatDir should be avoided because it doesn't support any meta-data formats.
# > Configure project :capacitor-cordova-android-plugins
# WARNING: Using flatDir should be avoided because it doesn't support any meta-data formats.
# FAILURE: Build failed with an exception.
# * What went wrong:
# Could not determine the dependencies of task ':app:bundleReleaseResources'.
# > SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting
# the sdk.dir path in your project's local properties file at 'C:\Users\userName\work\TODOListApp\TODO
# List\android\local.properties'.
# * Try:
# > 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.
# > Get more help at https://help.gradle.org.
# BUILD FAILED in 1s
ANDROID_HOMEとは、Android SDK のパスのことで、設定が必要である。私の環境では、Android SDK は以下の場所にあった。Android Studio 内では、Tools -> SDK Manager からパスを確認できた。
C:\Users\[userName]\AppData\Local\Android\Sdk
設定方法としては、いくつかあるが、今回は PowerShell 内で直接パスを一時的に設定する例を以下に示す。
$env:ANDROID_HOME = "C:\Users\[userName]\AppData\Local\Android\Sdk"
JAVA_HOMEを設定する
エラー例
JAVA_HOMEに設定されている Java のバージョンが一致しない場合、以下のエラーが出てくる。invalid source release: 21と言われる。npx cap build android
# × Running Gradle build - failed!
# [error] Starting a Gradle Daemon, 1 incompatible and 2 stopped Daemons could not be reused, use --status for details
# > Configure project :app
# WARNING: Using flatDir should be avoided because it doesn't support any meta-data formats.
# > Configure project :capacitor-cordova-android-plugins
# WARNING: Using flatDir should be avoided because it doesn't support any meta-data formats.
# > Task :app:preBuild UP-TO-DATE
# ...
# > Task :capacitor-android:compileReleaseJavaWithJavac
# FAILED
# [Incubating] Problems report is available at:
# file:///C:/Users/userName/work/TODOListApp/TODO%20List/android/build/reports/problems/problems-report.html
# FAILURE: Build failed with an exception.
# * What went wrong:
# Execution failed for task ':capacitor-android:compileReleaseJavaWithJavac'.
# > error: invalid source release: 21
# * Try:
# > 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.
# > Get more help at https://help.gradle.org.
# BUILD FAILED in 19s
# 36 actionable tasks: 1 executed, 35 up-to-date
JAVA_HOMEとは、Java に関するパスのことで、Android SDK に対して、正しいバージョンのJAVA がインストールされたパスを指定する必要がある。
私の場合は、Android Studio がインストールされた場所に抱き合わせて存在する Java を指定することで、正しく Capacitor が動作するようになった。
個別に分けてインストールした Java も使うことができると思われるが、基本的にバージョンを合わせるのがめんどくさすぎたので今回はそちらの方ではやらなかった。
私の場合は、まず Android Studio が以下のパスにインストールされていた。
C:\Program Files\Android\Android Studio
それで、Android Studio に抱き合わせでインストールされる Java は以下のパスにインストールされていた。(javaw.exeがあるかどうかがヒント)
C:\Program Files\Android\Android Studio\jbr
よって、以下のようにしてJAVA_HOMEを設定した。必ずしも今回示したパスに Java があるとは限らないので、各自確認する必要はある。
$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"
ビルド
Android Studio でビルドして署名させる (私的用途で使う場合)
Android アプリは動くようにするために何かしらの形で、ストアアプリとして公開していなくても自己証明書による署名が必要なことが分かった。そこで今回は、Android Studio から直接自己証明書で署名されたアプリをビルドすることにした。
自己証明書の生成から APK生成までの流れ
- Android Studio で Capacitor が生成したプロジェクトを開く。
# Web アプリの最新の開発内容を反映する
npm run build
npx cap sync
# Android Studio で開く
npx cap open android
- 署名付き APK を生成しようとする
APK ファイルが生成される
Loading personal and system profiles took 5096ms.
(base) PS C:\Users\userName\work\TODOListApp\TODO List\android\app\release> ls
Directory: C:\Users\userName\work\TODOListApp\TODO List\android\app\release
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/21/2025 10:05 PM baselineProfiles
-a---- 11/21/2025 10:05 PM 3370918 app-release.apk
-a---- 11/21/2025 10:05 PM 703 output-metadata.json
npx cap 経由のビルド (私的用途で使う場合、うまく行かなかった)
署名を指定していない場合、エラー例
npx cap 経由ではビルド時に以下のエラーが出る。ビルド自体は通っているが、署名に関する指定がされていないと怒られる。npx cap build android
# √ Running Gradle build in 3.28s
# [error] Missing options. Please supply all options for android signing. (Keystore Path, Keystore Password, Keystore Key
# Alias, Keystore Key Password)
Capacitor 経由でのビルドによる署名に関しては、npx cap build androidをする時点で、引数として以下の項目を指定する必要がある。
- –keystorepath
- –keystorepass
- –keystorealias
- –keystorealiaspass
# Web アプリの最新の開発内容を反映する
npm run build
npx cap sync
# Android 向けにビルドする
npx cap build android --keystorepath ["C:\\Path\\to\\key\\selfSign.jks"] --keystorepass [password ]--keystorealias [keyAliasName] --keystorealiaspass [password] --androidreleasetype APK
ただ私の環境では結局、うまくビルドすることが以下のようになりできなかった。調べてみると、手動で署名している例がいくつかあり、npx cap build androidによる APK 生成はちゃんと動かない気がしている。
npx cap build android --keystorepath ["C:\\Path\\to\\key\\selfSign.jks"] --keystorepass [password ]--keystorealias [keyAliasName] --keystorealiaspass [password] --androidreleasetype APK
# √ Running Gradle build in 2.56s
# × Signing Release - failed!
# [error] jarsigner: unable to open jar file: C:\Users\userName\work\TODOListApp\TODO
# List\android\app\build\outputs\apk\release\app-release-unsigned.apk
自己証明書の生成
もし、Android Studio に署名させる (私的用途で使う場合) において自己証明書をまだ生成していない場合は、以下のようにして生成できるようである。
以下は、[Build your app from the command line | Android Studio | Android Developers] https://developer.android.com/build/building-cmdlineの引用
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
やれること
APK 生成
ビルド を参考にすること。
テストラン
# Web アプリの最新の開発内容を反映する
npm run build
npx cap sync
# Android エミュレータでアプリとしてデバッグする
npx cap run android
Android Studio で開く
# Web アプリの最新の開発内容を反映する
npm run build
npx cap sync
# Android Studio で開く
npx cap open android
参考にしたサイトとか
- ChatGPT
https://chatgpt.com/ (2025年11月21日) - Display all environment variables from a running PowerShell script - Stack Overflow
https://stackoverflow.com/questions/39800481/display-all-environment-variables-from-a-running-powershell-script (2025年11月21日) - Development Workflow | Capacitor Documentation
https://capacitorjs.com/docs/basics/workflow (2025年11月21日) - Android SDK location - Stack Overflow
https://stackoverflow.com/questions/25176594/android-sdk-location (2025年11月21日) - Setting Windows PowerShell environment variables - Stack Overflow
https://stackoverflow.com/questions/714877/setting-windows-powershell-environment-variables (2025年11月21日) - about_Environment_Variables - PowerShell | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.5 (2025年11月21日) - Installing Capacitor | Capacitor Documentation
https://capacitorjs.com/docs/getting-started (2025年11月21日) - android - How can I create a keystore? - Stack Overflow
https://stackoverflow.com/questions/3997748/how-can-i-create-a-keystore (2025年11月21日) - Sign your app | Android Studio | Android Developers
https://developer.android.com/studio/publish/app-signing (2025年11月21日) - How to generate a new JKS/Keystore? - Handyman Services
https://documentation.iqonic.design/handyman/app-faqs/how-to-generate-a-new-jks-keystore (2025年11月21日) - SSL Certificate Country Codes
https://knowledge.digicert.com/general-information/ssl-certificate-country-codes (2025年11月21日) - Build your app from the command line | Android Studio | Android Developers
https://developer.android.com/build/building-cmdline#gradle_signing (2025年11月21日) - CLI Command - cap build | Capacitor Documentation
https://capacitorjs.com/docs/cli/commands/build (2025年11月21日) - [Bug]: Signing with build command still not working in 6.0.0-rc.0? · Issue #7299 · ionic-team/capacitor
https://github.com/ionic-team/capacitor/issues/7299 (2025年11月21日) - [Bug]: npx cap build not building signed apk with –signing-type apksigner · Issue #7366 · ionic-team/capacitor
https://github.com/ionic-team/capacitor/issues/7366 (2025年11月21日) - Android build & sign with cap build android - missing app-release-unsigned.apk - Capacitor - Ionic Forum
https://forum.ionicframework.com/t/android-build-sign-with-cap-build-android-missing-app-release-unsigned-apk/244780 (2025年11月21日)