mirror of
https://github.com/protocolbuffers/protobuf
synced 2026-08-26 02:23:14 -04:00
This exception is put at the spot where we will typically first notice that we cannot continue due to being on Lite gencode flows and that sun.misc.Unsafe is unavailable. Add corresponding note on lite.md that it requires sun.misc.Unsafe PiperOrigin-RevId: 919813377
74 lines
2.7 KiB
Markdown
74 lines
2.7 KiB
Markdown
# Protocol Buffers - Google's data interchange format
|
|
|
|
Copyright 2008 Google Inc.
|
|
|
|
## The Protobuf Java Lite Runtime
|
|
|
|
The Protobuf Java Lite runtime is a separate runtime designed to be used on
|
|
mobile clients (especially on Android).
|
|
|
|
Lite runtime should not be used on server-side, as the tradeoffs it makes are
|
|
not suited for that environment. In server contexts, the Full runtime should
|
|
always be used instead.
|
|
|
|
The design goals differ from the Full runtime, focused on small binary size and
|
|
lower peak memory usage. To achieve this it takes a number of trade-offs,
|
|
including:
|
|
|
|
* Offers a subset of features (including no reflection, ProtoJSON or TextProto
|
|
support).
|
|
|
|
* It may have slower runtime performance characteristics.
|
|
|
|
* It may be less hardened against certain issues that could be a concern on
|
|
server-side if they wouldn't be a concern in the context of mobile clients.
|
|
|
|
* In order to achieve maximum performance and code size, we do NOT guarantee
|
|
API/ABI stability for Java Lite.
|
|
|
|
* It relies on `sun.misc.Unsafe` for performance. Since `sun.misc.Unsafe` is
|
|
terminally deprecated on standard JVMs, the Lite runtime **cannot be used**
|
|
in any JVM environment where `sun.misc.Unsafe` is unavailable.
|
|
|
|
If these trade-offs are not acceptable for your use-case, use the full Java
|
|
runtime instead.
|
|
|
|
You can generate Java Lite code for your .proto files:
|
|
|
|
```
|
|
$ protoc --java_out=lite:${OUTPUT_DIR} path/to/your/proto/file
|
|
```
|
|
|
|
Include the generated Java files in your project and add a dependency on the
|
|
protobuf Java Lite runtime. If you are using Maven, include the following:
|
|
|
|
```xml
|
|
<dependency>
|
|
<groupId>com.google.protobuf</groupId>
|
|
<artifactId>protobuf-javalite</artifactId>
|
|
<version><!--version--></version>
|
|
</dependency>
|
|
```
|
|
|
|
And **replace `<!--version-->` with a version from the
|
|
[Maven Protocol Buffers \[Lite\] Repository](https://mvnrepository.com/artifact/com.google.protobuf/protobuf-javalite).**
|
|
For example, `3.25.3`.
|
|
|
|
## R8 rule to make production app builds work
|
|
|
|
The Lite runtime internally uses reflection to avoid generating
|
|
hashCode/equals/parse/serialize methods. R8 by default obfuscates the field
|
|
names, which makes the reflection fail causing exceptions of the form
|
|
`java.lang.RuntimeException: Field {NAME}_ for {CLASS} not found. Known fields
|
|
are [ {FIELDS} ]` in MessageSchema.java.
|
|
|
|
See previous discussion about this on the
|
|
[protobuf Github project](https://github.com/protocolbuffers/protobuf/issues/6463)
|
|
and [R8](https://issuetracker.google.com/issues/144631039).
|
|
|
|
In some cases, you may need to create a `proguard-rules.pro` file to mitigate
|
|
the obfuscation breaking the reflective codepaths, for example:
|
|
|
|
```
|
|
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
|
|
```
|