--- title: Android sidebar_position: 14 id: android license: | Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --- ## Android Support Fory Java supports Android 8.0+ (API level 26+) through the regular `fory-core` artifact. No separate Android artifact is required for core object serialization. Use core object serialization on Android: - `Fory#serialize(Object)` and `Fory#deserialize(byte[])`. - `BaseFory#deserialize(ByteBuffer)` for heap, direct, and read-only `ByteBuffer` inputs. - Stream, channel, and out-of-band buffer APIs through byte-array, heap-buffer, or `ByteBuffer` copy paths. - Java collections/maps and xlang collections/maps. `java/fory-format` row-format APIs are JVM-only and are not supported on Android. ## Runtime Codegen Runtime serializer code generation is disabled on Android. If `withCodegen(true)` is set, Fory keeps Android serialization on the non-codegen path and logs a warning. Android apps that need generated serializers should use build-time static generated serializers instead. ## Static Generated Serializers Use `@ForyStruct` static generated serializers for Android application classes. They are generated by javac during the app build and work without runtime bytecode generation. ### Install The Annotation Processor Add `fory-annotation-processor` to the annotation processor path of the module that compiles your Android model classes: ```xml org.apache.maven.plugins maven-compiler-plugin org.apache.fory fory-annotation-processor ${fory.version} ``` Then annotate Android model classes with `@ForyStruct`. Static generated serializers are required on Android when a serialized class uses Fory type-use annotations, for example: ```java import java.util.List; import org.apache.fory.annotation.ForyStruct; import org.apache.fory.annotation.UInt8Type; @ForyStruct public class ImageBlock { public List<@UInt8Type Integer> pixels; } ``` Without the generated static descriptors, Android reflection may not expose the nested type-use metadata needed for annotations such as `@Ref`, `@Int8Type`, `@UInt8Type`, `@Float16Type`, or `@BFloat16Type`. Serialization for those classes will not have the schema information Fory needs. See [Static Generated Serializers](static-generated-serializers.md) for setup instructions. ## Object Model Requirements Android serializers use public Android APIs. For application classes, prefer: - accessible no-argument constructors, or records with supported constructors. - public, protected, or package-private serialized fields. - non-private getters and setters for private serialized fields. - `@ForyStruct` static generated serializers for Android model classes. Final fields in ordinary classes are not suitable for generated read/copy methods. Use records for constructor-based immutable values. ## Unsupported Features The following JVM features are not supported on Android: - Runtime serializer code generation and async compilation. - Lambda and `SerializedLambda` serialization. - Native-address serialization APIs and native-address `MemoryBuffer` wrapping. - Raw unsafe memory copy APIs. - `java/fory-format` row-format APIs. ## ByteBuffer `BaseFory#deserialize(ByteBuffer)` supports heap, direct, and read-only buffers on Android by copying the remaining bytes into a Fory-owned heap buffer. The caller buffer position and limit are not changed. Raw direct-buffer address wrapping is a JVM-only fast path and is not used on Android. ## Collections, Maps, And Proxies Common JDK collection and map implementations are supported on Android. In xlang mode, collection and map serialization uses the xlang protocol and does not encode Java wrapper/view internals. `java.lang.reflect.Proxy` serialization is supported for normal proxy usage. Do not invoke, log, or use a proxy as a map/set key while it is still being deserialized; the invocation handler may not be ready yet. ## Kotlin on Android Apache Fory Kotlin supports Kotlin/JVM and Android. Android support is built on the existing Fory Java implementation plus Kotlin serializers from `fory-kotlin`. Kotlin schema serializers are generated by `fory-kotlin-ksp` at build time. Use this page for Android setup and release-build constraints. Use [Static Generated Serializers](static-generated-serializers.md) for the Kotlin KSP serializer model itself. If your Android project also contains Java `@ForyStruct` classes, use the Java annotation processor documented in [Java Static Generated Serializers](../java/static-generated-serializers.md). ## Dependencies Add `fory-kotlin` to the Android module that uses Fory. Add `fory-kotlin-ksp` to the module that compiles Kotlin `@ForyStruct` model classes. ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("com.google.devtools.ksp") } dependencies { implementation("org.apache.fory:fory-kotlin:") ksp("org.apache.fory:fory-kotlin-ksp:") } ``` For Android library modules, apply KSP in the library module that owns the annotated Kotlin classes. The generated serializers and generated consumer R8 rules must be packaged with that library artifact. ## Fory Setup Create the Fory instance with `ForyKotlin.builder().withXlang(true)`, then register application classes through the Kotlin `register` extension or the normal Fory Java registration APIs. ```kotlin import org.apache.fory.kotlin.ForyKotlin import org.apache.fory.kotlin.register val fory = ForyKotlin.builder() .withXlang(true) .requireClassRegistration(true) .build() fory.register("example.User") ``` Do not reference generated serializer classes from application code. Fory resolves generated serializers from the registered target class. ## Xlang Schema Mode Android Kotlin structs that participate in Fory cross-language schema serialization should use KSP generated serializers. Generated serializers avoid using runtime reflection as the source of Kotlin schema metadata and call the same Fory Java serializer infrastructure used by other generated serializers. Kotlin KSP generated serializers are xlang/schema serializers only. They do not replace Java native object serializers and do not preserve concrete JVM collection implementation identity. For example, a Kotlin `List` field is schema `list`; deserialization only guarantees a value assignable to the declared field type. ## Minified Release Builds Validate Fory Android behavior with a minified release build. Debug builds do not prove that generated serializers, generated constructor entry points, or Kotlin metadata survive R8. KSP emits generated consumer R8/ProGuard rules under `META-INF/proguard/` for the generated serializer constructors and Kotlin metadata required by Fory. Android apps should not need broad user-written keep rules for generated Kotlin serializers. If a custom packaging setup drops generated `META-INF/proguard/` resources, fix that packaging path instead of adding broad keep rules for every generated serializer. The Apache Fory repository validates this path with `integration_tests/android_tests`, including release-minified instrumented tests. ## Java Models In Android Apps Kotlin KSP only processes Kotlin source. If your Android app contains Java classes annotated with `@ForyStruct`, configure the Java `fory-annotation-processor` for those Java sources. Static generated Java serializers are also important on Android when Java model classes use Fory type-use annotations on nested types, such as `List<@UInt8Type Integer>`. See [Java Static Generated Serializers](../java/static-generated-serializers.md) for that path. ## Unsupported Targets `fory-kotlin` and `fory-kotlin-ksp` target Kotlin/JVM and Android only. Kotlin/Native and Kotlin/JS are not supported.