Skip to content

Commit

Permalink
feat(android): allow building exoplayer from source (#3932)
Browse files Browse the repository at this point in the history
* feat(android): allow to build from source code

* fix(android): allow to build plugin from source
  • Loading branch information
freeboub authored Jun 25, 2024
1 parent 91d27a6 commit a7d834a
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 21 deletions.
85 changes: 65 additions & 20 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def ExoplayerDependenciesList = [
"useExoplayerHls",
"useExoplayerRtsp",
]
def media3_buildFromSource = safeExtGet('buildFromMedia3Source').toBoolean() ?: false

def ExoplayerDependencies = ExoplayerDependenciesList.collectEntries { property ->
[(property): safeExtGet(property)?.toBoolean() ?: false]
Expand All @@ -52,14 +53,17 @@ ExoplayerDependenciesList.each { propertyName ->
def propertyValue = ExoplayerDependencies[propertyName]
println "$propertyName: $propertyValue"
}
println "buildFromSource: $media3_buildFromSource"

// This string is used to define build path.
// As react native build output directory is react-native path of the module.
// We need to force a new path on each configuration change.
// If you add a new build parameter, please add the new value in this string
def configStringPath = ExoplayerDependencies.collect { property, value ->
property + value
}.join('').md5()
def configStringPath = ExoplayerDependencies
.collect { property, value -> property + value}
.join('')
.concat("buildFromSource:$media3_buildFromSource")
.md5()

if (isNewArchitectureEnabled()) {
apply plugin: "com.facebook.react"
Expand Down Expand Up @@ -191,46 +195,87 @@ dependencies {
implementation "androidx.activity:activity-ktx:$androidxActivity_version"

// For media playback using ExoPlayer
implementation "androidx.media3:media3-exoplayer:$media3_version"
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer"))
} else {
implementation "androidx.media3:media3-exoplayer:$media3_version"
}

if (ExoplayerDependencies["useExoplayerSmoothStreaming"]) {
// For Smooth Streaming playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer-smoothstreaming"))
} else {
implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
}
}

if (ExoplayerDependencies["useExoplayerDash"]) {
// For DASH playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer-dash"))
} else {
implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
}
}

if (ExoplayerDependencies["useExoplayerHls"]) {
// For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
// For HLS playback support with ExoPlayer
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer-hls"))
} else {
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
}
}

// For RTSP playback support with ExoPlayer
if (ExoplayerDependencies["useExoplayerRtsp"]) {
implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer-rtsp"))
} else {
implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
}
}

// For ad insertion using the Interactive Media Ads SDK with ExoPlayer
if (ExoplayerDependencies["useExoplayerIMA"]) {
implementation "androidx.media3:media3-exoplayer-ima:$media3_version"
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer-ima"))
} else {
implementation "androidx.media3:media3-exoplayer-ima:$media3_version"
}
}

// For loading data using the OkHttp network stack
implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
if (media3_buildFromSource) {
// For loading data using the OkHttp network stack
implementation(project(":media-lib-datasource-okhttp"))

// For building media playback UIs
implementation "androidx.media3:media3-ui:$media3_version"
// For building media playback UIs
implementation(project(":media-lib-ui"))

// For exposing and controlling media sessions
implementation "androidx.media3:media3-session:$media3_version"
// For exposing and controlling media sessions
implementation(project(":media-lib-session"))

// Common functionality for loading data
implementation "androidx.media3:media3-datasource:$media3_version"
// Common functionality used across multiple media libraries
implementation "androidx.media3:media3-common:$media3_version"
// Common functionality for loading data
implementation(project(":media-lib-datasource"))

// Common functionality used across multiple media libraries
implementation(project(":media-lib-common"))
} else {
// For loading data using the OkHttp network stack
implementation "androidx.media3:media3-datasource-okhttp:$media3_version"

// For building media playback UIs
implementation "androidx.media3:media3-ui:$media3_version"

// For exposing and controlling media sessions
implementation "androidx.media3:media3-session:$media3_version"

// Common functionality for loading data
implementation "androidx.media3:media3-datasource:$media3_version"

// Common functionality used across multiple media libraries
implementation "androidx.media3:media3-common:$media3_version"
}
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
1 change: 1 addition & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ RNVideo_useExoplayerDash=true
RNVideo_useExoplayerHls=true
RNVideo_androidxCoreVersion=1.9.0
RNVideo_androidxActivityVersion=1.7.0
RNVideo_buildFromMedia3Source=false
35 changes: 35 additions & 0 deletions docs/pages/other/debug.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,41 @@ With these tool you should be able to analyze what is going on with network. You

Then try to compare exchanges with previous tests you made.

## Debug media3: build from media3 source

If you need to use a specific exoplayer version or patch default behavior, you may want to build from media3 source code.

Building from media3 source is possible. You need to add 2 or 3 things in your app:

### Configure player path

You need to add following lines in settings.gradle to configure your media3 source path:

```gradle
gradle.ext.androidxMediaModulePrefix = 'media-'
apply from: file("../../../../media3/core_settings.gradle")
````
Of course, you should replace with media3 source path. Be carefull, you need to use the same version (or version with compatible api) that the package support.
### Enable building from source
In your build.gradle file, add following setting:
```gradle
buildscript {
ext {
...
buildFromMedia3Source = true
...
}
}
```

### Desugaring
to be able to link you may also need to enable coreLibraryDesugaringEnabled in your app.

See: https://developer.android.com/studio/write/java8-support?hl=fr#library-desugaring for more informations.

## It's still not working

You can try to open a ticket now !
10 changes: 10 additions & 0 deletions examples/basic/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,20 @@ android {
compileSdkVersion rootProject.ext.compileSdkVersion

namespace "com.videoplayer"

compileOptions {
// These options are necessary to be able to build fro source
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
defaultConfig {
applicationId "com.videoplayer"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
multiDexEnabled true
}
signingConfigs {
debug {
Expand Down Expand Up @@ -147,6 +155,8 @@ dependencies {
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
}
}
// coreLibraryDesugaring is mandatory to be able to build exoplayer from source
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}

apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
3 changes: 3 additions & 0 deletions examples/basic/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ buildscript {
// useExoplayerSmoothStreaming = false
// useExoplayerDash = false
// useExoplayerHls = false

// uncomment this line to be able to build from media3 source code
// buildFromMedia3Source = true
}
repositories {
google()
Expand Down
4 changes: 4 additions & 0 deletions examples/basic/android/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ project (':react-native-video-plugin-sample').projectDir = new File(rootProject.
include ':react-native-video'
project (':react-native-video').projectDir = new File(rootProject.projectDir, '../../../android')

// uncomment these lines to be able to build from media3 source code
// gradle.ext.androidxMediaModulePrefix = 'media-'
// apply from: file("../../../../media3/core_settings.gradle")

includeBuild('../node_modules/@react-native/gradle-plugin')

apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle")
Expand Down
10 changes: 9 additions & 1 deletion examples/react-native-video-plugin-sample/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,15 @@ dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "androidx.media3:media3-exoplayer:$media3_version"

def media3_buildFromSource = safeExtGet('buildFromMedia3Source')?.toBoolean() ?: false
if (media3_buildFromSource) {
implementation(project(":media-lib-exoplayer"))
implementation(project(":media-lib-exoplayer-dash"))
} else {
implementation "androidx.media3:media3-exoplayer:$media3_version"
implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
}
implementation project(':react-native-video')
}

0 comments on commit a7d834a

Please sign in to comment.