Skip to main content

๐Ÿค– Android

One AAR carries the meeting client: the Hermes-compiled JavaScript bundle, LiveKit WebRTC, the Expo modules and the native code of the React Native libraries it uses. The React Native runtime itself (react-android 0.86.3 and hermes-android) is a declared dependency that Gradle downloads from Maven Central. Your app passes a join URL; the SDK opens the meeting full-screen and reports back when the user leaves. No React Native knowledge is needed in your app.

Artifactorg.bigbluebutton.bbb:meeting-sdk-fused-release:0.1.0
Repositoryhttps://raw.githubusercontent.com/ahmad-bbbb/bigbluebutton-mobile-sdk-maven/main
RequirementsminSdk 24 (Android 7.0), compileSdk 36, Java 17, AGP 8.13+; Kotlin apps need Kotlin 2.0 or later

๐Ÿ“ฆ 1. Gradleโ€‹

Add the SDK's Maven repository. The content filter keeps Gradle from asking it for anything else:

// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://raw.githubusercontent.com/ahmad-bbbb/bigbluebutton-mobile-sdk-maven/main")
content { includeGroup("org.bigbluebutton.bbb") }
}
}
}

Then the dependency and the packaging rules:

// app/build.gradle.kts
android {
defaultConfig {
minSdk = 24
ndk { abiFilters += listOf("arm64-v8a", "x86_64") } // the SDK ships 64-bit libraries only
}
packaging {
// react-android and fbjni both ship these; React Native apps get the same rule from the RN Gradle plugin
jniLibs { pickFirsts += listOf("**/libc++_shared.so", "**/libfbjni.so") }
}
}
configurations.all {
// fbjni 0.8.x crashes React Native 0.86 at startup; keep the version React Native pins
resolutionStrategy.force("com.facebook.fbjni:fbjni:0.7.0")
}
dependencies {
implementation("org.bigbluebutton.bbb:meeting-sdk-fused-release:0.1.0")
// not fused into the AAR and not declared by its POM: add it yourself
implementation("com.google.guava:guava:33.4.0-android")
// Material is not fused either, but the POM already brings com.google.android.material:material
}
Debug builds

The SDK ships release native libraries. A debug build of your app resolves the debug variants of react-android and hermes-android and crashes at startup (SIGSEGV). Either build your app in release, or add a Gradle component-metadata rule that hands those debug variants the release AAR.

The Flutter plugin has such a rule, BbbReleaseNativeLibsRule, in its android/build.gradle.kts. A native app can copy the class into its app/build.gradle.kts and register it (not yet exercised in a native debug build):

dependencies.components {
withModule<BbbReleaseNativeLibsRule>("com.facebook.react:react-android")
withModule<BbbReleaseNativeLibsRule>("com.facebook.hermes:hermes-android")
}

๐Ÿ’ป 2. Codeโ€‹

import android.app.Application
import android.content.res.Configuration
import org.bigbluebutton.bbb.sdk.*

class App : Application() { // registered as <application android:name=".App">
override fun onCreate() {
super.onCreate()
BigBlueButtonSdk.initialize(this) // optional: join() initializes lazily
}

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
BigBlueButtonSdk.onConfigurationChanged(this, newConfig) // forwards configuration changes to the SDK
}
}

BigBlueButtonSdk.join(activity, BbbJoinOptions(joinUrl = url), object : BbbMeetingListener {
override fun onJoined() { /* in the meeting */ }
override fun onLeft(reason: BbbLeaveReason, detail: String?) { /* back in your app */ }
override fun onError(message: String) { }
})

BigBlueButtonSdk.leave() // ask the running meeting to leave

BbbJoinOptions also carries meetingName, theme, pictureInPicture, screensharePresenter, embedMode, largeScreenLayout and devLogging. BbbSdkConfig, passed as BigBlueButtonSdk.initialize(app, config), carries clientType and appVersion. All options are in the ๐Ÿ“˜ API reference.

The meeting runs in the SDK's own activity, BbbMeetingActivity, which the AAR declares (single task, picture-in-picture, AppCompat theme). Apart from registering your Application class, if you use one, there is nothing to add to your manifest.


๐Ÿงน 3. Minificationโ€‹

The SDK is not R8-safe yet: its native code looks classes up by name, so an unguarded minified build fails at startup (LiveKitReactNative.setup() failed: NoSuchFieldException) or on join. Keep isMinifyEnabled = false for the build types that include the SDK.

The AAR carries consumer keep rules as proguard.txt, which AGP applies automatically when an app minifies. They are best effort and have not been verified under R8 yet.


๐Ÿช 4. Play Consoleโ€‹

Declare the foreground-service use cases the meeting needs: microphone, media playback and, for screen sharing, media projection.


๐Ÿ“ 5. Sizeโ€‹

The AAR is built for the 64-bit ABIs only (arm64-v8a, x86_64). Version 0.1.0 is about 88 MB, of which about 10 MB are incomplete 32-bit libraries (armeabi-v7a, x86) left by prebuilt dependencies; 0.1.1 strips them (about 78 MB). With abiFilters or App Bundles, the installed APK stays at roughly 55 MB per ABI. 32-bit (armeabi-v7a) builds are not published.


โœ… Host checklistโ€‹

  • 64-bit only. Restrict the ABIs (ndk { abiFilters += listOf("arm64-v8a", "x86_64") }) or exclude the 32-bit splits. Otherwise Play may deliver a 32-bit split that crashes on load.
  • No minification over the SDK classes. Keep isMinifyEnabled = false for release builds until the keep rules are verified.
  • Guava. The fused media3 classes reference Guava, which the POM does not declare: add implementation("com.google.guava:guava:33.4.0-android").
  • Permissions. The AAR declares what it needs: foreground service types, notifications, and Bluetooth for headsets (BLUETOOTH up to Android 11, BLUETOOTH_CONNECT from Android 12). The runtime prompts for RECORD_AUDIO, CAMERA and POST_NOTIFICATIONS come from the SDK inside the meeting; your app does not need to ask first.
  • Java apps implement all three BbbMeetingListener methods; the Kotlin default bodies are not visible from Java.
  • Tasks. BbbMeetingActivity is singleTask. If your activity has its own taskAffinity (Flutter's template does), the meeting shows as a second entry in Recents; give both the same affinity if that matters.
  • Configuration changes. The meeting activity handles orientation, size, locale, dark mode, density and font-scale changes itself, so a system setting change mid-meeting does not restart the session.