Skip to main content
Version: dev

Android Support

Android Runtime

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:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.apache.fory</groupId>
<artifactId>fory-annotation-processor</artifactId>
<version>${fory.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>

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:

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 for setup instructions.

Object Model Requirements

Android serializers use public Android runtime capabilities. 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.