Build Information
Failed to build modbus2mqtt, reference main (208a1e), with Swift 6.2 for Android on 3 Dec 2025 19:01:30 UTC.
Build Command
bash -c docker run --pull=always --rm -v "checkouts-4609320-3":/host -w "$PWD" -e JAVA_HOME="/root/.sdkman/candidates/java/current" -e SPI_BUILD="1" -e SPI_PROCESSING="1" registry.gitlab.com/finestructure/spi-images:android-6.2-latest swift build --swift-sdk aarch64-unknown-linux-android28 2>&1Build Log
========================================
RunAll
========================================
Builder version: 4.68.0
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/jollyjinx/modbus-2-mqtt-bridge.git
Reference: main
Initialized empty Git repository in /host/spi-builder-workspace/.git/
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
From https://github.com/jollyjinx/modbus-2-mqtt-bridge
* branch main -> FETCH_HEAD
* [new branch] main -> origin/main
HEAD is now at 208a1e3 updated readme to refer to ghcr.io instead of docker as images are now built automatically on github.
Cloned https://github.com/jollyjinx/modbus-2-mqtt-bridge.git
Revision (git rev-parse @):
208a1e35ef0a91fa85c0f1ea817a78c0dd695bb2
SUCCESS checkout https://github.com/jollyjinx/modbus-2-mqtt-bridge.git at main
========================================
Build
========================================
Selected platform: android
Swift version: 6.2
Building package at path: $PWD
https://github.com/jollyjinx/modbus-2-mqtt-bridge.git
Running build ...
bash -c docker run --pull=always --rm -v "checkouts-4609320-3":/host -w "$PWD" -e JAVA_HOME="/root/.sdkman/candidates/java/current" -e SPI_BUILD="1" -e SPI_PROCESSING="1" registry.gitlab.com/finestructure/spi-images:android-6.2-latest swift build --swift-sdk aarch64-unknown-linux-android28 2>&1
android-6.2-latest: Pulling from finestructure/spi-images
Digest: sha256:c3fe93b3f7c9edfd66b4287786a9b8caf7805f96d7219e301e257b4e0de911bb
Status: Image is up to date for registry.gitlab.com/finestructure/spi-images:android-6.2-latest
Fetching https://github.com/jollyjinx/JLog
Fetching https://github.com/sroebert/mqtt-nio.git
Fetching https://github.com/apple/swift-argument-parser
Fetching https://github.com/jollyjinx/SwiftLibModbus
[1/1676] Fetching mqtt-nio
[2/1790] Fetching mqtt-nio, jlog
[920/2278] Fetching mqtt-nio, jlog, swiftlibmodbus
[2279/19155] Fetching mqtt-nio, jlog, swiftlibmodbus, swift-argument-parser
Fetched https://github.com/jollyjinx/SwiftLibModbus from cache (0.27s)
Fetched https://github.com/sroebert/mqtt-nio.git from cache (0.27s)
[621/16991] Fetching jlog, swift-argument-parser
Fetched https://github.com/jollyjinx/JLog from cache (1.46s)
Fetched https://github.com/apple/swift-argument-parser from cache (1.51s)
Computing version for https://github.com/jollyjinx/JLog
Computed https://github.com/jollyjinx/JLog at 0.0.9 (1.99s)
Fetching https://github.com/Adorkable/swift-log-format-and-pipe
Fetching https://github.com/apple/swift-log.git
[1/190] Fetching swift-log-format-and-pipe
[191/5866] Fetching swift-log-format-and-pipe, swift-log
Fetched https://github.com/Adorkable/swift-log-format-and-pipe from cache (0.86s)
Fetched https://github.com/apple/swift-log.git from cache (0.85s)
Computing version for https://github.com/apple/swift-argument-parser
Computed https://github.com/apple/swift-argument-parser at 1.6.2 (1.87s)
Computing version for https://github.com/Adorkable/swift-log-format-and-pipe
Computed https://github.com/Adorkable/swift-log-format-and-pipe at 0.1.1 (2.90s)
Computing version for https://github.com/sroebert/mqtt-nio.git
Computed https://github.com/sroebert/mqtt-nio.git at 2.8.1 (0.46s)
Fetching https://github.com/apple/swift-nio-transport-services.git
Fetching https://github.com/apple/swift-nio-ssl.git
Fetching https://github.com/apple/swift-nio.git
[1/15288] Fetching swift-nio-ssl
[2/95889] Fetching swift-nio-ssl, swift-nio
[3/98698] Fetching swift-nio-ssl, swift-nio, swift-nio-transport-services
Fetched https://github.com/apple/swift-nio-transport-services.git from cache (1.47s)
[23849/95889] Fetching swift-nio-ssl, swift-nio
Fetched https://github.com/apple/swift-nio-ssl.git from cache (6.21s)
Fetched https://github.com/apple/swift-nio.git from cache (6.29s)
Computing version for https://github.com/jollyjinx/SwiftLibModbus
Computed https://github.com/jollyjinx/SwiftLibModbus at 2.0.5 (6.61s)
Computing version for https://github.com/apple/swift-log.git
Computed https://github.com/apple/swift-log.git at 1.7.0 (0.36s)
Computing version for https://github.com/apple/swift-nio-transport-services.git
Computed https://github.com/apple/swift-nio-transport-services.git at 1.26.0 (0.34s)
Fetching https://github.com/apple/swift-atomics.git
[1/1820] Fetching swift-atomics
Fetched https://github.com/apple/swift-atomics.git from cache (0.40s)
Computing version for https://github.com/apple/swift-atomics.git
Computed https://github.com/apple/swift-atomics.git at 1.3.0 (0.78s)
Computing version for https://github.com/apple/swift-nio.git
Computed https://github.com/apple/swift-nio.git at 2.91.0 (0.79s)
Fetching https://github.com/apple/swift-system.git
Fetching https://github.com/apple/swift-collections.git
[1/5181] Fetching swift-system
[5182/23506] Fetching swift-system, swift-collections
Fetched https://github.com/apple/swift-system.git from cache (1.18s)
Fetched https://github.com/apple/swift-collections.git from cache (1.21s)
Computing version for https://github.com/apple/swift-system.git
Computed https://github.com/apple/swift-system.git at 1.6.3 (1.72s)
Computing version for https://github.com/apple/swift-collections.git
Computed https://github.com/apple/swift-collections.git at 1.3.0 (0.61s)
Computing version for https://github.com/apple/swift-nio-ssl.git
Computed https://github.com/apple/swift-nio-ssl.git at 2.36.0 (3.54s)
Creating working copy for https://github.com/apple/swift-argument-parser
Working copy of https://github.com/apple/swift-argument-parser resolved at 1.6.2
Creating working copy for https://github.com/apple/swift-atomics.git
Working copy of https://github.com/apple/swift-atomics.git resolved at 1.3.0
Creating working copy for https://github.com/apple/swift-nio-ssl.git
Working copy of https://github.com/apple/swift-nio-ssl.git resolved at 2.36.0
Creating working copy for https://github.com/apple/swift-system.git
Working copy of https://github.com/apple/swift-system.git resolved at 1.6.3
Creating working copy for https://github.com/apple/swift-log.git
Working copy of https://github.com/apple/swift-log.git resolved at 1.7.0
Creating working copy for https://github.com/sroebert/mqtt-nio.git
Working copy of https://github.com/sroebert/mqtt-nio.git resolved at 2.8.1
Creating working copy for https://github.com/apple/swift-nio.git
Working copy of https://github.com/apple/swift-nio.git resolved at 2.91.0
Creating working copy for https://github.com/jollyjinx/SwiftLibModbus
Working copy of https://github.com/jollyjinx/SwiftLibModbus resolved at 2.0.5
Creating working copy for https://github.com/Adorkable/swift-log-format-and-pipe
Working copy of https://github.com/Adorkable/swift-log-format-and-pipe resolved at 0.1.1
Creating working copy for https://github.com/apple/swift-nio-transport-services.git
Working copy of https://github.com/apple/swift-nio-transport-services.git resolved at 1.26.0
Creating working copy for https://github.com/jollyjinx/JLog
Working copy of https://github.com/jollyjinx/JLog resolved at 0.0.9
Creating working copy for https://github.com/apple/swift-collections.git
Working copy of https://github.com/apple/swift-collections.git resolved at 1.3.0
[1/1] Compiling plugin GenerateManual
[2/2] Compiling plugin GenerateDoccReference
Building for debugging...
[2/74] Write sources
[23/74] Compiling CNIOWindows shim.c
[24/74] Copying DeviceDefinitions
[25/74] Compiling CNIOWASI CNIOWASI.c
[25/74] Compiling CNIOWindows WSAStartup.c
[27/74] Compiling _AtomicsShims.c
[28/74] Compiling CNIOPosix event_loop_id.c
[29/74] Compiling CNIOOpenBSD shim.c
[30/74] Compiling CNIOLinux liburing_shims.c
[31/74] Compiling CNIOSHA1 c_nio_sha1.c
[32/74] Compiling CNIODarwin shim.c
[33/74] Compiling CNIOLLHTTP c_nio_http.c
[34/74] Compiling CNIOLinux shim.c
[35/74] Compiling CModbus strlcpy.c
[36/74] Compiling CNIOLLHTTP c_nio_api.c
[37/74] Write swift-version--6B0C4D200E742BB1.txt
[37/74] Compiling CModbus modbus.c
[37/74] Write sources
[42/74] Compiling CModbus modbus-data.c
[43/76] Compiling CModbus modbus-rtu.c
[44/79] Compiling CModbus modbus-tcp.c
[45/119] Compiling CNIOLLHTTP c_nio_llhttp.c
error: emit-module command failed with exit code 1 (use -v to see invocation)
[47/121] Emitting module SwiftLibModbus
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:101:59: error: cannot find 'errno' in scope
99 | }
100 |
101 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
102 | throw ModbusError.couldNotCreateDevice(error: "could not create device:\(errorString) ipAddresses:\(ipAddresses)")
103 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
[47/121] Compiling c-nioatomics.c
[48/123] Compiling c-atomics.c
[50/129] Compiling InternalCollectionsUtilities Debugging.swift
[51/129] Compiling InternalCollectionsUtilities Descriptions.swift
[52/131] Compiling Atomics AtomicInteger.swift
[53/131] Compiling Atomics AtomicOptionalWrappable.swift
[54/131] Compiling Atomics AtomicReference.swift
[55/131] Compiling NIOConcurrencyHelpers NIOLockedValueBox.swift
[56/131] Emitting module Atomics
[57/131] Compiling Atomics AtomicStorage.swift
[58/131] Compiling Atomics AtomicValue.swift
[59/131] Compiling _NIODataStructures Heap.swift
[60/131] Emitting module _NIODataStructures
[61/131] Emitting module InternalCollectionsUtilities
[62/131] Compiling Atomics OptionalRawRepresentable.swift
[63/131] Compiling Atomics RawRepresentable.swift
[64/131] Compiling Atomics AtomicBool.swift
[65/131] Compiling Atomics IntegerConformances.swift
[66/131] Compiling Atomics PointerConformances.swift
[67/131] Compiling Atomics Primitives.native.swift
[79/133] Compiling InternalCollectionsUtilities UnsafeBufferPointer+Extras.swift
[80/133] Compiling InternalCollectionsUtilities UnsafeMutableBufferPointer+Extras.swift
[81/133] Compiling InternalCollectionsUtilities UnsafeMutableRawBufferPointer+Extras.swift
[82/133] Compiling InternalCollectionsUtilities UnsafeRawBufferPointer+Extras.swift
[87/133] Emitting module _NIOBase64
[88/133] Compiling _NIOBase64 Base64.swift
[90/134] Compiling NIOConcurrencyHelpers NIOLock.swift
[91/134] Compiling Atomics IntegerOperations.swift
[92/134] Compiling Atomics Unmanaged extensions.swift
[93/134] Compiling _NIODataStructures PriorityQueue.swift
[94/134] Compiling _NIODataStructures _TinyArray.swift
[97/137] Wrapping AST for _NIOBase64 for debugging
[101/137] Compiling NIOConcurrencyHelpers lock.swift
[101/137] Wrapping AST for _NIODataStructures for debugging
[102/137] Wrapping AST for InternalCollectionsUtilities for debugging
[104/140] Compiling NIOConcurrencyHelpers NIOAtomic.swift
[104/142] Wrapping AST for Atomics for debugging
[106/144] Emitting module NIOConcurrencyHelpers
[107/148] Emitting module ArgumentParserToolInfo
[108/148] Compiling ArgumentParserToolInfo ToolInfo.swift
[109/153] Compiling NIOConcurrencyHelpers atomics.swift
[112/156] Compiling DequeModule _DequeBuffer.swift
[113/156] Compiling DequeModule _DequeBufferHeader.swift
[113/170] Wrapping AST for ArgumentParserToolInfo for debugging
[114/170] Wrapping AST for NIOConcurrencyHelpers for debugging
[116/200] Compiling ArgumentParser Argument.swift
[117/200] Compiling ArgumentParser ArgumentDiscussion.swift
[118/200] Compiling ArgumentParser FishCompletionsGenerator.swift
[119/200] Compiling ArgumentParser ZshCompletionsGenerator.swift
[120/200] Compiling ArgumentParser ArgumentHelp.swift
[121/200] Compiling ArgumentParser ArgumentVisibility.swift
[122/200] Compiling ArgumentParser AsyncParsableCommand.swift
[123/200] Compiling ArgumentParser CommandConfiguration.swift
[124/200] Compiling ArgumentParser CompletionKind.swift
[125/200] Compiling ArgumentParser Errors.swift
[126/200] Compiling ArgumentParser Flag.swift
[127/200] Compiling ArgumentParser NameSpecification.swift
[128/200] Compiling ArgumentParser BashCompletionsGenerator.swift
[129/200] Compiling ArgumentParser CompletionsGenerator.swift
[130/200] Emitting module DequeModule
[131/201] Wrapping AST for DequeModule for debugging
[133/264] Compiling Logging LogHandler.swift
[134/264] Compiling Logging MetadataProvider.swift
[135/264] Compiling Logging Logging.swift
/host/spi-builder-workspace/.build/checkouts/swift-log/Sources/Logging/Logging.swift:1360:36: error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
1358 | let systemStderr = Glibc.stderr!
1359 | #elseif canImport(Android)
1360 | let systemStderr = Android.stderr
| `- error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
1361 | #elseif canImport(Musl)
1362 | let systemStderr = Musl.stderr!
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/stdio.h:64:23: note: var declared here
62 | extern FILE* _Nonnull stdin __INTRODUCED_IN(23);
63 | extern FILE* _Nonnull stdout __INTRODUCED_IN(23);
64 | extern FILE* _Nonnull stderr __INTRODUCED_IN(23);
| `- note: var declared here
65 |
66 | /* C99 and earlier plus current C++ standards say these must be macros. */
/host/spi-builder-workspace/.build/checkouts/swift-log/Sources/Logging/Logging.swift:1380:36: error: reference to var 'stdout' is not concurrency-safe because it involves shared mutable state
1378 | let systemStdout = Glibc.stdout!
1379 | #elseif canImport(Android)
1380 | let systemStdout = Android.stdout
| `- error: reference to var 'stdout' is not concurrency-safe because it involves shared mutable state
1381 | #elseif canImport(Musl)
1382 | let systemStdout = Musl.stdout!
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/stdio.h:63:23: note: var declared here
61 | #if __ANDROID_API__ >= 23
62 | extern FILE* _Nonnull stdin __INTRODUCED_IN(23);
63 | extern FILE* _Nonnull stdout __INTRODUCED_IN(23);
| `- note: var declared here
64 | extern FILE* _Nonnull stderr __INTRODUCED_IN(23);
65 |
error: emit-module command failed with exit code 1 (use -v to see invocation)
[136/264] Compiling Logging Locks.swift
[137/264] Emitting module Logging
/host/spi-builder-workspace/.build/checkouts/swift-log/Sources/Logging/Logging.swift:1360:36: error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
1358 | let systemStderr = Glibc.stderr!
1359 | #elseif canImport(Android)
1360 | let systemStderr = Android.stderr
| `- error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
1361 | #elseif canImport(Musl)
1362 | let systemStderr = Musl.stderr!
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/stdio.h:64:23: note: var declared here
62 | extern FILE* _Nonnull stdin __INTRODUCED_IN(23);
63 | extern FILE* _Nonnull stdout __INTRODUCED_IN(23);
64 | extern FILE* _Nonnull stderr __INTRODUCED_IN(23);
| `- note: var declared here
65 |
66 | /* C99 and earlier plus current C++ standards say these must be macros. */
/host/spi-builder-workspace/.build/checkouts/swift-log/Sources/Logging/Logging.swift:1380:36: error: reference to var 'stdout' is not concurrency-safe because it involves shared mutable state
1378 | let systemStdout = Glibc.stdout!
1379 | #elseif canImport(Android)
1380 | let systemStdout = Android.stdout
| `- error: reference to var 'stdout' is not concurrency-safe because it involves shared mutable state
1381 | #elseif canImport(Musl)
1382 | let systemStdout = Musl.stdout!
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/stdio.h:63:23: note: var declared here
61 | #if __ANDROID_API__ >= 23
62 | extern FILE* _Nonnull stdin __INTRODUCED_IN(23);
63 | extern FILE* _Nonnull stdout __INTRODUCED_IN(23);
| `- note: var declared here
64 | extern FILE* _Nonnull stderr __INTRODUCED_IN(23);
65 |
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:101:59: error: cannot find 'errno' in scope
99 | }
100 |
101 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
102 | throw ModbusError.couldNotCreateDevice(error: "could not create device:\(errorString) ipAddresses:\(ipAddresses)")
103 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:113:67: error: cannot find 'errno' in scope
111 | if modbus_connect(self.modbusdevice) == -1
112 | {
113 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
114 | continuation.resume(throwing: ModbusError.couldNotConnect(error: errorString))
115 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:201:67: error: cannot find 'errno' in scope
199 | else
200 | {
201 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
202 | continuation.resume(throwing: ModbusError.couldNotRead(error: errorString))
203 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:220:67: error: cannot find 'errno' in scope
218 | else
219 | {
220 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
221 | continuation.resume(throwing: ModbusError.couldNotRead(error: errorString))
222 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:243:67: error: cannot find 'errno' in scope
241 | else
242 | {
243 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
244 | continuation.resume(throwing: ModbusError.couldNotRead(error: errorString))
245 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:352:67: error: cannot find 'errno' in scope
350 | else
351 | {
352 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
353 | continuation.resume(throwing: ModbusError.couldNotRead(error: errorString))
354 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
/host/spi-builder-workspace/.build/checkouts/SwiftLibModbus/Sources/SwiftLibModbus/ModbusDevice.swift:379:71: error: cannot find 'errno' in scope
377 | else
378 | {
379 | let errorString = String(cString: modbus_strerror(errno))
| `- error: cannot find 'errno' in scope
380 | throw ModbusError.couldNotRead(error: errorString)
381 | }
/root/.swiftpm/swift-sdks/swift-6.2-RELEASE-android-0.1.artifactbundle/swift-android/ndk-sysroot/usr/include/errno.h:58:9: note: macro 'errno' unavailable: structure not supported
56 | * thread.
57 | */
58 | #define errno (*__errno())
| `- note: macro 'errno' unavailable: structure not supported
59 |
60 | __END_DECLS
BUILD FAILURE 6.2 android