我有一个安卓项目,定义了各种数据类型,这些类型是通过 Protocol Buffers 进行序列化的。我想要一个单独的 Java 项目,在服务器端反序列化这些数据类型。
我的项目结构如下:
在这个例子中,包Data中的所有类都处理自己的编组。尝试构建Java服务器时,它可以成功编译Android项目,但最终在Gradle中失败,表示找不到所引用的包。请注意,如果我只引入其他Java库,就可以成功地构建具有跨项目依赖项的Java服务器,这让我相信这是一个Java到Android的依赖关系问题,而不是Gradle配置问题。我考虑过的一种可能的解决方案是将所有这些数据类型从Android项目中提取出来,放到单独的Java库中。然而,问题在于其中一些类仅提供将Android特定类(SensorEvent、Location等)转换为可与ProtoBuf一起使用的类型的方法。我正在考虑的一个解决方案如下:
虽然这确实可以解决我的问题,但似乎不是最好的解决方案。
有没有办法仅通过Gradle来完成这个任务?
参考以下是我缩写后的build.gradle文件。
Android Library:
我的项目结构如下:
Android Library
- Data
- TypeA
- TypeB
- ...
Java Server
- Parser (depends on .Data)
在这个例子中,包Data中的所有类都处理自己的编组。尝试构建Java服务器时,它可以成功编译Android项目,但最终在Gradle中失败,表示找不到所引用的包。请注意,如果我只引入其他Java库,就可以成功地构建具有跨项目依赖项的Java服务器,这让我相信这是一个Java到Android的依赖关系问题,而不是Gradle配置问题。我考虑过的一种可能的解决方案是将所有这些数据类型从Android项目中提取出来,放到单独的Java库中。然而,问题在于其中一些类仅提供将Android特定类(SensorEvent、Location等)转换为可与ProtoBuf一起使用的类型的方法。我正在考虑的一个解决方案如下:
Data Types
- TypeA
- TypeB
- ...
Android Library
- Data
- AndroidTypeA (Class with Android Specific constructor that can be cast to the parent type)
- AndroidTypeB
- ...
Java Server
- Parser ( Depends on the Data Types module )
虽然这确实可以解决我的问题,但似乎不是最好的解决方案。
有没有办法仅通过Gradle来完成这个任务?
参考以下是我缩写后的build.gradle文件。
Android Library:
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.0.2"
defaultConfig {
applicationId "com.foo.bar.androidlib"
...
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
...
compile 'com.google.protobuf:protobuf-java:2.6.1'
}
Java服务器:
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.protobuf:protobuf-java:2.6.1'
compile project(':androidlib')
}
编辑:
具体而言,Gradle 给出了以下错误提示:
错误:包 com.foo.bar.androidlib 不存在
TypeA
的逻辑封装在TypeA
本身中了。问题出现在当 TypeA 也可以使用类似 SensorEvent 等其他方式构建时。我不想每次更改都重新编写构建和读取 protobuf 消息的代码。我最终采取了我在问题中描述的路线,在 Android 端提供了方便的构造函数。 - danem