Instala Node.js

Instala Bubblewrap:

npm install -g @bubblewrap/cli

Ubícate en la carpeta de tu proyecto

Crear el archivo twa-manifest.json

{
  "packageId": "com.myapp",
  "host": "myapp.com",
  "name": "My App",
  "launcherName": "My App",
  "display": "standalone",
  "themeColor": "#1F4D9D",
  "themeColorDark": "#000000",
  "navigationColor": "#FFFFFF",
  "navigationColorDark": "#000000",
  "navigationDividerColor": "#000000",
  "navigationDividerColorDark": "#000000",
  "backgroundColor": "#FFFFFF",
  "enableNotifications": true,
  "startUrl": "/",
  "iconUrl": "ruta/imagen-512x512.png",
  "splashScreenFadeOutDuration": 3000,
  "signingKey": {
    "path": "ruta/keystore.jks",
    "alias": "alias",
    "password": "",
    "keyPassword": ""
  },
  "appVersionName": "2",
  "appVersionCode": 17,
  "shortcuts": [],
  "generatorApp": "bubblewrap-cli",
  "fallbackType": "customtabs",
  "features": {},
  "alphaDependencies": {
    "enabled": false
  },
  "enableSiteSettingsShortcut": true,
  "isChromeOSOnly": false,
  "isMetaQuest": false,
  "minSdkVersion": 19,
  "orientation": "portrait",
  "fingerprints": [],
  "additionalTrustedOrigins": [],
  "retainedBundles": [],
  "appVersion": "2"
}

Verificar archivo gradle.properties

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
org.gradle.jvmargs=-Xmx1048m
android.useAndroidX=true

Ejecutar

bubblewrap build

Ubica el archivo APK: El archivo APK generado se encontrará en la carpeta de tu proyecto. Por lo general, se ubicará en la subcarpeta outputs dentro de la carpeta de tu proyecto.