继续操作前请注册或者登录。
davidliu
Committed by GitHub

use protobuf-javalite library (#63)

... ... @@ -18,7 +18,7 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.15'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
... ... @@ -61,7 +61,7 @@ ext {
junitJupiter : "5.5.0",
coroutines : "1.6.0",
lint : "30.0.1",
protobuf : "3.15.1",
protobuf : "3.19.4",
]
generated = [
protoSrc: "$projectDir/protocol",
... ...
... ... @@ -62,6 +62,7 @@ protobuf {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
... ... @@ -108,8 +109,7 @@ dependencies {
api "com.squareup.okhttp3:okhttp:4.9.1"
implementation "androidx.annotation:annotation:1.3.0"
implementation "androidx.core:core:${versions.androidx_core}"
implementation "com.google.protobuf:protobuf-java:${versions.protobuf}"
implementation "com.google.protobuf:protobuf-java-util:${versions.protobuf}"
implementation "com.google.protobuf:protobuf-javalite:${versions.protobuf}"
implementation "androidx.compose.ui:ui:$compose_version"
implementation 'com.google.dagger:dagger:2.38'
... ...
... ... @@ -42,3 +42,5 @@
-keepclasseswithmembers class io.livekit.android.** { # <-- change package name to your app's
kotlinx.serialization.KSerializer serializer(...);
}
-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }
\ No newline at end of file
... ...
... ... @@ -22,8 +22,6 @@ object InjectionNames {
*/
internal const val DISPATCHER_UNCONFINED = "dispatcher_unconfined"
internal const val SIGNAL_JSON_ENABLED = "signal_json_enabled"
internal const val OPTIONS_VIDEO_HW_ACCEL = "options_video_hw_accel"
// Overrides
... ...
package io.livekit.android.dagger
import com.google.protobuf.util.JsonFormat
import dagger.Module
import dagger.Provides
import dagger.Reusable
import kotlinx.serialization.json.Json
import javax.inject.Named
@Module
object JsonFormatModule {
@Provides
fun protobufJsonFormatParser(): JsonFormat.Parser {
return JsonFormat.parser()
}
@Provides
fun protobufJsonFormatPrinter(): JsonFormat.Printer {
return JsonFormat.printer()
}
@Provides
@Reusable
fun kotlinSerializationJson(): Json =
Json {
ignoreUnknownKeys = true
}
@Provides
@Named(InjectionNames.SIGNAL_JSON_ENABLED)
fun signalJsonEnabled(): Boolean = false
}
\ No newline at end of file
... ...
package io.livekit.android.dagger
import android.content.Context
import androidx.annotation.Nullable
import dagger.BindsInstance
import dagger.Component
import io.livekit.android.room.Room
import okhttp3.OkHttpClient
import org.webrtc.EglBase
import org.webrtc.PeerConnectionFactory
import javax.annotation.Nullable
import javax.inject.Named
import javax.inject.Singleton
... ...
package io.livekit.android.dagger
import androidx.annotation.Nullable
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.WebSocket
import javax.annotation.Nullable
import javax.inject.Named
import javax.inject.Singleton
... ...
package io.livekit.android.room
import android.os.SystemClock
import com.google.protobuf.ByteString
import io.livekit.android.ConnectOptions
import io.livekit.android.dagger.InjectionNames
import io.livekit.android.room.participant.ParticipantTrackPermission
... ... @@ -682,7 +683,7 @@ internal constructor(
if (buffer == null) {
return
}
val dp = LivekitModels.DataPacket.parseFrom(buffer.data)
val dp = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffer.data))
when (dp.valueCase) {
LivekitModels.DataPacket.ValueCase.SPEAKER -> {
listener?.onActiveSpeakersUpdate(dp.speaker.speakersList)
... ...
package io.livekit.android.room
import com.google.protobuf.util.JsonFormat
import com.vdurmont.semver4j.Semver
import io.livekit.android.ConnectOptions
import io.livekit.android.dagger.InjectionNames
... ... @@ -38,12 +37,8 @@ class SignalClient
@Inject
constructor(
private val websocketFactory: WebSocket.Factory,
private val fromJsonProtobuf: JsonFormat.Parser,
private val toJsonProtobuf: JsonFormat.Printer,
private val json: Json,
private val okHttpClient: OkHttpClient,
@Named(InjectionNames.SIGNAL_JSON_ENABLED)
private val useJson: Boolean,
@Named(InjectionNames.DISPATCHER_IO)
private val ioDispatcher: CoroutineDispatcher,
) : WebSocketListener() {
... ... @@ -197,11 +192,7 @@ constructor(
}
override fun onMessage(webSocket: WebSocket, text: String) {
val signalResponseBuilder = LivekitRtc.SignalResponse.newBuilder()
fromJsonProtobuf.merge(text, signalResponseBuilder)
val response = signalResponseBuilder.build()
handleSignalResponse(response)
LKLog.w { "received JSON message, unsupported in this version." }
}
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
... ... @@ -444,14 +435,8 @@ constructor(
LKLog.w { "not connected, could not send request $request" }
return
}
val sent: Boolean
if (useJson) {
val message = toJsonProtobuf.print(request)
sent = currentWs?.send(message) ?: false
} else {
val message = request.toByteArray().toByteString()
sent = currentWs?.send(message) ?: false
}
val sent = currentWs?.send(message) ?: false
if (!sent) {
LKLog.e { "error sending request: $request" }
... ... @@ -463,7 +448,7 @@ constructor(
if (!isConnected) {
// Only handle joins if not connected.
if (response.hasJoin()) {
if (response.join != null) {
isConnected = true
startRequestQueue()
try {
... ... @@ -473,7 +458,7 @@ constructor(
}
joinContinuation?.resumeWith(Result.success(Either.Left(response.join)))
} else {
LKLog.e { "Received response while not connected. ${toJsonProtobuf.print(response)}" }
LKLog.e { "Received response while not connected. $response" }
}
return
}
... ...
package io.livekit.android.room
import com.google.protobuf.util.JsonFormat
import io.livekit.android.BaseTest
import io.livekit.android.mock.MockWebSocketFactory
import io.livekit.android.mock.TestData
... ... @@ -38,10 +37,7 @@ class SignalClientTest : BaseTest() {
wsFactory = MockWebSocketFactory()
client = SignalClient(
wsFactory,
JsonFormat.parser(),
JsonFormat.printer(),
Json,
useJson = false,
okHttpClient = okHttpClient,
ioDispatcher = coroutineRule.dispatcher
)
... ... @@ -221,8 +217,8 @@ class SignalClientTest : BaseTest() {
const val EXAMPLE_URL = "ws://www.example.com"
val JOIN = with(LivekitRtc.SignalResponse.newBuilder()) {
join = with(joinBuilder) {
room = with(roomBuilder) {
join = with(LivekitRtc.JoinResponse.newBuilder()) {
room = with(LivekitModels.Room.newBuilder()) {
name = "roomname"
sid = "room_sid"
build()
... ... @@ -236,7 +232,7 @@ class SignalClientTest : BaseTest() {
}
val OFFER = with(LivekitRtc.SignalResponse.newBuilder()) {
offer = with(offerBuilder) {
offer = with(LivekitRtc.SessionDescription.newBuilder()) {
sdp = "remote_offer"
type = "offer"
build()
... ... @@ -245,8 +241,8 @@ class SignalClientTest : BaseTest() {
}
val ROOM_UPDATE = with(LivekitRtc.SignalResponse.newBuilder()) {
roomUpdate = with(roomUpdateBuilder) {
room = with(roomBuilder) {
roomUpdate = with(LivekitRtc.RoomUpdate.newBuilder()) {
room = with(LivekitModels.Room.newBuilder()) {
metadata = "metadata"
build()
}
... ... @@ -256,7 +252,7 @@ class SignalClientTest : BaseTest() {
}
val LOCAL_TRACK_PUBLISHED = with(LivekitRtc.SignalResponse.newBuilder()) {
trackPublished = with(trackPublishedBuilder) {
trackPublished = with(LivekitRtc.TrackPublishedResponse.newBuilder()) {
cid = "local_cid"
track = TestData.LOCAL_AUDIO_TRACK
build()
... ... @@ -306,7 +302,7 @@ class SignalClientTest : BaseTest() {
val CONNECTION_QUALITY = with(LivekitRtc.SignalResponse.newBuilder()) {
connectionQuality = with(connectionQualityBuilder) {
connectionQuality = with(LivekitRtc.ConnectionQualityUpdate.newBuilder()) {
addUpdates(with(LivekitRtc.ConnectionQualityInfo.newBuilder()) {
participantSid = JOIN.join.participant.sid
quality = LivekitModels.ConnectionQuality.EXCELLENT
... ... @@ -345,7 +341,7 @@ class SignalClientTest : BaseTest() {
build()
}
val LEAVE = with(LivekitRtc.SignalResponse.newBuilder()) {
leave = with(leaveBuilder) {
leave = with(LivekitRtc.LeaveRequest.newBuilder()) {
build()
}
build()
... ...
... ... @@ -40,7 +40,7 @@ dependencies {
api "androidx.lifecycle:lifecycle-runtime-ktx:${versions.androidx_lifecycle}"
api "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.androidx_lifecycle}"
api "androidx.lifecycle:lifecycle-common-java8:${versions.androidx_lifecycle}"
api "com.google.protobuf:protobuf-java:${versions.protobuf}"
api "com.google.protobuf:protobuf-javalite:${versions.protobuf}"
api project(":livekit-android-sdk")
implementation 'androidx.preference:preference-ktx:1.1.1'
// debugImplementation because LeakCanary should only run in debug builds.
... ...