OLD | NEW |
| (Empty) |
1 Protocol Buffers - Google's data interchange format | |
2 =================================================== | |
3 | |
4 [](https
://travis-ci.org/google/protobuf) | |
5 | |
6 Copyright 2008 Google Inc. | |
7 | |
8 This directory contains the Java Protocol Buffers Nano runtime library. | |
9 | |
10 Installation - With Maven | |
11 ------------------------- | |
12 | |
13 The Protocol Buffers build is managed using Maven. If you would | |
14 rather build without Maven, see below. | |
15 | |
16 1) Install Apache Maven if you don't have it: | |
17 | |
18 http://maven.apache.org/ | |
19 | |
20 2) Build the C++ code, or obtain a binary distribution of protoc. If | |
21 you install a binary distribution, make sure that it is the same | |
22 version as this package. If in doubt, run: | |
23 | |
24 $ protoc --version | |
25 | |
26 You will need to place the protoc executable in ../src. (If you | |
27 built it yourself, it should already be there.) | |
28 | |
29 3) Run the tests: | |
30 | |
31 $ mvn test | |
32 | |
33 If some tests fail, this library may not work correctly on your | |
34 system. Continue at your own risk. | |
35 | |
36 4) Install the library into your Maven repository: | |
37 | |
38 $ mvn install | |
39 | |
40 5) If you do not use Maven to manage your own build, you can build a | |
41 .jar file to use: | |
42 | |
43 $ mvn package | |
44 | |
45 The .jar will be placed in the "target" directory. | |
46 | |
47 Installation - Without Maven | |
48 ---------------------------- | |
49 | |
50 If you would rather not install Maven to build the library, you may | |
51 follow these instructions instead. Note that these instructions skip | |
52 running unit tests. | |
53 | |
54 1) Build the C++ code, or obtain a binary distribution of protoc. If | |
55 you install a binary distribution, make sure that it is the same | |
56 version as this package. If in doubt, run: | |
57 | |
58 $ protoc --version | |
59 | |
60 If you built the C++ code without installing, the compiler binary | |
61 should be located in ../src. | |
62 | |
63 2) Invoke protoc to build DescriptorProtos.java: | |
64 | |
65 $ protoc --java_out=src/main/java -I../src \ | |
66 ../src/google/protobuf/descriptor.proto | |
67 | |
68 3) Compile the code in src/main/java using whatever means you prefer. | |
69 | |
70 4) Install the classes wherever you prefer. | |
71 | |
72 Nano version | |
73 ------------ | |
74 | |
75 JavaNano is a special code generator and runtime library designed specially for | |
76 resource-restricted systems, like Android. It is very resource-friendly in both | |
77 the amount of code and the runtime overhead. Here is an overview of JavaNano | |
78 features compared with the official Java protobuf: | |
79 | |
80 - No descriptors or message builders. | |
81 - All messages are mutable; fields are public Java fields. | |
82 - For optional fields only, encapsulation behind setter/getter/hazzer/ | |
83 clearer functions is opt-in, which provide proper 'has' state support. | |
84 - For proto2, if not opted in, has state (field presence) is not available. | |
85 Serialization outputs all fields not equal to their defaults | |
86 (see important implications below). | |
87 The behavior is consistent with proto3 semantics. | |
88 - Required fields (proto2 only) are always serialized. | |
89 - Enum constants are integers; protection against invalid values only | |
90 when parsing from the wire. | |
91 - Enum constants can be generated into container interfaces bearing | |
92 the enum's name (so the referencing code is in Java style). | |
93 - CodedInputByteBufferNano can only take byte[] (not InputStream). | |
94 - Similarly CodedOutputByteBufferNano can only write to byte[]. | |
95 - Repeated fields are in arrays, not ArrayList or Vector. Null array | |
96 elements are allowed and silently ignored. | |
97 - Full support for serializing/deserializing repeated packed fields. | |
98 - Support extensions (in proto2). | |
99 - Unset messages/groups are null, not an immutable empty default | |
100 instance. | |
101 - toByteArray(...) and mergeFrom(...) are now static functions of | |
102 MessageNano. | |
103 - The 'bytes' type translates to the Java type byte[]. | |
104 | |
105 The generated messages are not thread-safe for writes, but may be | |
106 used simultaneously from multiple threads in a read-only manner. | |
107 In other words, an appropriate synchronization mechanism (such as | |
108 a ReadWriteLock) must be used to ensure that a message, its | |
109 ancestors, and descendants are not accessed by any other threads | |
110 while the message is being modified. Field reads, getter methods | |
111 (but not getExtension(...)), toByteArray(...), writeTo(...), | |
112 getCachedSize(), and getSerializedSize() are all considered read-only | |
113 operations. | |
114 | |
115 IMPORTANT: If you have fields with defaults and opt out of accessors | |
116 | |
117 How fields with defaults are serialized has changed. Because we don't | |
118 keep "has" state, any field equal to its default is assumed to be not | |
119 set and therefore is not serialized. Consider the situation where we | |
120 change the default value of a field. Senders compiled against an older | |
121 version of the proto continue to match against the old default, and | |
122 don't send values to the receiver even though the receiver assumes the | |
123 new default value. Therefore, think carefully about the implications | |
124 of changing the default value. Alternatively, turn on accessors and | |
125 enjoy the benefit of the explicit has() checks. | |
126 | |
127 IMPORTANT: If you have "bytes" fields with non-empty defaults | |
128 | |
129 Because the byte buffer is now of mutable type byte[], the default | |
130 static final cannot be exposed through a public field. Each time a | |
131 message's constructor or clear() function is called, the default value | |
132 (kept in a private byte[]) is cloned. This causes a small memory | |
133 penalty. This is not a problem if the field has no default or is an | |
134 empty default. | |
135 | |
136 Nano Generator options | |
137 ---------------------- | |
138 | |
139 ``` | |
140 java_package -> <file-name>|<package-name> | |
141 java_outer_classname -> <file-name>|<package-name> | |
142 java_multiple_files -> true or false | |
143 java_nano_generate_has -> true or false [DEPRECATED] | |
144 optional_field_style -> default or accessors | |
145 enum_style -> c or java | |
146 ignore_services -> true or false | |
147 parcelable_messages -> true or false | |
148 generate_intdefs -> true or false | |
149 ``` | |
150 | |
151 **java_package=\<file-name\>|\<package-name\>** (no default) | |
152 | |
153 This allows overriding the 'java_package' option value | |
154 for the given file from the command line. Use multiple | |
155 java_package options to override the option for multiple | |
156 files. The final Java package for each file is the value | |
157 of this command line option if present, or the value of | |
158 the same option defined in the file if present, or the | |
159 proto package if present, or the default Java package. | |
160 | |
161 **java_outer_classname=\<file-name\>|\<outer-classname\>** (no default) | |
162 | |
163 This allows overriding the 'java_outer_classname' option | |
164 for the given file from the command line. Use multiple | |
165 java_outer_classname options to override the option for | |
166 multiple files. The final Java outer class name for each | |
167 file is the value of this command line option if present, | |
168 or the value of the same option defined in the file if | |
169 present, or the file name converted to CamelCase. This | |
170 outer class will nest all classes and integer constants | |
171 generated from file-scope messages and enums. | |
172 | |
173 **java_multiple_files={true,false}** (no default) | |
174 | |
175 This allows overriding the 'java_multiple_files' option | |
176 in all source files and their imported files from the | |
177 command line. The final value of this option for each | |
178 file is the value defined in this command line option, or | |
179 the value of the same option defined in the file if | |
180 present, or false. This specifies whether to generate | |
181 package-level classes for the file-scope messages in the | |
182 same Java package as the outer class (instead of nested | |
183 classes in the outer class). File-scope enum constants | |
184 are still generated as integer constants in the outer | |
185 class. This affects the fully qualified references in the | |
186 Java code. NOTE: because the command line option | |
187 overrides the value for all files and their imported | |
188 files, using this option inconsistently may result in | |
189 incorrect references to the imported messages and enum | |
190 constants. | |
191 | |
192 **java_nano_generate_has={true,false}** (default: false) | |
193 | |
194 DEPRECATED. Use optional_field_style=accessors. | |
195 | |
196 If true, generates a public boolean variable has\<fieldname\> | |
197 accompanying each optional or required field (not present for | |
198 repeated fields, groups or messages). It is set to false initially | |
199 and upon clear(). If parseFrom(...) reads the field from the wire, | |
200 it is set to true. This is a way for clients to inspect the "has" | |
201 value upon parse. If it is set to true, writeTo(...) will ALWAYS | |
202 output that field (even if field value is equal to its | |
203 default). | |
204 | |
205 IMPORTANT: This option costs an extra 4 bytes per primitive field in | |
206 the message. Think carefully about whether you really need this. In | |
207 many cases reading the default works and determining whether the | |
208 field was received over the wire is irrelevant. | |
209 | |
210 **optional_field_style={default,accessors,reftypes}** (default: default) | |
211 | |
212 Defines the style of the generated code for fields. | |
213 | |
214 * default | |
215 | |
216 In the default style, optional fields translate into public mutable | |
217 Java fields, and the serialization process is as discussed in the | |
218 "IMPORTANT" section above. | |
219 | |
220 * accessors | |
221 | |
222 When set to 'accessors', each optional field is encapsulated behind | |
223 4 accessors, namely get\<fieldname\>(), set\<fieldname\>(), has\<fieldname\>() | |
224 and clear\<fieldname\>() methods, with the standard semantics. The hazzer's | |
225 return value determines whether a field is serialized, so this style is | |
226 useful when you need to serialize a field with the default value, or check | |
227 if a field has been explicitly set to its default value from the wire. | |
228 | |
229 In the 'accessors' style, required and nested message fields are still | |
230 translated to one public mutable Java field each, repeated fields are still | |
231 translated to arrays. No accessors are generated for them. | |
232 | |
233 IMPORTANT: When using the 'accessors' style, ProGuard should always | |
234 be enabled with optimization (don't use -dontoptimize) and allowing | |
235 access modification (use -allowaccessmodification). This removes the | |
236 unused accessors and maybe inline the rest at the call sites, | |
237 reducing the final code size. | |
238 TODO(maxtroy): find ProGuard config that would work the best. | |
239 | |
240 * reftypes | |
241 | |
242 When set to 'reftypes', each proto field is generated as a public Java | |
243 field. For primitive types, these fields use the Java reference types | |
244 such as java.lang.Integer instead of primitive types such as int. | |
245 | |
246 In the 'reftypes' style, fields are initialized to null (or empty | |
247 arrays for repeated fields), and their default values are not available. | |
248 They are serialized over the wire based on equality to null. | |
249 | |
250 The 'reftypes' mode has some additional cost due to autoboxing and usage | |
251 of reference types. In practice, many boxed types are cached, and so don't | |
252 result in object creation. However, references do take slightly more memory | |
253 than primitives. | |
254 | |
255 The 'reftypes' mode is useful when you want to be able to serialize fields | |
256 with default values, or check if a field has been explicitly set to the | |
257 default over the wire without paying the extra method cost of the | |
258 'accessors' mode. | |
259 | |
260 Note that if you attempt to write null to a required field in the reftypes | |
261 mode, serialization of the proto will cause a NullPointerException. This is | |
262 an intentional indicator that you must set required fields. | |
263 | |
264 NOTE | |
265 optional_field_style=accessors or reftypes cannot be used together with | |
266 java_nano_generate_has=true. If you need the 'has' flag for any | |
267 required field (you have no reason to), you can only use | |
268 java_nano_generate_has=true. | |
269 | |
270 **enum_style={c,java}** (default: c) | |
271 | |
272 Defines where to put the int constants generated from enum members. | |
273 | |
274 * c | |
275 | |
276 Use C-style, so the enum constants are available at the scope where | |
277 the enum is defined. A file-scope enum's members are referenced like | |
278 'FileOuterClass.ENUM_VALUE'; a message-scope enum's members are | |
279 referenced as 'Message.ENUM_VALUE'. The enum name is unavailable. | |
280 This complies with the Micro code generator's behavior. | |
281 | |
282 * java | |
283 | |
284 Use Java-style, so the enum constants are available under the enum | |
285 name and referenced like 'EnumName.ENUM_VALUE' (they are still int | |
286 constants). The enum name becomes the name of a public interface, at | |
287 the scope where the enum is defined. If the enum is file-scope and | |
288 the java_multiple_files option is on, the interface will be defined | |
289 in its own file. To reduce code size, this interface should not be | |
290 implemented and ProGuard shrinking should be used, so after the Java | |
291 compiler inlines all referenced enum constants into the call sites, | |
292 the interface remains unused and can be removed by ProGuard. | |
293 | |
294 **ignore_services={true,false}** (default: false) | |
295 | |
296 Skips services definitions. | |
297 | |
298 Nano doesn't support services. By default, if a service is defined | |
299 it will generate a compilation error. If this flag is set to true, | |
300 services will be silently ignored, instead. | |
301 | |
302 **parcelable_messages={true,false}** (default: false) | |
303 | |
304 Android-specific option to generate Parcelable messages. | |
305 | |
306 **generate_intdefs={true,false}** (default: false) | |
307 Android-specific option to generate @IntDef annotations for enums. | |
308 | |
309 If turned on, an '@IntDef' annotation (a public @interface) will be | |
310 generated for each enum, and every integer parameter and return | |
311 value in the generated code meant for this enum will be annotated | |
312 with it. This interface is generated with the same name and at the | |
313 same place as the enum members' container interfaces described | |
314 above under 'enum_style=java', regardless of the enum_style option | |
315 used. When this is combined with enum_style=java, the interface | |
316 will be both the '@IntDef' annotation and the container of the enum | |
317 members; otherwise the interface has an empty body. | |
318 | |
319 Your app must declare a compile-time dependency on the | |
320 android-support-annotations library. | |
321 | |
322 For more information on how these @IntDef annotations help with | |
323 compile-time type safety, see: | |
324 https://sites.google.com/a/android.com/tools/tech-docs/support-annotations | |
325 and | |
326 https://developer.android.com/reference/android/support/annotation/IntDef.html | |
327 | |
328 | |
329 To use nano protobufs within the Android repo: | |
330 ---------------------------------------------- | |
331 | |
332 - Set 'LOCAL_PROTOC_OPTIMIZE_TYPE := nano' in your local .mk file. | |
333 When building a Java library or an app (package) target, the build | |
334 system will add the Java nano runtime library to the | |
335 LOCAL_STATIC_JAVA_LIBRARIES variable, so you don't need to. | |
336 - Set 'LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...' in your local .mk file | |
337 for any command-line options you need. Use commas to join multiple | |
338 options. In the nano flavor only, whitespace surrounding the option | |
339 names and values are ignored, so you can use backslash-newline or | |
340 '+=' to structure your make files nicely. | |
341 - The options will be applied to *all* proto files in LOCAL_SRC_FILES | |
342 when you build a Java library or package. In case different options | |
343 are needed for different proto files, build separate Java libraries | |
344 and reference them in your main target. Note: you should make sure | |
345 that, for each separate target, all proto files imported from any | |
346 proto file in LOCAL_SRC_FILES are included in LOCAL_SRC_FILES. This | |
347 is because the generator has to assume that the imported files are | |
348 built using the same options, and will generate code that reference | |
349 the fields and enums from the imported files using the same code | |
350 style. | |
351 - Hint: 'include $(CLEAR_VARS)' resets all LOCAL_ variables, including | |
352 the two above. | |
353 | |
354 To use nano protobufs outside of Android repo: | |
355 ---------------------------------------------- | |
356 | |
357 - Link with the generated jar file | |
358 \<protobuf-root\>java/target/protobuf-java-2.3.0-nano.jar. | |
359 - Invoke with --javanano_out, e.g.: | |
360 ``` | |
361 ./protoc '--javanano_out=\ | |
362 java_package=src/proto/simple-data.proto|my_package,\ | |
363 java_outer_classname=src/proto/simple-data.proto|OuterName\ | |
364 :.' src/proto/simple-data.proto | |
365 ``` | |
366 | |
367 Contributing to nano: | |
368 --------------------- | |
369 | |
370 Please add/edit tests in NanoTest.java. | |
371 | |
372 Please run the following steps to test: | |
373 | |
374 - cd external/protobuf | |
375 - ./configure | |
376 - Run "make -j12 check" and verify all tests pass. | |
377 - cd java | |
378 - Run "mvn test" and verify all tests pass. | |
379 - cd ../../.. | |
380 - . build/envsetup.sh | |
381 - lunch 1 | |
382 - "make -j12 aprotoc libprotobuf-java-2.3.0-nano aprotoc-test-nano-params NanoAn
droidTest" and | |
383 check for build errors. | |
384 - Plug in an Android device or start an emulator. | |
385 - adb install -r out/target/product/generic/data/app/NanoAndroidTest.apk | |
386 - Run: | |
387 "adb shell am instrument -w com.google.protobuf.nano.test/android.test.Instrum
entationTestRunner" | |
388 and verify all tests pass. | |
389 - repo sync -c -j256 | |
390 - "make -j12" and check for build errors | |
391 | |
392 Usage | |
393 ----- | |
394 | |
395 The complete documentation for Protocol Buffers is available via the | |
396 web at: | |
397 | |
398 https://developers.google.com/protocol-buffers/ | |
OLD | NEW |