Protobuf 사용하는 예제
09 Apr 2019 | AndroidAndroid에서 Protobuf를 사용하는 방법입니다.
build.gradle(프로젝트)
먼저 프로젝트의 build.gradle
에 다음과 같은 세팅을 합니다.
buildscript { ext.protobufVersion = '0.8.6' dependencies { classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufVersion" } }
build.gradle(모듈)
먼저 플러그인(plugin) 선언을 합니다.
apply plugin: 'com.google.protobuf'
그리고 build.gradle
파일 가장 아래쪽에 다음과 같은 코드를 입력합니다.
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.builtins { remove java } task.plugins { javalite {} } } } }
그리고 아래 항목도 추가합니다.
dependencies { implementation 'com.google.protobuf:protobuf-lite:3.0.0' }
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에서는 다음과 같이 사용을 해볼 수 있습니다.
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 }