Android实现protobuf客户端

以下操作均在androidStudio下进行

1. 在项目根目录build.gradle下面添加protobuf-gradle-plugin插件

Android实现protobuf客户端_第1张图片

classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

2. 在Module下 的build.gradle添加以下配置

apply plugin: 'com.google.protobuf'
protobuf {
    //配置protoc编译器
    protoc {
        artifact = 'com.google.protobuf:protoc:3.5.1'
    }
    //这里配置生成目录,编译后会在build的目录下生成对应的java文件
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
            }
        }
    }
}

在android 块里添加如下代码

  sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            proto {
                srcDir 'src/main/proto'
            }
        }
    }

在dependencies块里添加依赖

    // 定义protobuf依赖,使用精简版
    implementation 'com.google.protobuf:protobuf-java:3.10.0'
    implementation 'com.google.protobuf:protoc:3.5.1'
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'

3. 配置.proto文件和java代码生成

在项目main文件夹下新建proto文件夹(与java同级)
把我们原先定义好的.protobuf文件拿过来。新增一行包路径
Android实现protobuf客户端_第2张图片
我们build一下项目,就可以看到在/build/generated/source下会根据.proto文件生成对应的java代码
Android实现protobuf客户端_第3张图片

4. 编写请求demo

    public static void testProto() {

        ProtobufHandle.Request req = ProtobufHandle.Request.newBuilder().setCateId("1").setPage(1).setPageSize(10).build();

        RequestBody requestBody = FormBody.create(MediaType.get("application/x-protobuf"), req.toByteArray());
        Request build = new Request.Builder().url("http://192.168.31.130:8899/protobuf").post(requestBody).build();


        Call call = new OkHttpClient().newCall(build);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("xiwang", "粗错了");
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.body() == null){
                    return;
                }
                ProtobufHandle.Response resp = ProtobufHandle.Response.parseFrom(response.body().bytes());
                for (int i = 0; i < resp.getDataListList().size(); i++) {
                    ProtobufHandle.Response.data t = resp.getDataList(i);
                    Log.i("xiwang", t.getId()+t.getTitle());
                }
            }
        });
    }

5. 在AndroidManifest.xml中添加网络权限

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

6. 测试效果

Android手机端收到响应:
在这里插入图片描述
Server端收到请求:
Android实现protobuf客户端_第4张图片

你可能感兴趣的:(逆向)