Browse Source
- Change package name from app.timesafari.app to app.timesafari - Fix ADB connection issues with server restart and retries - Add interactive test flow with user prompts between tests - Generate test data locally instead of external script - Add proper cleanup of readline interface - Fix URL scheme registration in Android manifest Technical changes: 1. Remove duplicate SDK suppression entries 2. Update Gradle and build configurations 3. Add retry logic for flaky ADB connections 4. Add proper error handling for test data generation 5. Update all package references consistently The changes improve Android testing by: 1. Making package naming consistent 2. Adding reliability to ADB connections 3. Adding user control over test flow 4. Providing better test progress visibility 5. Improving error handling and loggingapp_id_fix
36 changed files with 318 additions and 654 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,2 +1,2 @@ |
|||
#Tue Mar 11 10:01:05 UTC 2025 |
|||
gradle.version=8.10.2 |
|||
#Fri Mar 21 07:27:50 UTC 2025 |
|||
gradle.version=8.2.1 |
|||
|
Binary file not shown.
@ -1,3 +0,0 @@ |
|||
source "https://rubygems.org" |
|||
|
|||
gem "fastlane" |
@ -1,3 +1,2 @@ |
|||
/build/* |
|||
!/build/.npmkeep |
|||
src/main/assets/public/assets/ |
@ -1,398 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<issues format="6" by="lint 8.1.0" type="baseline" client="gradle" dependencies="true" name="AGP (8.1.0)" variant="all" version="8.1.0"> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "UnsanitizedFilenameFromContentProvider"" |
|||
errorLine1=" disable 'UnsanitizedFilenameFromContentProvider'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="26" |
|||
column="18"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "UnsanitizedFilenameFromContentProvider"" |
|||
errorLine1=" disable 'UnsanitizedFilenameFromContentProvider'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="26" |
|||
column="18"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "LintBaselineFixed"" |
|||
errorLine1=" ignore 'LintBaselineFixed'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="34" |
|||
column="17"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "LintBaselineFixed"" |
|||
errorLine1=" ignore 'LintBaselineFixed'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="34" |
|||
column="17"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead" |
|||
errorLine1=" String msg = String.format(" |
|||
errorLine2=" ^"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeWebChromeClient.java" |
|||
line="467" |
|||
column="26"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toUpperCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" return mask.toUpperCase().equals(string.toUpperCase());" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/util/HostMask.java" |
|||
line="110" |
|||
column="29"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toUpperCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" return mask.toUpperCase().equals(string.toUpperCase());" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/util/HostMask.java" |
|||
line="110" |
|||
column="57"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" if (header.getKey().equalsIgnoreCase("Accept") && header.getValue().toLowerCase().contains("text/html")) {" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/WebViewLocalServer.java" |
|||
line="474" |
|||
column="93"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="SimpleDateFormat" |
|||
message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates." |
|||
errorLine1=" String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeWebChromeClient.java" |
|||
line="504" |
|||
column="28"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="SimpleDateFormat" |
|||
message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates." |
|||
errorLine1=" DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/PluginResult.java" |
|||
line="44" |
|||
column="25"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedAttribute" |
|||
message="Attribute `usesCleartextTraffic` is only used in API level 23 and higher (current min is 22)" |
|||
errorLine1="<application android:usesCleartextTraffic="true">" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="4" |
|||
column="15"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedAttribute" |
|||
message="Attribute `autoVerify` is only used in API level 23 and higher (current min is 22)" |
|||
errorLine1=" <intent-filter android:autoVerify="true">" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="25" |
|||
column="28"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="ManifestOrder" |
|||
message="`<uses-permission>` tag appears after `<application>` tag" |
|||
errorLine1=" <uses-permission android:name="android.permission.INTERNET" />" |
|||
errorLine2=" ~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="47" |
|||
column="6"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="AndroidGradlePluginVersion" |
|||
message="A newer version of com.android.tools.build:gradle than 8.2.1 is available: 8.9.0. (There is also a newer version of 8.2.𝑥 available, if upgrading to 8.9.0 is difficult: 8.2.2)" |
|||
errorLine1=" classpath 'com.android.tools.build:gradle:8.2.1'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="12" |
|||
column="9"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="AndroidGradlePluginVersion" |
|||
message="A newer version of com.android.tools.build:gradle than 8.2.1 is available: 8.9.0. (There is also a newer version of 8.2.𝑥 available, if upgrading to 8.9.0 is difficult: 8.2.2)" |
|||
errorLine1=" classpath 'com.android.tools.build:gradle:8.2.1'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="18" |
|||
column="9"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="46" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="46" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.coordinatorlayout:coordinatorlayout than 1.2.0 is available: 1.3.0" |
|||
errorLine1=" implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="47" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.ext:junit than 1.1.5 is available: 1.2.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="51" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.espresso:espresso-core than 3.5.1 is available: 3.6.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="52" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="75" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.ext:junit than 1.1.5 is available: 1.2.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="77" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.espresso:espresso-core than 3.5.1 is available: 3.6.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="78" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="Recycle" |
|||
message="This `TypedArray` should be recycled after use with `#recycle()`" |
|||
errorLine1=" TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.bridge_fragment);" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeFragment.java" |
|||
line="99" |
|||
column="32"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="Overdraw" |
|||
message="Possible overdraw: Root element paints background `#F0FF1414` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)" |
|||
errorLine1=" android:background="#F0FF1414"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/layout/fragment_bridge.xml" |
|||
line="5" |
|||
column="5"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.layout.activity_main` appears to be unused" |
|||
errorLine1="<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/layout/activity_main.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.xml.config` appears to be unused" |
|||
errorLine1="<widget version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/xml/config.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.drawable.ic_launcher_background` appears to be unused" |
|||
errorLine1="<vector xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/drawable/ic_launcher_background.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.drawable.ic_launcher_foreground` appears to be unused" |
|||
errorLine1="<vector xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/drawable-v24/ic_launcher_foreground.xml" |
|||
line="1" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.string.package_name` appears to be unused" |
|||
errorLine1=" <string name="package_name">app.timesafari.app</string>" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/values/strings.xml" |
|||
line="5" |
|||
column="13"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.string.custom_url_scheme` appears to be unused" |
|||
errorLine1=" <string name="custom_url_scheme">app.timesafari.app</string>" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/values/strings.xml" |
|||
line="6" |
|||
column="13"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="MonochromeLauncherIcon" |
|||
message="The application adaptive icon is missing a monochrome tag" |
|||
errorLine1="<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/mipmap-anydpi-v26/ic_launcher.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="MonochromeLauncherIcon" |
|||
message="The application adaptive roundIcon is missing a monochrome tag" |
|||
errorLine1="<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconDipSize" |
|||
message="The image `splash.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-land-hdpi/splash.png: 533x320 dp (800x480 px), drawable-land-mdpi/splash.png: 480x320 dp (480x320 px), drawable-land-xhdpi/splash.png: 640x360 dp (1280x720 px), drawable-land-xxhdpi/splash.png: 533x320 dp (1600x960 px), drawable-land-xxxhdpi/splash.png: 480x320 dp (1920x1280 px)"> |
|||
<location |
|||
file="src/main/res/drawable-land-mdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xxxhdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-hdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xxhdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xhdpi/splash.png"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconDuplicatesConfig" |
|||
message="The `splash.png` icon has identical contents in the following configuration folders: drawable-land-mdpi, drawable"> |
|||
<location |
|||
file="src/main/res/drawable/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-mdpi/splash.png"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconLocation" |
|||
message="Found bitmap drawable `res/drawable/splash.png` in densityless folder"> |
|||
<location |
|||
file="src/main/res/drawable/splash.png"/> |
|||
</issue> |
|||
|
|||
</issues> |
@ -1,20 +1,26 @@ |
|||
package app.timesafari.app; |
|||
package com.getcapacitor.myapp; |
|||
|
|||
import static org.junit.Assert.*; |
|||
|
|||
import android.content.Context; |
|||
import androidx.test.platform.app.InstrumentationRegistry; |
|||
import androidx.test.ext.junit.runners.AndroidJUnit4; |
|||
|
|||
import androidx.test.platform.app.InstrumentationRegistry; |
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
|
|||
import static org.junit.Assert.*; |
|||
|
|||
/** |
|||
* Instrumented test, which will execute on an Android device. |
|||
* |
|||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
|||
*/ |
|||
@RunWith(AndroidJUnit4.class) |
|||
public class ExampleInstrumentedTest { |
|||
|
|||
@Test |
|||
public void useAppContext() { |
|||
public void useAppContext() throws Exception { |
|||
// Context of the app under test.
|
|||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
|||
|
|||
assertEquals("app.timesafari", appContext.getPackageName()); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
package app.timesafari; |
|||
|
|||
import com.getcapacitor.BridgeActivity; |
|||
|
|||
public class MainActivity extends BridgeActivity { |
|||
// ... existing code ...
|
|||
} |
@ -1,4 +1,4 @@ |
|||
package app.timesafari.app; |
|||
package timesafari.app; |
|||
|
|||
import com.getcapacitor.BridgeActivity; |
|||
|
@ -1,7 +0,0 @@ |
|||
android { |
|||
lintOptions { |
|||
disable 'UnsanitizedFilenameFromContentProvider' |
|||
abortOnError false |
|||
baseline file("lint-baseline.xml") |
|||
} |
|||
} |
@ -1,2 +0,0 @@ |
|||
json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one |
|||
package_name("app.timesafari.app") # e.g. com.krausefx.app |
@ -1,38 +0,0 @@ |
|||
# This file contains the fastlane.tools configuration |
|||
# You can find the documentation at https://docs.fastlane.tools |
|||
# |
|||
# For a list of all available actions, check out |
|||
# |
|||
# https://docs.fastlane.tools/actions |
|||
# |
|||
# For a list of all available plugins, check out |
|||
# |
|||
# https://docs.fastlane.tools/plugins/available-plugins |
|||
# |
|||
|
|||
# Uncomment the line if you want fastlane to automatically update itself |
|||
# update_fastlane |
|||
|
|||
default_platform(:android) |
|||
|
|||
platform :android do |
|||
desc "Build and deploy Android app" |
|||
lane :beta do |
|||
gradle( |
|||
task: "clean assembleRelease" |
|||
) |
|||
upload_to_play_store( |
|||
track: 'beta', |
|||
aab: '../app/build/outputs/bundle/release/app-release.aab' |
|||
) |
|||
end |
|||
|
|||
lane :release do |
|||
gradle( |
|||
task: "clean assembleRelease" |
|||
) |
|||
upload_to_play_store( |
|||
aab: '../app/build/outputs/bundle/release/app-release.aab' |
|||
) |
|||
end |
|||
end |
@ -1,40 +0,0 @@ |
|||
fastlane documentation |
|||
---- |
|||
|
|||
# Installation |
|||
|
|||
Make sure you have the latest version of the Xcode command line tools installed: |
|||
|
|||
```sh |
|||
xcode-select --install |
|||
``` |
|||
|
|||
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) |
|||
|
|||
# Available Actions |
|||
|
|||
## Android |
|||
|
|||
### android beta |
|||
|
|||
```sh |
|||
[bundle exec] fastlane android beta |
|||
``` |
|||
|
|||
Build and deploy Android app |
|||
|
|||
### android release |
|||
|
|||
```sh |
|||
[bundle exec] fastlane android release |
|||
``` |
|||
|
|||
|
|||
|
|||
---- |
|||
|
|||
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. |
|||
|
|||
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). |
|||
|
|||
The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). |
Loading…
Reference in new issue