1. build.gradle(모듈)
plugins {
id 'com.android.application'
id ('com.google.protobuf') version "0.8.17"
}
추가
id ('com.google.protobuf') version "0.8.17"
dependencies {
.....
// Proto Buffer
implementation 'androidx.datastore:datastore:1.0.0'
implementation 'com.google.protobuf:protobuf-javalite:3.19.4'
}
추가
implementation 'androidx.datastore:datastore:1.0.0'
implementation 'com.google.protobuf:protobuf-javalite:3.19.4'
android {
...
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.14.0"
}
// Generates the java Protobuf-lite code for the Protobufs in this project. See
// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
// for more information.
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option 'lite'
}
}
}
}
}
dependencies {
...
}
protobuf 블럭 추가
2. proto 파일 정의
src/main 아래로 가보면 기본적으로
java, res 라는 디렉토리가 존재합니다.
여기에 proto라는 디렉토리를 하나 만들어줍니다
그리고 샘플 proto 파일을 하나 만듭니다.
저는 snowdeer_sample.proto라는 이름으로 만들었습니다.
Android Studio의 ProjectView에서 보기 모드가 Android로 되어 있으면
해당 위치가 제대로 보이지 않기 때문에 Project 등으로 변경해줍시다.
snowdeer_sample.proto
syntax = "proto2";
package com.snowdeer.sample;
option java_package = "com.snowdeer.sample.proto";
option java_outer_classname = "SampleProto";
message User {
required int32 id = 1;
required string name = 2;
optional string address = 3;
enum PhoneType {
UNKNOWN = 0;
MOBILE = 1;
HOME = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = UNKNOWN];
}
repeated PhoneNumber phoneNumbers = 4;
}
message UserList {
repeated User users = 1;
}
빌드
이제 모듈 빌드를 해봅니다. 빌드하고 나면 build/generated/source/... 디렉토리 아래에 위에서 정의한 이름(예제에서는 SampleProto)의 Java 파일이 생성된 것을 확인할 수 있습니다.
이제 Activity에서는 다음과 같이 사용을 해볼 수 있습니다.
즉, 값을 바꾸고 싶거든 또 다른 객체를 생성해야 한다는 이야기이며, Message 클래스는 Builder 클래스의Build() 메소드를 통해서만 생성이 가능하다.
package com.snowdeer.protobufexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.snowdeer.sample.proto.SampleProto.User;
import com.snowdeer.sample.proto.SampleProto.User.PhoneNumber;
import com.snowdeer.sample.proto.SampleProto.User.PhoneType;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PhoneNumber pn = PhoneNumber.newBuilder()
.setType(PhoneType.MOBILE)
.setNumber("010-1111-2222")
.build();
User user = User.newBuilder()
.setId(100)
.setName("snowdeer")
.setAddress("Seoul")
.addPhoneNumbers(pn)
.build();
Log.i("snowdeer", "[snowdeer] user: " + user.toString());
}
}
실행 결과
address: "Seoul"
id: 100
name: "snowdeer"
phone_numbers {
number: "010-1111-2222"
type: MOBILE
}
.proto 파일로부터 발생되는 것은?
.proto 파일에 대해 protocol buffer 컴파일러를 실행시키면, 컴파일러는 여러분이 선택한 언어로 코드를 만들어낸다.
* C++에서는, .pb.h와 .pb.cc 파일이 만들어지는데, 각 message 타입을 위한 클래스들이 있다.
* Java에서는, .java 파일이 만들어지는데, 각 message 타입을 위한 클래스 뿐만 아니라 그 클래스의 인스턴스를 생성해주는 특별한 Builder 클래스도 있다.
* Python은 약간 다르다. Python 컴파일러는 각 message 타입의 정적 descriptor를 가지는 모듈을 만들어내는데, 이것은 런타임시에 필요한 Python 데이터 접근 클래스를 생성하기 위해 메타클래스와 함께 사용된다.
* Go에서는, .pb.go 파일이 만들어지는데, 각 message 타입을 위한 타입을 가지고 있다.
스칼라 값 타입
message 스칼라 필드는 다음 중 하나의 타입을 가진다.
* double
* float
* int32. 변수 길이 인코딩시 사용. 음수에는 비효율적임.
* int64. 변수 길이 인코딩시 사용. 음수에는 비효율적임.
* uint32. 변수 길이 인코딩시 사용.
* uint64. 변수 길이 인코딩시 사용.
* sint32. 변수 길이 인코딩시 사용. 부호있는 값.
* sint64. 변수 길이 인코딩시 사용. 부호있는 값.
* fixed32. 항상 4바이트. 값이 2^28보다 크면 더 효율적임.
* fixed64. 항상 8바이트. 값이 2^56보다 크면 더 효율적임.
* sfixed32. 항상 4바이트.
* sfixed64. 항상 8바이트.
* bool.
* string. 문자열은 항상 UTF-8 인코딩이거나 7비트 ASCII 이어야 함.
* bytes. 임의의 바이트 배열을 포함할 수 있음.
https://developers.google.com/protocol-buffers/docs/proto3
https://developer.android.com/codelabs/android-proto-datastore?hl=ko#4
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=seban21&logNo=70153343429
https://developers.google.com/protocol-buffers/docs/javatutorial#writing-a-message
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=oidoman&logNo=220773055827
사용 방법 관련 참고
https://jeong-pro.tistory.com/190
'개인 공부' 카테고리의 다른 글
Protocol Buffer 사용2 (0) | 2022.12.22 |
---|---|
Protocol Buffer 사용 (0) | 2022.12.22 |
네트워크 - 버퍼, 버퍼링, 캡슐화 ,큐 (0) | 2022.12.20 |
네트워크 - 채널, 터널링 (0) | 2022.12.20 |
네트워크 - PDU , MTU (0) | 2022.12.20 |