Deployment
- Exporting Build Artifacts
- Signing the Exported Android Artifacts
- Export Options
- Running Gradle Manually
- Fastlane Integration
Skip app projects will build and launch the Android version of the app by forking the gradle process as part of the โRun Scriptsโ phase of the Xcode build process. This mechanism enables developers to rapidly iterate on an app by running both the iOS and Android versions side-by-side in the iOS Simulator and Android emulator. Similarly, Skip framework testing will run the transpiled Kotlin test cases by running gradle test
on the transpiled modules.
In order to be able to install and run an app on a connected Android device, you must enable USB debugging on the device, as per the ADB documentation.
If you have created separate iOS and Android apps, deploy each app in the standard way for its platform. This chapter applies to dual-platform apps and frameworks.
Exporting Build Artifacts
Running the skip export
command from the Terminal in the projectโs directory will build your Skip framework or app, and export all the binary artifacts to the folder specified with the -d
argument. This includes .aar
library archives for each of the targets in the current project, as well as all the dependent archives. These binary artifacts can be used in any Kotlin or Java build process or IDE. For example, a Kotlin development team can manually add them to their Android Studio project in order to work with a shared data model that is created using Skip.
For app projects, the skip export
command will additionally export .apk
and .aab
archives for the application, which can be installed directly on an Android device or uploaded to an Android app store, such as the Google Play Store.
Versions of Skip prior to 1.1.10 required that your app be buildable for both macOS and iOS targets, and would fail for unguarded API usage that was unavailable on macOS (for example, various SwiftUI Navigation constructs). This was fixed in Skip 1.1.0, but requires a manual change for projects that were created with skip init
prior to that version. To fix the issue, edit the Android/settings.gradle.kts
file and change the line commandLine("swift", "build")
to commandLine("sh", "-c", "xcrun swift build --triple arm64-apple-ios --sdk $(xcrun --sdk iphoneos --show-sdk-path)")
Signing the Exported Android Artifacts
By default, the exported .build/skip-export/AppName-debug.apk
file is signed with a single-use temporary signature, which means that you can install it on an Android emulator or simulator but future versions of the app cannot be upgraded without first manually removing the existing app.
The release APK at .build/skip-export/AppName.apk
, on the other hand, is not signed at all by default. Signing the APK is something that you can manage manually however you want (such as by integrating signing into your appโs CI workflow), but the default Android/app/build.gradle.kts
build file will look for the presence of keystore.properties
and keystore.jks
files in the Android/app/
folder.
For complete information on creating and managing Android signing keys, refer to the Sign your app documentation. But to get started quickly, you can create the Android/app/keystore.jks
file by running this command from the root of your project and following the prompts:
keytool -genkeypair -v -keystore Android/app/keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias app
Remember the passwords that you set for the keystore and the key itself, and then create a new Android/app/keystore.properties
file with the contents:
keyAlias=app
storeFile=keystore.jks
storePassword=PASSWORD
keyPassword=PASSWORD
The keystore.properties
and keystore.jks
files will contain sensitive information, so be sure to avoid checking them into public source control repositories. For git, this can be done by adding them to the .gitignore
file.
Once these files are present, running skip export
will automatically sign the release .apk file, which will enable you to distribute and run release builds of your app directly, without going through the Google Play Store.
The apksigner
command-line tool (located in ~/Library/Android/sdk/build-tools/*/apksigner
) can be used to verify the signature for the .apk file.
Note that the .apk signature is the appโs own signature; in order to distribute the app on the Google Play Store, you will need an upload key. We recommend using Fastlane (see below) for automatically signing and uploading the app bundle to the Play Store.
Export Options
OVERVIEW: Export the Gradle project and built artifacts
USAGE: skip export <options>
OUTPUT OPTIONS:
-o, --output <path> Send output to the given file (stdout: -)
-E, --message-errout Emit messages to the output rather than stderr
-v, --verbose Whether to display verbose messages
-q, --quiet Quiet mode: suppress output
-J, --json Emit output as formatted JSON
-j, --json-compact Emit output as compact JSON
-M, --message-plain Show console messages as plain text rather than JSON
-A, --json-array Wrap and delimit JSON output as an array
--plain/--no-plain Show no colors or progress animations (default:
--no-plain)
TOOL OPTIONS:
--xcodebuild <path> Xcode command path
--swift <path> Swift command path
--gradle <path> Gradle command path
--adb <path> ADB command path
--emulator <path> Android emulator path
--android-home <path> Path to the Android SDK (ANDROID_HOME)
OPTIONS:
-d, --dir <directory> Export output folder
--package <package-name>
App package name
--module <ModuleName> Modules to export
--project <dir> Project folder (default: .)
--summary-file <file> Output summary path
--build/--no-build Build the Swift project before exporting (default:
--build)
--show-tree/--no-show-tree
Display a file system tree summary (default:
--no-show-tree)
--release/--no-release Perform release build (default: --release)
--debug/--no-debug Perform debug build (default: --debug)
--export-project/--no-export-project
Export project sources (default: --export-project)
--nested/--no-nested Output folders to variant sub-folders (default:
--no-nested)
-h, --help Show help information.
Running Gradle Manually
In addition to skip export
, a Skip app project contains a gradle project in the Android/
folder that can be run directly using the gradle
command. This is useful for manually executing gradle tasks, such as launching the app on an emulator or configured device with the launchDebug
task:
skipapp-showcase % gradle -p Android launchDebug
To release an Android app, you may want to perform the build yourself, either manually or as part of a continuous integration (CI) process. To build a release version of your app from the Terminal, you can run:
skipapp-showcase % gradle -p Android/ assemble
This will run the Gradle project specified in the Android/gradle.settings.kts
file (Showcase source code), which will invoke the Swift Package Manager build to transpile the Swift into Kotlin. The resulting build artifacts can then be found in the .build/Android/
folder, like so:
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
If you need an Android Bundle for submitting to an app storefront, you can build it with:
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
See the Gradle project reference for more information on the structure of a Skip gradle project. More information on using the gradle CLI for building Android apps can be found at https://developer.android.com/build/building-cmdline.
Fastlane Integration
Fastlane is a tool that automates the release of an app to the Apple App Store and the Google Play Store. It is an alternative to the manual steps required to create and upload a release of an app through the web site for each of the stores.
A complete example of a working fastlane configuration can be found in the Skip Showcase app for Darwin and Android. This sample app is released on both the Google Play Store (here) and Apple App Store (here), and is released using the process described herein.
The fastlane command-line tool can be installed using Homebrew from the Terminal:
brew install fastlane
Full documentation for fastlane can be found at https://docs.fastlane.tools.
When you initialize a new Skip app with the following command:
skip init --fastlane --appid=app.bundle.id package-name AppName
The Darwin/
and Android/
folders will each contain a template for the fastlane project, which holds the metadata files that can be edited to fill in information like the appโs title, description, content ratings, and screenshots. These files can be localized for each language that your app supports.
The structure of the metadata for each platform is different. For iOS and other Apple platforms, the Darwin/
folder will look like this:
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
The Android/
folder will look like:
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
The fastlane Fastfile
, Appfile
, and Deliverfile
for each platform can be configured to automatically submit the release for review, or to release it to the storefrontโs testing service. See the fastlane documentation for further details.
App Signing and Storefront Authentication
An apikey.json
file in each of the fastlane/
folders (not created by skip init
) must be downloaded for each of the App Store Connect service and the Google Play Console service. These contain the authentication information necessary to upload releases to the respective storefronts.
For the Apple App Store, follow the instructions for using fastlane API Key JSON file. For the Google Play Store, follow the instructions for upload to Play Store setup.
In addition to the API keys, you must also follow each platformโs app signing procedures. For Darwin platforms, this will mean downloading and installing the certificate and provisioning profile for the registered app id from https://developer.apple.com. For Android, the Android/app/
folder should contain a keystore.jks
and keystore.properties
file, which is used by the default Android/app/build.gradle.kts
for signing the release artifacts when they are present.
The apikey.json
files, provisioning profiles, and keystore files will contain sensitive information, so be sure to avoid checking them into public source control repositories. For git, this can be done by adding them to the .gitignore
file.
Once you are ready to create a new release of your app, you can run the fastlane release
command in each of the Android/
and Darwin/
folders to build the app (transpiling it first using Skip, in the case of Android), assemble it into an .apk
or .ipa
, and update the file to the appropriate storefront.
Fastlane Example (Darwin)
A sample session for releasing an iOS app will look like:
fastlane release
zap skipapp-showcase/Darwin % fastlane release
[โ] ๐
[10:59:50]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[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
[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://source.skip.tools/skip-model.git @ 0.7.0
[10:59:53]: โธ skip-av: https://source.skip.tools/skip-av.git @ 0.0.2
[10:59:53]: โธ skip-unit: https://source.skip.tools/skip-unit.git @ 0.7.2
[10:59:53]: โธ skip: https://source.skip.tools/skip.git @ 0.8.46
[10:59:53]: โธ skip-ui: https://source.skip.tools/skip-ui.git @ 0.9.6
[10:59:53]: โธ skip-foundation: https://source.skip.tools/skip-foundation.git @ 0.6.11
[10:59:53]: โธ skip-lib: https://source.skip.tools/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 ๐
Fastlane Example (Android)
A sample session for Android will look like:
fastlane release
zap skipapp-showcase/Android % fastlane release
[โ] ๐
[15:29:48]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[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
[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 ๐