summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2017-03-10 19:14:10 -0800
committerKonstantin Käfer <mail@kkaefer.com>2017-03-17 14:25:37 +0100
commit9544dcc4834bf816e9e75f0aa9937a1562b2353f (patch)
treed2c2eec9d7b171ccbc5f3a82104dd19f804b8343
parentaed3869cfaf0f590f58265e203dd7b9a2ee38fb7 (diff)
downloadqtlocation-mapboxgl-9544dcc4834bf816e9e75f0aa9937a1562b2353f.tar.gz
[android] move build to Android Studio
-rw-r--r--Makefile189
-rw-r--r--platform/android/.gitignore5
-rw-r--r--platform/android/MapboxGLAndroidSDK/build.gradle60
-rw-r--r--platform/android/MapboxGLAndroidSDK/gradle.properties4
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/README.md14
-rw-r--r--platform/android/bitrise.yml41
-rw-r--r--platform/android/build.gradle3
-rw-r--r--platform/android/config.cmake23
-rwxr-xr-xplatform/android/scripts/debug.sh42
-rwxr-xr-xplatform/android/scripts/metrics.sh14
-rwxr-xr-xplatform/android/scripts/ndk.sh123
-rw-r--r--platform/android/tests/docs/UI_TESTS.md4
-rw-r--r--platform/android/tests/docs/UNIT_TESTS.md4
13 files changed, 211 insertions, 315 deletions
diff --git a/Makefile b/Makefile
index 3eadbe04a4..0edfe685a2 100644
--- a/Makefile
+++ b/Makefile
@@ -6,6 +6,8 @@ else
$(error BUILDTYPE must be Debug or Release)
endif
+buildtype := $(shell echo "$(BUILDTYPE)" | tr "[A-Z]" "[a-z]")
+
ifeq ($(shell uname -s), Darwin)
HOST_PLATFORM = macos
HOST_PLATFORM_VERSION = $(shell uname -m)
@@ -450,39 +452,36 @@ test-node: node
#### Android targets ###########################################################
-MBGL_ANDROID_ABIS = arm-v5;armeabi;9
-MBGL_ANDROID_ABIS += arm-v7;armeabi-v7a;9
-MBGL_ANDROID_ABIS += arm-v8;arm64-v8a;21
-MBGL_ANDROID_ABIS += x86;x86;9
-MBGL_ANDROID_ABIS += x86-64;x86_64;21
-MBGL_ANDROID_ABIS += mips;mips;9
+MBGL_ANDROID_ABIS = arm-v5;armeabi
+MBGL_ANDROID_ABIS += arm-v7;armeabi-v7a
+MBGL_ANDROID_ABIS += arm-v8;arm64-v8a
+MBGL_ANDROID_ABIS += x86;x86
+MBGL_ANDROID_ABIS += x86-64;x86_64
+MBGL_ANDROID_ABIS += mips;mips
-MBGL_ANDROID_BUILD_DIR = build/android-$1-$3/$(BUILDTYPE)
MBGL_ANDROID_LOCAL_WORK_DIR = /data/local/tmp/core-tests
MBGL_ANDROID_LIBDIR = lib$(if $(filter arm-v8 x86-64,$1),64)
MBGL_ANDROID_DALVIKVM = dalvikvm$(if $(filter arm-v8 x86-64,$1),64,32)
MBGL_ANDROID_APK_SUFFIX = $(if $(filter Release,$(BUILDTYPE)),release-unsigned,debug)
-MBGL_ANDROID_CORE_TEST_DIR = $(MBGL_ANDROID_BUILD_DIR)/core-tests
+MBGL_ANDROID_CORE_TEST_DIR = platform/android/MapboxGLAndroidSDK/.externalNativeBuild/cmake/$(buildtype)/$2/core-tests
+MBGL_ANDROID_GRADLE = ./gradlew --parallel --max-workers=$(JOBS) -Pmapbox.buildtype=$(buildtype)
+
+# Lists all devices, and extracts the identifiers, then obtains the ABI for every one.
+# Some devices return \r\n, so we'll have to remove the carriage return before concatenating.
+MBGL_ANDROID_ACTIVE_ARCHS = $(shell adb devices | sed '1d;/^\*/d;s/[[:space:]].*//' | xargs -n 1 -I DEV `type -P adb` -s DEV shell getprop ro.product.cpu.abi | tr -d '\r')
.PHONY: android-help
android-help:
@echo
@echo "Available Android architecture targets:"
@echo
- @echo " make android-arm-v5-9"
- @echo " (android-arm-v5)"
- @echo " make android-arm-v7-9"
- @echo " (android, android-arm-v7)"
- @echo " make android-arm-v8-21"
- @echo " (android-arm-v8)"
- @echo " make android-mips-9"
- @echo " (android-mips)"
- @echo " make android-mips-64-21"
- @echo " (android-mips-64)"
- @echo " make android-x86-9"
- @echo " (android-x86)"
- @echo " make android-x86-64-21"
- @echo " (android-x86-64)"
+ @echo " make android-arm-v5"
+ @echo " make android-arm-v7, make android"
+ @echo " make android-arm-v8"
+ @echo " make android-mips"
+ @echo " make android-mips-64"
+ @echo " make android-x86"
+ @echo " make android-x86-64"
@echo " make apackage"
@echo
@@ -491,50 +490,30 @@ android-style-code:
node platform/android/scripts/generate-style-code.js
style-code: android-style-code
+# Configuration file for running CMake from Gradle within Android Studio.
+platform/android/configuration.gradle:
+ @echo "ext {\n node = '`which node`'\n npm = '`which npm`'\n ccache = '`which ccache`'\n}" > $@
+
define ANDROID_RULES
# $1 = arm-v7 (short arch)
# $2 = armeabi-v7a (internal arch)
-# $3 = 9 (platform version)
-
-$(MBGL_ANDROID_BUILD_DIR)/env.sh: $(BUILD_DEPS) platform/android/scripts/ndk.sh
- @mkdir -p $(MBGL_ANDROID_BUILD_DIR)
- platform/android/scripts/ndk.sh $1 $2 $3 > $(MBGL_ANDROID_BUILD_DIR)/env.sh.tmp && \
- mv $(MBGL_ANDROID_BUILD_DIR)/env.sh.tmp $(MBGL_ANDROID_BUILD_DIR)/env.sh
-
-$(MBGL_ANDROID_BUILD_DIR)/build.ninja: $(MBGL_ANDROID_BUILD_DIR)/env.sh platform/android/config.cmake
- # Invoke CMake twice to fix issues from double inclusion of toolchain.cmake on the first run.
- . $(MBGL_ANDROID_BUILD_DIR)/env.sh && \
- ([ -f $(MBGL_ANDROID_BUILD_DIR)/build.ninja ] || $$$${CMAKE} \
- -H. \
- -B"$(MBGL_ANDROID_BUILD_DIR)" \
- -G"$$$${CMAKE_GENERATOR}" \
- $$$${CMAKE_ARGS} \
- -DCMAKE_BUILD_TYPE=$(BUILDTYPE) \
- -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
- -DMBGL_PLATFORM=android \
- -DMASON_PLATFORM=android) && \
- $$$${CMAKE} \
- -H. \
- -B"$(MBGL_ANDROID_BUILD_DIR)"
.PHONY: android-test-lib-$1
-android-test-lib-$1: $(MBGL_ANDROID_BUILD_DIR)/build.ninja
- . $(MBGL_ANDROID_BUILD_DIR)/env.sh && $$$${CMAKE} --build $(MBGL_ANDROID_BUILD_DIR) -- $(NINJA_ARGS) -j$(JOBS) mbgl-test
+android-test-lib-$1: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 -Pmapbox.with_test=true :MapboxGLAndroidSDKTestApp:assemble$(BUILDTYPE)
.PHONY: android-lib-$1
-android-lib-$1: $(MBGL_ANDROID_BUILD_DIR)/build.ninja
- . $(MBGL_ANDROID_BUILD_DIR)/env.sh && $$$${CMAKE} --build $(MBGL_ANDROID_BUILD_DIR) -- $(NINJA_ARGS) -j$(JOBS) mapbox-gl example-custom-layer
+android-lib-$1: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDK:assemble$(BUILDTYPE)
.PHONY: android-$1
-android-$1: android-lib-$1
- cd platform/android && ./gradlew --parallel --max-workers=$(JOBS) :MapboxGLAndroidSDKTestApp:assemble$(BUILDTYPE)
+android-$1: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDKTestApp:assemble$(BUILDTYPE)
.PHONY: android-core-test-$1
android-core-test-$1: android-test-lib-$1
- mkdir -p $(MBGL_ANDROID_CORE_TEST_DIR)
-
# Compile main sources and extract the classes (using the test app to get all transitive dependencies in one place)
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:assemble$(BUILDTYPE)
+ mkdir -p $(MBGL_ANDROID_CORE_TEST_DIR)
unzip -o platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-$(MBGL_ANDROID_APK_SUFFIX).apk classes.dex -d $(MBGL_ANDROID_CORE_TEST_DIR)
# Compile Test runner
@@ -555,8 +534,8 @@ run-android-core-test-$1-%: android-core-test-$1
# Push all needed files to the device
adb push $(MBGL_ANDROID_CORE_TEST_DIR)/test.jar $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
adb push test/fixtures $(MBGL_ANDROID_LOCAL_WORK_DIR)/test > /dev/null 2>&1
- adb push $(MBGL_ANDROID_BUILD_DIR)/stripped/libmapbox-gl.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
- adb push $(MBGL_ANDROID_BUILD_DIR)/stripped/libmbgl-test.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
+ adb push platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/$2/libmapbox-gl.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
+ adb push platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/$2/libmbgl-test.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
# Kick off the tests
adb shell "export LD_LIBRARY_PATH=/system/$(MBGL_ANDROID_LIBDIR):$(MBGL_ANDROID_LOCAL_WORK_DIR) && cd $(MBGL_ANDROID_LOCAL_WORK_DIR) && $(MBGL_ANDROID_DALVIKVM) -cp $(MBGL_ANDROID_LOCAL_WORK_DIR)/test.jar Main --gtest_filter=$$*"
@@ -571,16 +550,29 @@ run-android-core-test-$1-%: android-core-test-$1
run-android-core-test-$1: run-android-core-test-$1-*
.PHONY: run-android-$1
-run-android-$1: android-$1
+run-android-$1: platform/android/configuration.gradle
adb uninstall com.mapbox.mapboxsdk.testapp > /dev/null
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:install$(BUILDTYPE) && adb shell am start -n com.mapbox.mapboxsdk.testapp/.activity.FeatureOverviewActivity
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDKTestApp:install$(BUILDTYPE) && adb shell am start -n com.mapbox.mapboxsdk.testapp/.activity.FeatureOverviewActivity
+
+.PHONY: android-ui-test-$1
+android-ui-test-$1: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDKTestApp:assembleDebug :MapboxGLAndroidSDKTestApp:assembleAndroidTest
+
+# This test assumes that you have Android Simulator started locally.
+.PHONY: run-android-ui-test-$1
+run-android-ui-test-$1: platform/android/configuration.gradle
+ adb uninstall com.mapbox.mapboxsdk.testapp > /dev/null
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDKTestApp:connectedAndroidTest
+
+run-android-ui-test-$1-%: platform/android/configuration.gradle
+ adb uninstall com.mapbox.mapboxsdk.testapp > /dev/null
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=$2 :MapboxGLAndroidSDKTestApp:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class="$*"
-apackage: android-lib-$1
endef
# Explodes the arguments into individual variables
define ANDROID_RULES_INVOKER
-$(call ANDROID_RULES,$(word 1,$1),$(word 2,$1),$(word 3,$1))
+$(call ANDROID_RULES,$(word 1,$1),$(word 2,$1))
endef
$(foreach abi,$(MBGL_ANDROID_ABIS),$(eval $(call ANDROID_RULES_INVOKER,$(subst ;, ,$(abi)))))
@@ -588,67 +580,70 @@ $(foreach abi,$(MBGL_ANDROID_ABIS),$(eval $(call ANDROID_RULES_INVOKER,$(subst ;
.PHONY: android
android: android-arm-v7
+.PHONY: android-lib
+android-lib: android-lib-arm-v7
+
.PHONY: run-android
run-android: run-android-arm-v7
-.PHONY: run-android-unit-test
-run-android-unit-test:
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:testDebugUnitTest --continue
+.PHONY: run-android-ui-test
+run-android-ui-test: run-android-ui-test-arm-v7
+run-android-ui-test-%: run-android-ui-test-arm-v7-%
-run-android-unit-test-%:
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:testDebugUnitTest --tests "$*"
+# Java-only test
+.PHONY: run-android-unit-test
+run-android-unit-test: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none :MapboxGLAndroidSDKTestApp:testDebugUnitTest
+run-android-unit-test-%: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none :MapboxGLAndroidSDKTestApp:testDebugUnitTest --tests "$*"
+# Java-only test
.PHONY: run-android-wear-unit-test
-run-android-wear-unit-test:
- cd platform/android && ./gradlew :MapboxGLAndroidSDKWearTestApp:testDebugUnitTest --continue
+run-android-wear-unit-test: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none :MapboxGLAndroidSDKWearTestApp:testDebugUnitTest
+run-android-wear-unit-test-%: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none :MapboxGLAndroidSDKWearTestApp:testDebugUnitTest --tests "$*"
-.PHONY: android-ui-test
-android-ui-test:
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:assembleDebug --continue && ./gradlew :MapboxGLAndroidSDKTestApp:assembleAndroidTest --continue
-
-.PHONY: run-android-ui-test
-run-android-ui-test:
- adb uninstall com.mapbox.mapboxsdk.testapp > /dev/null
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:connectedAndroidTest -i
+.PHONY: run-android-ui-test-aws
+run-android-ui-test-aws: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=all devicefarmUpload
-run-android-ui-test-%:
- adb uninstall com.mapbox.mapboxsdk.testapp > /dev/null
- cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class="$*"
+.PHONY: apackage
+apackage: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=all assemble$(BUILDTYPE)
-.PHONY: run-android-ui-test-aws
-run-android-ui-test-aws:
- cd platform/android && ./gradlew devicefarmUpload
+# Uploads the compiled Android SDK to Maven
+.PHONY: run-android-upload-archives
+run-android-upload-archives: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=all :MapboxGLAndroidSDK:uploadArchives
+# Runs Android UI tests on all connected devices using Spoon
.PHONY: run-android-ui-test-spoon
-run-android-ui-test-spoon:
- cd platform/android && ./gradlew spoon
-
-.PHONY: apackage
-apackage:
- cd platform/android && ./gradlew --parallel --max-workers=$(JOBS) assemble$(BUILDTYPE)
+run-android-ui-test-spoon: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis="$(MBGL_ANDROID_ACTIVE_ARCHS)" spoon
.PHONY: test-code-android
test-code-android:
node platform/android/scripts/generate-test-code.js
-.PHONY: android-ndk-stack
-android-ndk-stack:
- adb logcat | ndk-stack -sym build/android-arm-v7-9/Debug
-
.PHONY: android-checkstyle
-android-checkstyle:
- cd platform/android && ./gradlew checkstyle
+android-checkstyle: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none checkstyle
.PHONY: android-javadoc
-android-javadoc:
- cd platform/android && ./gradlew :MapboxGLAndroidSDK:javadocrelease
+android-javadoc: platform/android/configuration.gradle
+ cd platform/android && $(MBGL_ANDROID_GRADLE) -Pmapbox.abis=none :MapboxGLAndroidSDK:javadocrelease
ifeq ($(HOST_PLATFORM), macos)
.PHONY: aproj
-aproj:
+aproj: platform/android/configuration.gradle
open -b com.google.android.studio platform/android
endif
+.PHONY: android-configuration
+android-configuration: platform/android/configuration.gradle
+ cat platform/android/configuration.gradle
+
#### Miscellaneous targets #####################################################
.PHONY: style-code
@@ -663,12 +658,12 @@ codestyle:
.PHONY: clean
clean:
-rm -rf ./build \
+ ./platform/android/configuration.gradle \
./platform/android/MapboxGLAndroidSDK/build \
+ ./platform/android/MapboxGLAndroidSDK/.externalNativeBuild \
./platform/android/MapboxGLAndroidSDKTestApp/build \
./platform/android/MapboxGLAndroidSDKWearTestApp/build \
./platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/activity/gen \
- ./platform/android/MapboxGLAndroidSDK/src/main/jniLibs \
- ./platform/android/MapboxGLAndroidSDKTestApp/src/main/jniLibs \
./platform/android/MapboxGLAndroidSDK/src/main/assets
.PHONY: distclean
diff --git a/platform/android/.gitignore b/platform/android/.gitignore
index 81eeaad167..7a3db0aafd 100644
--- a/platform/android/.gitignore
+++ b/platform/android/.gitignore
@@ -7,17 +7,16 @@
# Build files
build/
+.externalNativeBuild
*.so
*.apk
-# JNI
-MapboxGLAndroidSDK/src/main/jniLibs/
-
# Lib assets
MapboxGLAndroidSDK/src/main/assets/
# Local settings
local.properties
+/configuration.gradle
# Token file
MapboxGLAndroidSDKTestApp/src/main/res/values/developer-config.xml
diff --git a/platform/android/MapboxGLAndroidSDK/build.gradle b/platform/android/MapboxGLAndroidSDK/build.gradle
index 6602d919a3..dd25a8d7b4 100644
--- a/platform/android/MapboxGLAndroidSDK/build.gradle
+++ b/platform/android/MapboxGLAndroidSDK/build.gradle
@@ -29,6 +29,66 @@ android {
buildConfigField "String", "GIT_REVISION_SHORT", String.format("\"%s\"", getGitRevision())
}
+ defaultPublishConfig project.hasProperty("mapbox.buildtype") ? project.getProperty("mapbox.buildtype") : "debug"
+
+ // We sometimes want to invoke Gradle without building a native dependency, e.g. when we just want
+ // to invoke the Java tests. When we explicitly specify an ABI of 'none', no native dependencies are
+ // added. When another ABI is specified explicitly, we're just going to build that ABI. In all other
+ // cases, all ABIs are built.
+ // When invoking from the command line, set `-Pmapbox.abis=...` to only build the desired architectures.
+ // When building from Android Studio, gradle.properties sets `android.buildOnlyTargetAbi=true` so that
+ // only the architecture for the device you're running on gets built.
+ def abi = 'all'
+ if (!project.hasProperty('android.injected.invoked.from.ide')) {
+ // Errors when the user invokes Gradle from the command line and didn't set mapbox.abis
+ abi = project.getProperty("mapbox.abis")
+ }
+
+ if (abi != 'none') {
+ externalNativeBuild {
+ cmake {
+ path "../../../CMakeLists.txt"
+ }
+ }
+ }
+
+ defaultConfig {
+ if (abi != 'none') {
+ externalNativeBuild {
+ cmake {
+ arguments "-DANDROID_TOOLCHAIN=clang"
+ arguments "-DANDROID_STL=c++_static"
+ arguments "-DANDROID_CPP_FEATURES=rtti;exceptions"
+ arguments "-DMBGL_PLATFORM=android"
+ arguments "-DMASON_PLATFORM=android"
+ arguments "-DNodeJS_EXECUTABLE=" + rootProject.ext.node
+ arguments "-Dnpm_EXECUTABLE=" + rootProject.ext.npm
+
+ // Enable ccache if the user has installed it.
+ if (rootProject.ext.ccache?.trim()) {
+ arguments "-DANDROID_CCACHE=" + rootProject.ext.ccache
+ // ccache splits up the compile command until multiple invocations and uses -E
+ // with one of them, and clang doesn't like unused arguments in that case.
+ cFlags "-Qunused-arguments"
+ cppFlags "-Qunused-arguments"
+ }
+
+ targets "mapbox-gl"
+ targets "example-custom-layer"
+ if (project.hasProperty("mapbox.with_test")) {
+ targets "mbgl-test"
+ }
+
+ if (abi != 'all') {
+ abiFilters abi.split(' ')
+ } else {
+ abiFilters "armeabi", "armeabi-v7a", "mips", "x86", "arm64-v8a", "x86_64"
+ }
+ }
+ }
+ }
+ }
+
// avoid naming conflicts, force usage of prefix
resourcePrefix 'mapbox_'
diff --git a/platform/android/MapboxGLAndroidSDK/gradle.properties b/platform/android/MapboxGLAndroidSDK/gradle.properties
index dac39fa60a..13a5f1032a 100644
--- a/platform/android/MapboxGLAndroidSDK/gradle.properties
+++ b/platform/android/MapboxGLAndroidSDK/gradle.properties
@@ -14,3 +14,7 @@ POM_DEVELOPER_NAME=Mapbox
POM_NAME=Mapbox Android SDK
POM_ARTIFACT_ID=mapbox-android-sdk
POM_PACKAGING=aar
+
+# Only build native dependencies for the current ABI
+# See https://code.google.com/p/android/issues/detail?id=221098#c20
+android.buildOnlyTargetAbi=true
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/README.md b/platform/android/MapboxGLAndroidSDKTestApp/README.md
index 0acb509b3e..c7a918cd48 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/README.md
+++ b/platform/android/MapboxGLAndroidSDKTestApp/README.md
@@ -1,5 +1,15 @@
# Mapbox GL Test App
+## Building
+
+To be able to run any Gradle commands, you'll need to create the configuration file by running
+
+```
+$ make android-configuration
+```
+
+from the root folder.
+
## Testing
### Running Espresso tests on a device
@@ -28,7 +38,7 @@ On a terminal, within `mapbox-gl-native/android/java`,
run the tests (`cC` stands for `connectedCheck`):
```
-$ ./gradlew cC -p MapboxGLAndroidSDKTestApp
+$ ./gradlew -Pmapbox.abis=all cC -p MapboxGLAndroidSDKTestApp
```
Then:
@@ -63,7 +73,7 @@ You can also have a run configuration:
You can also run the tests from the command line with:
```
-$ ./gradlew test --continue -p MapboxGLAndroidSDKTestApp
+$ ./gradlew -Pmapbox.abis=none test -p MapboxGLAndroidSDKTestApp
```
### Running the UI/Application Exerciser Monkey
diff --git a/platform/android/bitrise.yml b/platform/android/bitrise.yml
index 0470bccd02..6e1f9a0d19 100644
--- a/platform/android/bitrise.yml
+++ b/platform/android/bitrise.yml
@@ -14,13 +14,6 @@ workflows:
primary:
steps:
- script:
- title: Run Checkstyle
- inputs:
- - content: |-
- #!/bin/bash
- # Run checkstyle gradle task on all modules
- cd platform/android && ./gradlew checkstyle
- - script:
title: Configure Google Cloud SDK
inputs:
- content: |-
@@ -45,9 +38,12 @@ workflows:
inputs:
- content: |-
#!/bin/bash
+ # Accept Android SDK license
+ echo "Accepting Android SDK license..."
+ mkdir -p "${ANDROID_HOME}/licenses"
+ echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license"
echo "Compile libmapbox-gl.so for armeabi-v7a abi:"
- export BUILDTYPE=Debug
- make android-lib-arm-v7
+ BUILDTYPE=Debug make android-lib-arm-v7
- script:
title: Compile Core tests
inputs:
@@ -77,6 +73,13 @@ workflows:
echo "Generate these test locally by executing:"
make test-code-android
- script:
+ title: Run Checkstyle
+ inputs:
+ - content: |-
+ #!/bin/bash
+ # Run checkstyle gradle task on all modules
+ make android-checkstyle
+ - script:
title: Run Firebase instrumentation tests
inputs:
- content: |-
@@ -85,7 +88,7 @@ workflows:
wget -O platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/developer-config.xml "$BITRISEIO_TEST_ACCESS_TOKEN_UI_TEST_URL"
echo "Build seperate test apk:"
- make android-ui-test
+ make android-ui-test-arm-v7
echo "Run tests on firebase:"
gcloud auth activate-service-account --key-file secret.json --project android-gl-native
@@ -156,17 +159,20 @@ workflows:
inputs:
- content: |-
#!/bin/bash
+ # Accept Android SDK license
+ echo "Accepting Android SDK license..."
+ mkdir -p "${ANDROID_HOME}/licenses"
+ echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license"
echo "Compile libmapbox-gl.so for all supportd abi's:"
export BUILDTYPE=Release
make apackage
- cd platform/android && ./gradlew :MapboxGLAndroidSDK:assembleRelease
- script:
title: Publish to maven
inputs:
- content: |-
#!/bin/bash
echo "Upload aar file to maven:"
- cd platform/android && ./gradlew :MapboxGLAndroidSDK:uploadArchives
+ make run-android-upload-archives
- slack:
title: Post to Slack
inputs:
@@ -185,6 +191,10 @@ workflows:
inputs:
- content: |-
#!/bin/bash
+ # Accept Android SDK license
+ echo "Accepting Android SDK license..."
+ mkdir -p "${ANDROID_HOME}/licenses"
+ echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license"
echo "Compile libmapbox-gl.so for all supportd abi's:"
export BUILDTYPE=Release
make apackage
@@ -208,7 +218,7 @@ workflows:
- content: |-
#!/bin/bash
echo "Run tests on device farm:"
- cd platform/android && ./gradlew devicefarmUpload
+ make run-android-ui-test-aws
- slack:
title: Post to Slack
inputs:
@@ -234,10 +244,13 @@ workflows:
inputs:
- content: |-
#!/bin/bash
+ # Accept Android SDK license
+ echo "Accepting Android SDK license..."
+ mkdir -p "${ANDROID_HOME}/licenses"
+ echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license"
echo "Compile libmapbox-gl.so for all supportd abi's:"
export BUILDTYPE=Release
make apackage
- cd platform/android && ./gradlew :MapboxGLAndroidSDK:assembleRelease
- script:
title: Log metrics
inputs:
diff --git a/platform/android/build.gradle b/platform/android/build.gradle
index 4219f2bdee..5e45232716 100644
--- a/platform/android/build.gradle
+++ b/platform/android/build.gradle
@@ -21,3 +21,6 @@ task wrapper(type: Wrapper) {
apply from: rootProject.file('dependencies.gradle')
+// Load build system information. If this file does not exist, run
+// `make platform/android/configuration.gradle`
+apply from: rootProject.file('configuration.gradle')
diff --git a/platform/android/config.cmake b/platform/android/config.cmake
index fdf03b4ec8..1a68ee065d 100644
--- a/platform/android/config.cmake
+++ b/platform/android/config.cmake
@@ -22,15 +22,6 @@ mason_use(sqlite VERSION 3.14.2)
mason_use(gtest VERSION 1.8.0)
mason_use(icu VERSION 58.1-min-size)
-set(ANDROID_SDK_PROJECT_DIR ${CMAKE_SOURCE_DIR}/platform/android/MapboxGLAndroidSDK)
-set(ANDROID_JNI_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/jniLibs/${ANDROID_ABI})
-set(ANDROID_ASSETS_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/assets)
-set(ANDROID_TEST_APP_JNI_TARGET_DIR ${CMAKE_SOURCE_DIR}/platform/android/MapboxGLAndroidSDKTestApp/src/main/jniLibs/${ANDROID_ABI})
-
-if (NOT DEFINED ANDROID_TOOLCHAIN_PREFIX)
- set(ANDROID_TOOLCHAIN_PREFIX "${MASON_XC_ROOT}/bin/${ANDROID_TOOLCHAIN}-")
-endif()
-
## mbgl core ##
macro(mbgl_platform_core)
@@ -251,11 +242,6 @@ target_link_libraries(mapbox-gl
PUBLIC -Wl,--version-script=${CMAKE_SOURCE_DIR}/platform/android/version-script
)
-# Create a stripped version of the library and copy it to the JNIDIR.
-add_custom_command(TARGET mapbox-gl POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E make_directory ${ANDROID_JNI_TARGET_DIR}
- COMMAND ${ANDROID_TOOLCHAIN_PREFIX}strip $<TARGET_FILE:mapbox-gl> -o ${ANDROID_JNI_TARGET_DIR}/$<TARGET_FILE_NAME:mapbox-gl>)
-
## Test library ##
add_library(mbgl-test SHARED
@@ -312,11 +298,6 @@ target_add_mason_package(mbgl-test PRIVATE boost)
target_add_mason_package(mbgl-test PRIVATE geojson)
target_add_mason_package(mbgl-test PRIVATE geojsonvt)
-add_custom_command(TARGET mbgl-test POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/stripped
- COMMAND ${ANDROID_TOOLCHAIN_PREFIX}strip $<TARGET_FILE:mapbox-gl> -o ${CMAKE_CURRENT_BINARY_DIR}/stripped/$<TARGET_FILE_NAME:mapbox-gl>
- COMMAND ${ANDROID_TOOLCHAIN_PREFIX}strip $<TARGET_FILE:mbgl-test> -o ${CMAKE_CURRENT_BINARY_DIR}/stripped/$<TARGET_FILE_NAME:mbgl-test>)
-
## Custom layer example ##
add_library(example-custom-layer SHARED
@@ -334,7 +315,3 @@ target_link_libraries(example-custom-layer
PUBLIC -Wl,--gc-sections
PUBLIC -Wl,--version-script=${CMAKE_SOURCE_DIR}/platform/android/version-script
)
-
-add_custom_command(TARGET example-custom-layer POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E make_directory ${ANDROID_TEST_APP_JNI_TARGET_DIR}
- COMMAND ${ANDROID_TOOLCHAIN_PREFIX}strip $<TARGET_FILE:example-custom-layer> -o ${ANDROID_TEST_APP_JNI_TARGET_DIR}/$<TARGET_FILE_NAME:example-custom-layer>)
diff --git a/platform/android/scripts/debug.sh b/platform/android/scripts/debug.sh
deleted file mode 100755
index 909c47f992..0000000000
--- a/platform/android/scripts/debug.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-
-# Automation of https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB
-
-export MASON_ANDROID_ARCH=x86
-export MASON_ANDROID_PLATFORM=9
-export MASON_ANDROID_NDK_VERSION=r14
-
-export MASON_XC_ROOT=`scripts/mason.sh PREFIX android-ndk VERSION ${MASON_ANDROID_ARCH}-${MASON_ANDROID_PLATFORM}-${MASON_ANDROID_NDK_VERSION}`
-source ${MASON_XC_ROOT}/toolchain.sh
-
-if [[ $1 == '--prepare' ]]; then
- mkdir -p ~/.android/debugging/{vendor,system}_lib
- adb pull /system/lib ~/.android/debugging/system_lib
- adb pull /vendor/lib ~/.android/debugging/vendor_lib
- adb pull /system/bin/app_process ~/.android/debugging
- adb pull /system/bin/app_process32 ~/.android/debugging
- adb pull /system/bin/linker ~/.android/debugging
-
- if [[ ${MASON_ANDROID_ARCH} == 'arm-v8' || ${MASON_ANDROID_ARCH} == 'x86-64' || ${MASON_ANDROID_ARCH} == 'mips-64' ]]; then
- adb pull /system/bin/app_process64 ~/.android/debugging
- adb pull /system/bin/linker64 ~/.android/debugging
- fi
-
- cp ${MASON_XC_ROOT}/prebuilt/gdbserver/gdbserver \
- platform/android/MapboxGLAndroidSDK/src/main/jniLibs/${ANDROID_ABI}/gdbserver.so
-fi
-
-adb install -r -t -d -g platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-debug.apk
-adb shell am start -n "com.mapbox.mapboxsdk.testapp/com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity" \
- -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
-
-adb forward tcp:5039 tcp:5039
-adb shell run-as com.mapbox.mapboxsdk.testapp '/data/data/com.mapbox.mapboxsdk.testapp/lib/gdbserver.so \
- --attach :5039 `pgrep com.mapbox.mapboxsdk.testapp`' &
-
-${MASON_XC_ROOT}/bin/gdb \
- -ex "target remote :5039" \
- -ex "set solib-search-path ~/.android/debugging:~/.android/debugging/system_lib:~/.android/debugging/vendor_lib:~/.android/debugging/vendor_lib/egl:./build/android-${MASON_ANDROID_ARCH}-${MASON_ANDROID_PLATFORM}/Debug/lib.target/"
diff --git a/platform/android/scripts/metrics.sh b/platform/android/scripts/metrics.sh
index 37d8c1de65..974ee5e8db 100755
--- a/platform/android/scripts/metrics.sh
+++ b/platform/android/scripts/metrics.sh
@@ -4,12 +4,12 @@ set -e
set -o pipefail
# Track individual architectures
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/armeabi/libmapbox-gl.so" "Platform=Android,Arch=arm-v5"
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/armeabi-v7a/libmapbox-gl.so" "Platform=Android,Arch=arm-v7"
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/arm64-v8a/libmapbox-gl.so" "Platform=Android,Arch=arm-v8"
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/x86/libmapbox-gl.so" "Platform=Android,Arch=x86"
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/x86_64/libmapbox-gl.so" "Platform=Android,Arch=x86_64"
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/src/main/jniLibs/mips/libmapbox-gl.so" "Platform=Android,Arch=mips"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/armeabi/libmapbox-gl.so" "Platform=Android,Arch=arm-v5"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/armeabi-v7a/libmapbox-gl.so" "Platform=Android,Arch=arm-v7"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/arm64-v8a/libmapbox-gl.so" "Platform=Android,Arch=arm-v8"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/x86/libmapbox-gl.so" "Platform=Android,Arch=x86"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/x86_64/libmapbox-gl.so" "Platform=Android,Arch=x86_64"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/intermediates/bundles/default/jni/mips/libmapbox-gl.so" "Platform=Android,Arch=mips"
# Track overall library size
-scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/outputs/aar/MapboxGLAndroidSDK-release.aar" "Platform=Android,Arch=Archive"
+scripts/log_binary_size.sh "platform/android/MapboxGLAndroidSDK/build/outputs/aar/MapboxGLAndroidSDK-release.aar" "Platform=Android,Arch=Archive"
diff --git a/platform/android/scripts/ndk.sh b/platform/android/scripts/ndk.sh
deleted file mode 100755
index 0a858a6daa..0000000000
--- a/platform/android/scripts/ndk.sh
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -o pipefail
-set -u
-
-# This script produces an env.sh file, which contains the paths to CMake, and the flags required to
-# create a build. It first tries to use the Android NDK, but falls back to installing it via Mason.
-
-function error { >&2 echo -e "\033[1m\033[31m$@\033[0m"; }
-function warning { >&2 echo -e "\033[1m\033[33m$@\033[0m"; }
-function status { >&2 echo -e "\033[1m\033[36m$@\033[0m"; }
-function info { >&2 echo -e "\033[1m\033[32m$@\033[0m"; }
-
-if [ "$#" -ne 3 ]; then
- error "Usage: $0 <short arch> <long arch> <api level>"
-fi
-
-NDK_ANDROID_VERSION=$1-$3
-ANDROID_NATIVE_API_LEVEL=$3
-ANDROID_ABI=$2
-
-MASON_NDK_VERSION=r14
-
-function is_supported_ndk_version {
- [ "$1" = "13.1.3345770" ] || [ "$1" = "14.0.3770861" ]
-}
-
-function mason_ndk {
- local CMAKE=${CMAKE:-cmake}
- MASON_XC_ROOT="`${CMAKE} -P cmake/mason.cmake PREFIX android-ndk VERSION ${NDK_ANDROID_VERSION}-${MASON_NDK_VERSION}`"
-
- local TOOLCHAIN="${MASON_XC_ROOT}/toolchain.cmake"
- if [ ! -f "${TOOLCHAIN}" ]; then
- error "Can't find CMake toolchain file at ${TOOLCHAIN}."
- exit 1
- fi
-
- info "Using Mason-provided Android NDK ${MASON_NDK_VERSION} at ${MASON_XC_ROOT}"
- echo CMAKE=\"${CMAKE}\"
- echo CMAKE_GENERATOR=\"Ninja\"
- echo CMAKE_ARGS=\" \
- -DCMAKE_MAKE_PROGRAM=`pwd`/${NINJA} \
- -DMASON_XC_ROOT=${MASON_XC_ROOT} \
- -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \
- \"
-}
-
-function system_ndk {
- if [[ ${USE_MASON_NDK:-} ]]; then
- return 1
- fi
-
- if [ -f platform/android/local.properties ]; then
- local SDK_DIR=$(sed -n -e 's/^sdk.dir=\(.*\)$/\1/p' platform/android/local.properties)
- fi
-
- if [ ! -d "${SDK_DIR:-}" ]; then
- if [ ! -z "${ANDROID_HOME:-}" ]; then
- local SDK_DIR="${ANDROID_HOME}"
- else
- error "Can't find the Android SDK. Set \$ANDROID_HOME to the SDK path."
- exit 1
- fi
- fi
-
- local NDK_DIR="${ANDROID_NDK_HOME:-${SDK_DIR}/ndk-bundle}"
- if [ ! -d "${NDK_DIR}" ]; then
- warning "Can't find the Android NDK. If it is installed, set \$ANDROID_NDK_HOME to the NDK path."
- return 1
- fi
-
- local SYSTEM_NDK_VERSION=$(sed -n 's/^Pkg.Revision *= *//p' "${NDK_DIR}/source.properties")
- if ! is_supported_ndk_version "${SYSTEM_NDK_VERSION}"; then
- warning "Android NDK version '${SYSTEM_NDK_VERSION}' doesn't match required version."
- return 1
- fi
-
- # Try to install CMake if it's not installed yet.
- mkdir -p "${SDK_DIR}/cmake"
- local CMAKE_VERSION=/$(ls "${SDK_DIR}/cmake" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
- local CMAKE="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/cmake"
- if [ ! -f "${CMAKE}" ]; then
- status "Trying to install CMake..."
- mkdir -p "${SDK_DIR}/licenses"
- echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${SDK_DIR}/licenses/android-sdk-license"
- "${SDK_DIR}/tools/bin/sdkmanager" --list | grep cmake | tail -n 1 | cut -d \| -f 1 | xargs "${SDK_DIR}/tools/bin/sdkmanager" >&2
- CMAKE_VERSION=/$(ls "${SDK_DIR}/cmake" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
- CMAKE="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/cmake"
- if [ ! -f "${CMAKE}" ]; then
- error "Can't find CMake at ${CMAKE}."
- return 1
- fi
- fi
-
- local NINJA="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/ninja"
- if [ ! -f "${NINJA}" ]; then
- error "Can't find Ninja at ${NINJA}."
- return 1
- fi
-
- local TOOLCHAIN="${NDK_DIR}/build/cmake/android.toolchain.cmake"
- if [ ! -f "${TOOLCHAIN}" ]; then
- error "Can't find CMake toolchain file at ${TOOLCHAIN}."
- return 1
- fi
-
- info "Using system-provided Android NDK ${SYSTEM_NDK_VERSION} at ${NDK_DIR}"
- echo CMAKE=\"${CMAKE}\"
- echo CMAKE_GENERATOR=\"Android Gradle - Ninja\"
- echo CMAKE_ARGS=\" \
- -DANDROID_ABI=${ANDROID_ABI} \
- -DANDROID_NDK=${NDK_DIR} \
- -DCMAKE_MAKE_PROGRAM=${NINJA} \
- -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \
- -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
- -DANDROID_TOOLCHAIN=clang \
- -DANDROID_STL=c++_static \
- -DANDROID_CPP_FEATURES=rtti\;exceptions \
- \"
-}
-
-system_ndk || mason_ndk
diff --git a/platform/android/tests/docs/UI_TESTS.md b/platform/android/tests/docs/UI_TESTS.md
index 9341cf1e1e..6d8541a406 100644
--- a/platform/android/tests/docs/UI_TESTS.md
+++ b/platform/android/tests/docs/UI_TESTS.md
@@ -25,7 +25,7 @@ On a terminal, within `mapbox-gl-native/android/java`,
run the tests (`cC` stands for `connectedCheck`):
```
-$ ./gradlew cC -p MapboxGLAndroidSDKTestApp
+$ ./gradlew -Pmapbox.abis=all cC -p MapboxGLAndroidSDKTestApp
```
Then:
@@ -59,7 +59,7 @@ You can generate JaCoCo reports from espresso tests by
- running the gradle task `createMockDebugCoverageReport` when executing tests.
## Running Espresso test automatically on AWS Device Farm
-To run tests on AWS device farm you need to execute `./gradlew devicefarmUpload`.
+To run tests on AWS device farm you need to execute `./gradlew -Pmapbox.abis=none devicefarmUpload`.
You can configure the different steps in the testapp `build.gradle`.
AWS credentials are found in bitrise.
diff --git a/platform/android/tests/docs/UNIT_TESTS.md b/platform/android/tests/docs/UNIT_TESTS.md
index e32a36ef78..fefb435684 100644
--- a/platform/android/tests/docs/UNIT_TESTS.md
+++ b/platform/android/tests/docs/UNIT_TESTS.md
@@ -69,7 +69,7 @@ If you like, you can also run with test coverage enabled. This will show you the
You can also run the tests from the command line with:
```
-$ ./gradlew test --continue -p MapboxGLAndroidSDKTestApp
+$ ./gradlew -Pmapbox.abis=none test -p MapboxGLAndroidSDKTestApp
```
## Running Unit tests on CI
@@ -80,7 +80,7 @@ fails, this will fail and stop the build.
You can find this gradle command in our [buildscript](https://github.com/mapbox/mapbox-gl-native/blob/master/platform/android/bitrise.yml#L48):
```
-$ ./gradlew testReleaseUnitTest --continue
+$ ./gradlew -Pmapbox.abis=none testReleaseUnitTest
```