---
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.