跳转到内容
Skip 中文站
3.2k

部署

Skip 应用项目会通过将 gradle 进程作为 Xcode 构建过程中 Run Scripts 阶段的一部分来启动,从而构建并运行应用的 Android 版本。这种机制使开发者能够通过在 iOS 模拟器和 Android 模拟器中同时运行 iOS 和 Android 版本来快速迭代应用。同样,Skip 框架测试会通过在转译后的模块上运行 gradle test 来执行转译后的 Kotlin 测试用例。

在项目目录中从终端运行 skip export 命令将构建你的 Skip 框架或应用,并将所有二进制产物导出到 -d 参数指定的文件夹中。这包括当前项目中每个目标的 .aar 库归档文件,以及所有依赖的归档文件。这些二进制产物可用于任何 Kotlin 或 Java 构建流程或 IDE。例如,Kotlin 开发团队可以手动将它们添加到 Android Studio 项目中,以便使用 Skip 创建的共享数据模型。

Framework Export Screenshot

对于应用项目,skip export 命令还会额外导出应用的 .apk 和 .aab 归档文件,可以直接安装到 Android 设备上或上传到 Android 应用商店(如 Google Play 商店)。

Framework Export Screenshot

调试 APK(.build/skip-export/AppName-debug.apk)使用临时密钥签名。你可以将其安装到模拟器或设备上进行测试,但在安装更新版本之前需要先卸载它(与可以就地升级的生产应用不同)。

发布 APK(.build/skip-export/AppName.apk)默认未签名。你必须在通过 Play 商店分发或安装到设备之前对其进行签名。你可以将签名集成到 CI 工作流中,也可以使用项目 Android/app/build.gradle.kts 中的内置支持,它会在 Android/app/ 文件夹中查找 keystore.properties 和 keystore.jks 文件。

有关创建和管理 Android 签名密钥的完整信息,请参阅签署你的应用 ↗文档。但为了快速上手,你可以通过从项目根目录运行以下命令并按照提示操作来创建 Android/app/keystore.jks 文件:

Terminal window
keytool -genkeypair -v -keystore Android/app/keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias app

记住你为密钥库和密钥本身设置的密码,然后创建一个新的 Android/app/keystore.properties 文件,内容如下:

keyAlias=app
storeFile=keystore.jks
storePassword=PASSWORD
keyPassword=PASSWORD

这些文件就位后,运行 skip export 将自动签名发布版 .apk 文件,使你能够直接分发和运行应用的发布版本,而无需通过 Google Play 商店。

apksigner 命令行工具(位于 ~/Library/Android/sdk/build-tools/*/apksigner)可用于验证 .apk 文件的签名。

有关该命令的详细信息,请参阅skip export CLI 参考。


除了 skip export,Skip 应用项目在 Android/ 文件夹中还包含一个 gradle 项目,可以直接使用 gradle 命令运行。这对于手动执行 gradle 任务很有用,例如使用 launchDebug 任务在模拟器或已配置的设备上启动应用:

skipapp-showcase % gradle -p Android launchDebug

要发布 Android 应用,你可能需要自己执行构建,可以手动操作或作为持续集成(CI)流程的一部分。要从终端构建应用的发布版本,可以运行:

Terminal window
gradle -p Android/ assemble

这将运行 Android/gradle.settings.kts 文件中指定的 Gradle 项目(Showcase 源代码 ↗),它会调用 Swift Package Manager 来为 Android 构建项目。构建产物可以在 .build/Android/ 文件夹中找到,如下所示:

skiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/apk/*/*.apk
73M .build/Android/app/outputs/apk/debug/app-debug.apk
11M .build/Android/app/outputs/apk/release/app-release.apk

如果你需要一个用于提交到应用商店的 Android Bundle,可以使用以下命令构建:

skiptools/skipapp-showcase % gradle -p Android/ bundle
skiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/bundle/*/*
19M .build/Android/app/outputs/bundle/debug/app-debug.aab
5.6M .build/Android/app/outputs/bundle/release/app-release.aab

有关 Skip gradle 项目结构的更多信息,请参阅 Gradle 项目参考。有关使用 gradle CLI 构建 Android 应用的更多信息,可以在 https://developer.android.com/build/building-cmdline ↗ 找到。

Fastlane 是一个可以自动将应用发布到 Apple App Store 和 Google Play Store 的工具。它替代了通过各商店网站手动创建和上传应用发布版本所需的步骤。

fastlane 命令行工具可以通过终端使用 Homebrew 安装:

brew install fastlane

fastlane 的完整文档可以在 https://docs.fastlane.tools ↗ 找到。

当你使用以下命令初始化一个新的 Skip 应用时:

Terminal window
skip init --fastlane --appid=app.bundle.id package-name AppName

Darwin/ 和 Android/ 文件夹中将各自包含一个 fastlane 项目模板,其中包含可以编辑的元数据文件,用于填写应用标题、描述、内容分级和截图等信息。这些文件可以为你的应用支持的每种语言进行本地化。

各平台的元数据结构不同。对于 iOS 和其他 Apple 平台,Darwin/ 文件夹的结构如下:

  • 文件夹Darwin/fastlane
    • AppStore.xcconfig
    • Appfile
    • Deliverfile
    • Fastfile
    • README.md
    • apikey.json*
    • 文件夹metadata
      • 文件夹en-US
        • description.txt
        • keywords.txt
        • release_notes.txt
        • subtitle.txt
    • 文件夹screenshots
      • 文件夹en-US
        • 0_APP_IPHONE_55_0.png
        • 0_APP_IPHONE_65_0.png
        • 1_APP_IPHONE_65_1.png
        • 2_APP_IPHONE_65_2.png
        • 3_APP_IPHONE_65_3.png
        • 4_APP_IPHONE_65_4.png
        • 5_APP_IPHONE_65_5.png

Android/ 文件夹的结构如下:

  • 文件夹Android/fastlane
    • Appfile
    • Fastfile
    • README.md
    • apikey.json*
    • 文件夹metadata
      • 文件夹android
        • 文件夹en-US
          • full_description.txt
          • 文件夹images
            • featureGraphic.png
            • icon.png
            • 文件夹phoneScreenshots
              • 1_en-US.png
              • 2_en-US.png
              • 3_en-US.png
              • 4_en-US.png
          • short_description.txt
          • title.txt
          • video.txt

每个平台的 fastlane Fastfile、Appfile 和 Deliverfile 可以配置为自动提交发布版本进行审核,或将其发布到商店的测试服务。详情请参阅 fastlane 文档 ↗。

每个 fastlane/ 文件夹中的 apikey.json 文件(不是由 skip init 创建的)必须分别从 App Store Connect 服务和 Google Play Console 服务下载。这些文件包含上传发布版本到相应商店所需的认证信息。 对于 Apple App Store,请按照使用 fastlane API Key JSON 文件 ↗的说明操作。对于 Google Play 商店,请按照上传到 Play 商店设置 ↗的说明操作。

除了 API 密钥,你还必须遵循各平台的应用签名流程。对于 Darwin 平台,这意味着需要从 https://developer.apple.com ↗ 下载并安装已注册应用 ID 的证书和配置文件。对于 Android,Android/app/ 文件夹应包含 keystore.jks 和 keystore.properties 文件,默认的 Android/app/build.gradle.kts 会在这些文件存在时使用它们来签名发布产物。

当你准备好创建应用的新发布版本时,可以在 Android/ 和 Darwin/ 文件夹中分别运行 fastlane release 命令来构建应用(对于 Android,首先使用 Skip 进行转译),将其打包为 .apk 或 .ipa,并上传到相应的商店。

发布 iOS 应用的示例会话如下:

zap skipapp-showcase/Darwin % fastlane release
[✔] 🚀
[10:59:50]: ------------------------------
[10:59:50]: --- Step: default_platform ---
[10:59:50]: ------------------------------
[10:59:50]: Driving the lane 'release' 🚀
[10:59:50]: -------------------------------------
[10:59:50]: --- Step: Switch to assemble lane ---
[10:59:50]: -------------------------------------
[10:59:50]: Cruising over to lane 'assemble' 🚖
[10:59:50]: -----------------------
[10:59:50]: --- Step: build_app ---
[10:59:50]: -----------------------
[10:59:50]: Resolving Swift Package Manager dependencies...
[10:59:50]: $ xcodebuild -resolvePackageDependencies -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig
[10:59:51]: ▸ Command line invocation:
[10:59:51]: ▸ /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -resolvePackageDependencies -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig
[10:59:51]: ▸ Build settings from configuration file 'fastlane/AppStore.xcconfig':
[10:59:51]: ▸ Resolve Package Graph
202 collapsed lines
[10:59:53]: ▸ dependency 'skip-ui' is not used by any targetdependency 'skip-av' is not used by any target
[10:59:53]: ▸ Resolved source packages:
[10:59:53]: ▸ skipapp-showcase: /srcroot/skipapp-showcase
[10:59:53]: ▸ skip-model: https://github.com/skiptools/skip-model.git @ 0.7.0
[10:59:53]: ▸ skip-av: https://github.com/skiptools/skip-av.git @ 0.0.2
[10:59:53]: ▸ skip-unit: https://github.com/skiptools/skip-unit.git @ 0.7.2
[10:59:53]: ▸ skip: https://github.com/skiptools/skip.git @ 0.8.46
[10:59:53]: ▸ skip-ui: https://github.com/skiptools/skip-ui.git @ 0.9.6
[10:59:53]: ▸ skip-foundation: https://github.com/skiptools/skip-foundation.git @ 0.6.11
[10:59:53]: ▸ skip-lib: https://github.com/skiptools/skip-lib.git @ 0.7.13
[10:59:53]: ▸ resolved source packages: skipapp-showcase, skip-model, skip-av, skip-unit, skip, skip-ui, skip-foundation, skip-lib
[10:59:53]: $ xcodebuild -showBuildSettings -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig 2>&1
+-----------------------------------------------------------------------------+
| Summary for gym 2.220.0 |
+--------------------------------------+--------------------------------------+
| sdk | iphoneos |
| xcconfig | fastlane/AppStore.xcconfig |
| derived_data_path | ../.build/Darwin/DerivedData |
| output_directory | ../.build/fastlane/Darwin |
| skip_archive | false |
| skip_codesigning | false |
| project | ./Showcase.xcodeproj |
| scheme | Showcase |
| clean | false |
| output_name | Showcase |
| silent | false |
| skip_package_ipa | false |
| skip_package_pkg | false |
| result_bundle | false |
| buildlog_path | ~/Library/Logs/gym |
| destination | generic/platform=iOS |
| xcodebuild_formatter | xcpretty |
| build_timing_summary | false |
| skip_profile_detection | false |
| xcodebuild_command | xcodebuild |
| skip_package_dependencies_resolutio | false |
| n | |
| disable_package_automatic_updates | false |
| use_system_scm | false |
| xcode_path | /Applications/Xcode.app |
+--------------------------------------+--------------------------------------+
[10:59:56]: $ set -o pipefail && xcodebuild -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig -sdk 'iphoneos' -destination 'generic/platform=iOS' -archivePath ~/Library/Developer/Xcode/Archives/App.xcarchive -skipPackagePluginValidation -skipMacroValidation archive | tee ~/Library/Logs/gym/Showcase-Showcase.log | xcpretty
[11:00:40]: ▸ Touching skipapp-showcase_Showcase.bundle (in target 'skipapp-showcase_Showcase' from project 'skipapp-showcase')
[11:00:40]: ▸ Linking Showcase.o
[11:00:40]: ▸ Processing empty-ShowcaseApp.plist
[11:00:40]: ▸ Linking ShowcaseApp
[11:00:40]: ▸ Generating 'ShowcaseApp.framework.dSYM'
[11:00:40]: ▸ Touching ShowcaseApp.framework (in target 'ShowcaseApp' from project 'skipapp-showcase')
[11:00:40]: ▸ Copying /srcroot/skipapp-showcase/.build/Darwin/DerivedData/Build/Intermediates.noindex/ArchiveIntermediates/Showcase/InstallationBuildProductsLocation/Applications/Showcase.app/protest_guerrilla.ttf
[11:00:40]: ▸ Linking Showcase
[11:00:41]: ▸ Running script 'Run skip gradle'
[11:00:41]: ▸ Processing Info.plist
[11:00:41]: ▸ Touching Showcase.app (in target 'Showcase' from project 'Showcase')
[11:00:41]: ▸ Archive Succeeded
[11:00:41]: Generated plist file with the following values:
[11:00:41]: ▸ -----------------------------------------
[11:00:41]: ▸
[11:00:41]: ▸ "method": "app-store"
[11:00:41]: ▸
[11:00:41]: ▸ -----------------------------------------
[11:00:41]: $ /usr/bin/xcrun /opt/homebrew/Cellar/fastlane/2.220.0/libexec/gems/fastlane-2.220.0/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh -exportArchive -exportOptionsPlist '/var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/gym_config20240612-40159-xgzrb9.plist' -archivePath ~/Library/Developer/Xcode/Archives/2024-06-12/Showcase\ 2024-06-12\ 10.59.56.xcarchive -exportPath '/var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/gym_output20240612-40159-udedtq' -skipPackagePluginValidation -skipMacroValidation
[11:00:55]: Successfully exported and signed the ipa file:
[11:00:55]: /srcroot/skipapp-showcase/.build/fastlane/Darwin/Showcase.ipa
[11:00:55]: Cruising back to lane 'release' 🚘
[11:00:56]: ---------------------------------
[11:00:56]: --- Step: upload_to_app_store ---
[11:00:56]: ---------------------------------
[11:00:56]: Successfully loaded '/srcroot/skipapp-showcase/Darwin/fastlane/Deliverfile' 📄
+--------------------------------------------------------------------------+
| Detected Values from './fastlane/Deliverfile' |
+-----------------------------------+--------------------------------------+
| copyright | 2024 |
| force | true |
| automatic_release | true |
| skip_screenshots | false |
| precheck_include_in_app_purchases | false |
| submit_for_review | true |
+-----------------------------------+--------------------------------------+
[11:00:56]: Creating authorization token for App Store Connect API
+-----------------------------------------------------------------------------+
| deliver 2.220.0 Summary |
+--------------------------------------+--------------------------------------+
| api_key_path | fastlane/apikey.json |
| app_rating_config_path | fastlane/metadata/rating.json |
| screenshots_path | ./fastlane/screenshots |
| metadata_path | ./fastlane/metadata |
| app_version | 1.0.3 |
| username | appfair@appfair.org |
| app_identifier | org.appfair.app.Showcase |
| platform | ios |
| edit_live | false |
| use_live_version | false |
| skip_binary_upload | false |
| skip_screenshots | false |
| skip_metadata | false |
| skip_app_version_update | false |
| force | true |
| overwrite_screenshots | false |
| screenshot_processing_timeout | 3600 |
| sync_screenshots | false |
| submit_for_review | true |
| verify_only | false |
| reject_if_possible | false |
| version_check_wait_retry_limit | 7 |
| automatic_release | true |
| phased_release | false |
| reset_ratings | false |
| run_precheck_before_submit | true |
| precheck_default_rule_level | warn |
| copyright | 2024 |
| ignore_language_directory_validation | false |
| precheck_include_in_app_purchases | false |
+--------------------------------------+--------------------------------------+
[11:00:56]: Making sure the latest version on App Store Connect matches '1.0.3'...
[11:00:59]: Successfully set the version to '1.0.3'
[11:00:59]: Loading './fastlane/metadata/en-US/description.txt'...
[11:00:59]: Loading './fastlane/metadata/en-US/keywords.txt'...
[11:00:59]: Loading './fastlane/metadata/en-US/release_notes.txt'...
[11:00:59]: Loading './fastlane/metadata/en-US/support_url.txt'...
[11:00:59]: Loading './fastlane/metadata/en-US/subtitle.txt'...
[11:00:59]: Loading './fastlane/metadata/en-US/privacy_url.txt'...
[11:01:02]: No changes to localized App Info detected. Skipping upload.
[11:01:02]: Will begin uploading metadata for '1.0.3' on App Store Connect
[11:01:02]: Uploading metadata to App Store Connect for version
[11:01:06]: Uploading metadata to App Store Connect for localized version 'en-US'
[11:01:08]: Setting the app's age rating...
[11:01:09]: Will begin uploading snapshots for '1.0.3' on App Store Connect
[11:01:09]: Starting with the upload of screenshots...
[✔] Waiting for all the screenshots to finish being processed...
[11:01:09]: Successfully uploaded all screenshots
[✔] Sorting screenshots uploaded...
[11:01:10]: Successfully uploaded screenshots to App Store Connect
[11:01:10]: Uploading binary to App Store Connect
[11:01:10]: Going to upload updated app to App Store Connect
[11:01:10]: This might take a few minutes. Please don't interrupt the script.
[11:01:47]: --------------------------------------------------------------------
[11:01:47]: Successfully uploaded package to App Store Connect. It might take a few minutes until it's visible online.
[11:01:47]: --------------------------------------------------------------------
[11:01:47]: Finished the upload to App Store Connect
[11:01:47]: Running precheck before submitting to review, if you'd like to disable this check you can set run_precheck_before_submit to false
[11:01:47]: Making sure we pass precheck 👮‍♀️ 👮 before we submit 🛫
+-----------------------------------------------------+
| Summary for precheck 2.220.0 |
+--------------------------+--------------------------+
| default_rule_level | warn |
| include_in_app_purchases | false |
| app_identifier | org.appfair.app.Showcase |
| api_key_path | fastlane/apikey.json |
| username | appfair@appfair.org |
| platform | ios |
| use_live | false |
+--------------------------+--------------------------+
[11:01:47]: Creating authorization token for App Store Connect API
[11:01:47]: Checking app for precheck rule violations
[11:01:51]: ✅ Passed: No negative  sentiment
[11:01:51]: ✅ Passed: No placeholder text
[11:01:51]: ✅ Passed: No mentioning  competitors
[11:01:51]: ✅ Passed: No future functionality promises
[11:01:51]: ✅ Passed: No words indicating test content
[11:01:51]: ✅ Passed: No curse words
[11:01:51]: ✅ Passed: No words indicating your IAP is free
[11:01:51]: ✅ Passed: Incorrect, or missing copyright date
[11:01:51]: ✅ Passed: No broken urls
[11:01:51]: precheck 👮‍♀️ 👮 finished without detecting any potential problems 🛫
[11:01:51]: Selecting the latest build...
[11:01:51]: Waiting for processing on... app_id: 6474885022, app_version: 1.0.3, build_version: 103, platform: IOS
[11:01:52]: Read more information on why this build isn't showing up yet - https://github.com/fastlane/fastlane/issues/14997
[11:01:52]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)
[11:02:07]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)
[11:02:22]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)
[11:02:37]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)
[11:02:54]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS
[11:03:10]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS
[11:03:26]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS
[11:03:42]: Successfully finished processing the build 1.0.3 - 103 for IOS
[11:03:42]: Selecting build 1.0.3 (103)...
[11:03:44]: Successfully selected build
[11:03:45]: Successfully updated IDFA declarations on App Store Connect
[11:03:46]: Successfully updated contents rights declaration on App Store Connect
[11:04:01]: Successfully submitted the app for review!
+------------------------------------------+
| fastlane summary |
+------+---------------------+-------------+
| Step | Action | Time (in s) |
+------+---------------------+-------------+
| 1 | default_platform | 0 |
| 2 | Switch to assemble | 0 |
| | lane | |
| 3 | build_app | 65 |
| 4 | upload_to_app_store | 185 |
+------+---------------------+-------------+
[11:04:01]: fastlane.tools finished successfully 🎉

Android 的示例会话如下:

zap skipapp-showcase/Android % fastlane release
[✔] 🚀
[15:29:48]: ------------------------------
[15:29:48]: --- Step: default_platform ---
[15:29:48]: ------------------------------
[15:29:48]: ------------------------------
[15:29:48]: --- Step: default_platform ---
[15:29:48]: ------------------------------
[15:29:48]: Driving the lane 'release' 🚀
[15:29:48]: -------------------------------------
[15:29:48]: --- Step: Switch to assemble lane ---
[15:29:48]: -------------------------------------
[15:29:48]: Cruising over to lane 'assemble' 🚖
[15:29:48]: ---------------------------
[15:29:48]: --- Step: bundleRelease ---
[15:29:48]: ---------------------------
[15:29:48]: $ /opt/homebrew/bin/gradle bundleRelease -p .
[15:29:53]: ▸ [0/1] Planning build
[15:29:53]: ▸ [1/1] Compiling plugin Create SkipLink
107 collapsed lines
[15:29:53]: ▸ [2/2] Compiling plugin skipstone
[15:29:53]: ▸ Building for debugging...
[15:29:53]: ▸ [2/8] Write sources
[15:29:53]: ▸ [3/13] Write swift-version--58304C5D6DBC2206.txt
[15:29:53]: ▸ note: Skip 0.8.46: transpile plugin to: /srcroot/skipapp-showcase/.build/plugins/outputs/skip-unit/SkipUnit/skipstone/SkipUnit/src/main at 15:29:53
…
[15:30:13]: ▸ > Task :app:processReleaseManifest
[15:30:13]: ▸ > Task :app:mergeReleaseArtProfile UP-TO-DATE
[15:30:13]: ▸ > Task :app:processApplicationManifestReleaseForBundle
[15:30:13]: ▸ > Task :app:mergeReleaseAssets UP-TO-DATE
[15:30:13]: ▸ > Task :app:mergeReleaseNativeLibs NO-SOURCE
[15:30:13]: ▸ > Task :app:stripReleaseDebugSymbols NO-SOURCE
[15:30:13]: ▸ > Task :app:extractReleaseNativeSymbolTables NO-SOURCE
[15:30:13]: ▸ > Task :app:processReleaseManifestForPackage
[15:30:13]: ▸ > Task :app:processReleaseResources
[15:30:14]: ▸ > Task :app:bundleReleaseResources
[15:30:14]: ▸ > Task :skipstone:Showcase:compileReleaseKotlin
[15:30:14]: ▸ > Task :skipstone:Showcase:compileReleaseJavaWithJavac NO-SOURCE
[15:30:14]: ▸ > Task :skipstone:Showcase:mergeReleaseGeneratedProguardFiles UP-TO-DATE
[15:30:14]: ▸ > Task :skipstone:Showcase:exportReleaseConsumerProguardFiles UP-TO-DATE
[15:30:14]: ▸ > Task :skipstone:Showcase:processReleaseJavaRes UP-TO-DATE
[15:30:14]: ▸ > Task :skipstone:Showcase:bundleLibRuntimeToJarRelease
[15:30:14]: ▸ > Task :skipstone:Showcase:bundleLibCompileToJarRelease
[15:30:15]: ▸ > Task :app:compileReleaseKotlin
[15:30:15]: ▸ > Task :app:compileReleaseJavaWithJavac
[15:30:15]: ▸ > Task :app:mergeReleaseGeneratedProguardFiles UP-TO-DATE
[15:30:15]: ▸ > Task :app:processReleaseJavaRes UP-TO-DATE
[15:30:15]: ▸ > Task :app:mergeReleaseJavaResource UP-TO-DATE
[15:30:15]: ▸ > Task :app:expandReleaseArtProfileWildcards
[15:30:45]: ▸ > Task :app:minifyReleaseWithR8
[15:31:05]: ▸ > Task :app:buildReleasePreBundle
[15:31:06]: ▸ > Task :app:compileReleaseArtProfile
[15:31:06]: ▸ > Task :app:packageReleaseBundle
[15:31:08]: ▸ > Task :app:shrinkBundleReleaseResources
[15:31:10]: ▸ > Task :app:signReleaseBundle
[15:31:10]: ▸ > Task :app:produceReleaseBundleIdeListingFile
[15:31:10]: ▸ > Task :app:createReleaseBundleListingFileRedirect UP-TO-DATE
[15:31:10]: ▸ > Task :app:bundleRelease
[15:31:10]: ▸ BUILD SUCCESSFUL in 1m 21s
[15:31:10]: ▸ 169 actionable tasks: 30 executed, 139 up-to-date
[15:31:10]: Cruising back to lane 'release' 🚘
[15:31:10]: ----------------------------------
[15:31:10]: --- Step: upload_to_play_store ---
[15:31:10]: ----------------------------------
+---------------------------------------------------------------------------+
| Summary for supply 2.220.0 |
+------------------------------------+--------------------------------------+
| aab | ../.build/Android/app/outputs/bundl |
| | e/release/app-release.aab |
| package_name | org.appfair.app.Showcase |
| release_status | completed |
| track | production |
| metadata_path | ./fastlane/metadata/android |
| json_key | fastlane/apikey.json |
| skip_upload_apk | false |
| skip_upload_aab | false |
| skip_upload_metadata | false |
| skip_upload_changelogs | false |
| skip_upload_images | false |
| skip_upload_screenshots | false |
| sync_image_upload | false |
| track_promote_release_status | completed |
| validate_only | false |
| check_superseded_tracks | false |
| timeout | 300 |
| deactivate_on_promote | true |
| changes_not_sent_for_review | false |
| rescue_changes_not_sent_for_review | true |
| ack_bundle_installation_warning | false |
+------------------------------------+--------------------------------------+
[15:31:11]: Preparing aab at path '../.build/Android/app/outputs/bundle/release/app-release.aab' for upload...
[15:31:28]: Updating track 'production'...
[15:31:29]: Preparing uploads for language 'en-US'...
[15:31:30]: ⬆️ Uploading image file ./fastlane/metadata/android/en-US/images/featureGraphic.png...
[15:31:32]: ⬆️ Uploading image file ./fastlane/metadata/android/en-US/images/icon.png...
[15:31:34]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png...
[15:31:37]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png...
[15:31:40]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-US.png...
[15:31:42]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-US.png...
[15:31:45]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/1_en-US.png...
[15:31:48]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/2_en-US.png...
[15:31:50]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/3_en-US.png...
[15:31:53]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/4_en-US.png...
[15:31:56]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-US.png...
[15:31:58]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-US.png...
[15:32:01]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-US.png...
[15:32:04]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-US.png...
[15:32:07]: Uploaded all items for language 'en-US'... (37.582534 secs)
[15:32:07]: Uploading all changes to Google Play...
[15:32:10]: Successfully finished the upload to Google Play
+-------------------------------------------+
| fastlane summary |
+------+----------------------+-------------+
| Step | Action | Time (in s) |
+------+----------------------+-------------+
| 1 | default_platform | 0 |
| 2 | default_platform | 0 |
| 3 | Switch to assemble | 0 |
| | lane | |
| 4 | bundleRelease | 81 |
| 5 | upload_to_play_store | 59 |
+------+----------------------+-------------+
[15:32:10]: fastlane.tools finished successfully 🎉