简要说明网站建设的步骤,阿里云做电影网站吗,企业建设网站的价值,骨干校建设验收网站本篇文章使用的IDE是Android Studio。这里先吐槽一句#xff0c;安卓项目搭建grpc环境#xff0c;不管是引入插件还是引入第三方库#xff0c;对于版本的要求都极为苛刻#xff0c;一旦版本不匹配就会报错#xff0c;所以对于版本的搭配一定要注意。
下面介绍的这个版本搭…本篇文章使用的IDE是Android Studio。这里先吐槽一句安卓项目搭建grpc环境不管是引入插件还是引入第三方库对于版本的要求都极为苛刻一旦版本不匹配就会报错所以对于版本的搭配一定要注意。
下面介绍的这个版本搭配是我研究好久好久才跑通的这在我的电脑上是一组可行的配置如果你使用了同样的配置跑不通那可能是环境中某一部分还是有不同的地方需要你自己再去找一下解决问题的办法那么话不多说直接上配置吧。
各种配置文件
首先我们需要设置三个配置文件如下图所示 我们先来看一下项目设置setting.gradle按照我的理解这里应该是设置一些gradle仓库地址还有项目中包含的模块等等信息。
我的配置是这样写的
pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()maven { url https://jitpack.io }maven { url https://repo.eclipse.org/content/repositories/paho-releases/}}
}
rootProject.name grpc_project_plus
include :app接着是项目的的build.gradle这里面需要引入一些插件和进行gradle版本设置其中gradle版本设置也是一个坑版本号要设置对才行
buildscript {repositories {maven{ url https://maven.aliyun.com/repository/jcenter}maven { url https://maven.aliyun.com/repository/google }maven { url https://maven.aliyun.com/repository/gradle-plugin }maven { url https://maven.aliyun.com/repository/public }google()mavenCentral()}dependencies {classpath com.android.tools.build:gradle:7.2.0classpath com.google.protobuf:protobuf-gradle-plugin:0.8.17}
}task clean(type: Delete) {delete rootProject.buildDir
}
从上面的配置中我们可以看出我们使用的gradle插件的版本是7.2.0然后配置的gradle版本是7.4具体的设置方法就是到gradle的配置文件中指定 当然也有一个简单的办法就是到project structure中去指定 上面这张图按照我的理解上面是插件的版本号下面就是gradle的版本号这两个不对应的话容易出问题这里顺便说一下我的Android Studio的版本应该是2021.3.1就是海豚的图标。经过这次的环境搭建我现在对于版本号真的非常敏感调版本号真的太折磨人了 最后就是模块的build.gradle我找到的一个能跑通demo的设置如下
plugins {id com.android.applicationid com.google.protobuf
}android {namespace com.example.grpc_project_pluscompileSdk 32defaultConfig {applicationId com.example.grpc_project_plusminSdk 29targetSdk 32versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}configurations.all {resolutionStrategy.force com.google.code.findbugs:jsr305:3.0.1exclude group: com.google.guava, module: listenablefuture}sourceSets {main {proto {srcDir src/main/proto}}}packagingOptions {pickFirst META-INF/INDEX.LISTpickFirst META-INF/LICENSEpickFirst META-INF/io.netty.versions.properties}
}protobuf {protoc {artifact com.google.protobuf:protoc:3.17.2}plugins {/*javalite {artifact com.google.protobuf:protoc-gen-javalite:3.0.0}*/grpc {artifact io.grpc:protoc-gen-grpc-java:1.39.0 // CURRENT_GRPC_VERSION}}generateProtoTasks {all().each { task -task.builtins {java { option lite }}task.plugins {grpc { // Options added to --grpc_outoption lite }}}}
}dependencies {implementation androidx.appcompat:appcompat:1.4.1implementation com.google.android.material:material:1.5.0implementation androidx.constraintlayout:constraintlayout:2.1.3testImplementation junit:junit:4.13.2androidTestImplementation androidx.test.ext:junit:1.1.3androidTestImplementation androidx.test.espresso:espresso-core:3.4.0/*implementation io.grpc:grpc-okhttp:1.1.2implementation io.grpc:grpc-netty:1.1.2implementation io.grpc:grpc-protobuf-lite:1.1.2implementation io.grpc:grpc-stub:1.1.2implementation javax.annotation:javax.annotation-api:1.2*/// You need to build grpc-java to obtain these libraries below.implementation io.grpc:grpc-netty:1.39.0implementation io.grpc:grpc-okhttp:1.39.0 // CURRENT_GRPC_VERSIONimplementation io.grpc:grpc-protobuf-lite:1.39.0 // CURRENT_GRPC_VERSIONimplementation io.grpc:grpc-stub:1.39.0 // CURRENT_GRPC_VERSIONimplementation org.apache.tomcat:annotations-api:6.0.53
}
编写proto文件并编译
配置好了上述环境后我们需要编译proto文件。
首先在main目录下新建一个文件夹proto然后编写hello.proto文件。 文件的内容如下
syntax proto3;option java_multiple_files true;
option java_package io.grpc.examples.helloworld;
option java_outer_classname HelloWorldProto;
option objc_class_prefix HLW;package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the users name.
message HelloRequest {string name 1;
}// The response message containing the greetings
message HelloReply {string message 1;
}
这是一个简单的grpc接口调用具体的语法我就不说了这篇文章主要是讲环境搭建。
接着编译项目如果编译成功的话可以在build文件夹中看到grpc相关的java文件。 编写简单的demo代码
这是最后一步在主Activity中编写简单的客户端和服务端代码测试grpc服务是否可以正常使用。
public class MainActivity extends AppCompatActivity {private static final String TAG GrpcDemo;private static final int PROT 56322;private static final String NAME hello world;private static final String HOST localhost;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, start);startServer(PROT);Log.d(TAG, start server.);startClient(HOST, PROT, NAME);Log.d(TAG, start client.);}private void startServer(int port){try {NettyServerBuilder.forPort(port).addService(new GreeterImpl()).build().start();} catch (IOException e) {e.printStackTrace();Log.d(TAG, e.getMessage());}}private void startClient(String host, int port, String name){ManagedChannel mChannel ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();GreeterGrpc.GreeterStub stub GreeterGrpc.newStub(mChannel);HelloRequest message HelloRequest.newBuilder().setName(name).build();stub.sayHello(message, new StreamObserverHelloReply() {Overridepublic void onNext(HelloReply value) {//Log.d(TAG, sayHello onNext.);Log.d(TAG, value.getMessage());}Overridepublic void onError(Throwable t) {Log.d(TAG, sayHello onError.);}Overridepublic void onCompleted() {Log.d(TAG, sayHello onCompleted.);}});}private class GreeterImpl extends GreeterGrpc.GreeterImplBase {public void sayHello(HelloRequest request, StreamObserverHelloReply responseObserver) {responseObserver.onNext(sayHello(request));responseObserver.onCompleted();}private HelloReply sayHello(HelloRequest request) {return HelloReply.newBuilder().setMessage(request.getName()).build();}}}
然后需要在AndroidManifest.xml文件中添加网络权限
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsuses-permission android:nameandroid.permission.INTERNET/applicationandroid:allowBackuptrueandroid:dataExtractionRulesxml/data_extraction_rulesandroid:fullBackupContentxml/backup_rulesandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/Theme.Grpc_project_plustools:targetApi31activityandroid:name.MainActivityandroid:exportedtrueintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filtermeta-dataandroid:nameandroid.app.lib_nameandroid:value //activity/application/manifest
运行上述代码如果能在控制台看到下面的这句话就说明环境搭建成功了。 结语
这次的环境搭建真的非常艰难前前后后遇到了各种问题。不得不说安卓编程对于版本太敏感了只要有一个版本没有对应上项目都可能跑不通。
如果你遇到了什么问题欢迎在评论区交流大家一起总结问题少踩坑共勉