feat(android): allow to disable selected functionalities (#3681)

* feat(android): add possibility do disable some of functionalities

* create dump classes

* remove dump files when functionalities are enabled

* add docs

* enable all functionalities in example

* throw error when trying to use disabled functionality

* update docs
This commit is contained in:
Krzysztof Moch 2024-04-16 14:23:19 +02:00 committed by GitHub
parent 2285eba8f0
commit 64e3191f73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 352 additions and 19 deletions

View File

@ -36,17 +36,30 @@ def supportsNamespace() {
return major >= 8 return major >= 8
} }
def useExoplayerIMA = safeExtGet("RNVUseExoplayerIMA")?.toBoolean() ?: false def ExoplayerDependenciesList = [
"useExoplayerIMA",
"useExoplayerSmoothStreaming",
"useExoplayerDash",
"useExoplayerHls",
"useExoplayerRtsp",
]
println "useExoplayerIMA:" + useExoplayerIMA def ExoplayerDependencies = ExoplayerDependenciesList.collectEntries { property ->
[(property): safeExtGet(property)?.toBoolean() ?: false]
}
ExoplayerDependenciesList.each { propertyName ->
def propertyValue = ExoplayerDependencies[propertyName]
println "$propertyName: $propertyValue"
}
// This string is used to define build path. // This string is used to define build path.
// As react native build output directory is react-native path of the module. // As react native build output directory is react-native path of the module.
// We need to force a new path on each configuration change. // 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 // If you add a new build parameter, please add the new value in this string
def configStringPath = ( def configStringPath = ExoplayerDependencies.collect { property, value ->
'useExoplayerIMA' + useExoplayerIMA \ property + value
).md5() }.join('').md5()
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
apply plugin: "com.facebook.react" apply plugin: "com.facebook.react"
@ -83,7 +96,13 @@ android {
targetSdkVersion safeExtGet('targetSdkVersion') targetSdkVersion safeExtGet('targetSdkVersion')
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
buildConfigField "boolean", "USE_EXOPLAYER_IMA", ExoplayerDependencies["useExoplayerIMA"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_SMOOTH_STREAMING", ExoplayerDependencies["useExoplayerSmoothStreaming"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_DASH", ExoplayerDependencies["useExoplayerDash"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_HLS", ExoplayerDependencies["useExoplayerHls"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_RTSP", ExoplayerDependencies["useExoplayerRtsp"].toString()
ndk { ndk {
abiFilters(*reactNativeArchitectures()) abiFilters(*reactNativeArchitectures())
@ -103,10 +122,26 @@ android {
sourceSets { sourceSets {
main { main {
java { java {
if (useExoplayerIMA) { if (ExoplayerDependencies["useExoplayerIMA"]) {
exclude 'com/google/ads/interactivemedia/v3/api' exclude 'com/google/ads/interactivemedia/v3/api'
exclude 'androidx/media3/exoplayer/ima' exclude 'androidx/media3/exoplayer/ima'
} }
if (ExoplayerDependencies["useExoplayerSmoothStreaming"]) {
exclude 'androidx/media3/exoplayer/smoothstreaming'
}
if (ExoplayerDependencies["useExoplayerDash"]) {
exclude 'androidx/media3/exoplayer/dash'
}
if (ExoplayerDependencies["useExoplayerHls"]) {
exclude 'androidx/media3/exoplayer/hls'
}
if (ExoplayerDependencies["useExoplayerRtsp"]) {
exclude 'androidx/media3/exoplayer/rtsp'
}
} }
} }
} }
@ -158,16 +193,28 @@ dependencies {
// For media playback using ExoPlayer // For media playback using ExoPlayer
implementation "androidx.media3:media3-exoplayer:$media3_version" implementation "androidx.media3:media3-exoplayer:$media3_version"
if (ExoplayerDependencies["useExoplayerSmoothStreaming"]) {
// For Smooth Streaming playback support with ExoPlayer // For Smooth Streaming playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
}
if (ExoplayerDependencies["useExoplayerDash"]) {
// For DASH playback support with ExoPlayer // For DASH playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-dash:$media3_version" implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
}
if (ExoplayerDependencies["useExoplayerHls"]) {
// For HLS playback support with ExoPlayer // For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version" 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" implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
}
// For ad insertion using the Interactive Media Ads SDK with ExoPlayer // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
if (useExoplayerIMA) { if (ExoplayerDependencies["useExoplayerIMA"]) {
implementation "androidx.media3:media3-exoplayer-ima:$media3_version" implementation "androidx.media3:media3-exoplayer-ima:$media3_version"
} }

View File

@ -5,6 +5,10 @@ RNVideo_compileSdkVersion=31
RNVideo_ndkversion=21.4.7075529 RNVideo_ndkversion=21.4.7075529
RNVideo_buildToolsVersion=30.0.2 RNVideo_buildToolsVersion=30.0.2
RNVideo_media3Version=1.1.1 RNVideo_media3Version=1.1.1
RNVideo_RNVUseExoplayerIMA=false RNVideo_useExoplayerIMA=false
RNVideo_useExoplayerRtsp=false
RNVideo_useExoplayerSmoothStreaming=true
RNVideo_useExoplayerDash=true
RNVideo_useExoplayerHls=true
RNVideo_androidxCoreVersion=1.9.0 RNVideo_androidxCoreVersion=1.9.0
RNVideo_androidxActivityVersion=1.7.0 RNVideo_androidxActivityVersion=1.7.0

View File

@ -0,0 +1,36 @@
package androidx.media3.exoplayer.dash;
import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
public class DashMediaSource {
public static class Factory implements MediaSource.Factory {
public Factory(DefaultDashChunkSource.Factory factory, DataSource.Factory factory1) {
}
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}
@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}
@Override
public int[] getSupportedTypes() {
return new int[0];
}
@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

View File

@ -0,0 +1,12 @@
package androidx.media3.exoplayer.dash;
import android.net.Uri;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.dash.manifest.DashManifest;
public class DashUtil {
public static DashManifest loadManifest(DataSource ds, Uri uri) {
return null;
}
}

View File

@ -0,0 +1,10 @@
package androidx.media3.exoplayer.dash;
import androidx.media3.datasource.DataSource;
public class DefaultDashChunkSource {
public static final class Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}
}
}

View File

@ -0,0 +1,13 @@
package androidx.media3.exoplayer.dash.manifest;
import androidx.collection.CircularArray;
import androidx.media3.common.C;
public class AdaptationSet {
public int type = 0;
public CircularArray<Representation> representations;
public AdaptationSet() {
representations = null;
}
}

View File

@ -0,0 +1,15 @@
package androidx.media3.exoplayer.dash.manifest;
public class DashManifest {
public DashManifest() {
}
public int getPeriodCount() {
return 0;
}
public Period getPeriod(int index) {
return null;
}
}

View File

@ -0,0 +1,7 @@
package androidx.media3.exoplayer.dash.manifest;
import androidx.collection.CircularArray;
public class Period {
public CircularArray<AdaptationSet> adaptationSets;
}

View File

@ -0,0 +1,12 @@
package androidx.media3.exoplayer.dash.manifest;
import androidx.media3.common.Format;
public class Representation {
public Format format;
public long presentationTimeOffsetUs;
public Representation() {
format = null;
}
}

View File

@ -0,0 +1,34 @@
package androidx.media3.exoplayer.hls;
import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
public class HlsMediaSource {
public static class Factory implements MediaSource.Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}
@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}
@Override
public int[] getSupportedTypes() {
return new int[0];
}
@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

View File

@ -0,0 +1,34 @@
package androidx.media3.exoplayer.rtsp;
import androidx.media3.common.MediaItem;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
public class RtspMediaSource {
public RtspMediaSource() {
}
public static class Factory implements MediaSource.Factory {
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}
@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}
@Override
public int[] getSupportedTypes() {
return new int[0];
}
@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

View File

@ -0,0 +1,34 @@
package androidx.media3.exoplayer.smoothstreaming;
import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
public class DefaultSsChunkSource {
public static class Factory implements MediaSource.Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}
@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}
@Override
public int[] getSupportedTypes() {
return new int[0];
}
@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

View File

@ -0,0 +1,34 @@
package androidx.media3.exoplayer.smoothstreaming;
import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
public class SsMediaSource {
public static class Factory implements MediaSource.Factory {
public Factory(DefaultSsChunkSource.Factory factory, DataSource.Factory factory1) {
}
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}
@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}
@Override
public int[] getSupportedTypes() {
return new int[0];
}
@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

View File

@ -101,6 +101,7 @@ import com.brentvatne.common.api.Track;
import com.brentvatne.common.api.VideoTrack; import com.brentvatne.common.api.VideoTrack;
import com.brentvatne.common.react.VideoEventEmitter; import com.brentvatne.common.react.VideoEventEmitter;
import com.brentvatne.common.toolbox.DebugLog; import com.brentvatne.common.toolbox.DebugLog;
import com.brentvatne.react.BuildConfig;
import com.brentvatne.react.R; import com.brentvatne.react.R;
import com.brentvatne.receiver.AudioBecomingNoisyReceiver; import com.brentvatne.receiver.AudioBecomingNoisyReceiver;
import com.brentvatne.receiver.BecomingNoisyListener; import com.brentvatne.receiver.BecomingNoisyListener;
@ -822,18 +823,33 @@ public class ReactExoplayerView extends FrameLayout implements
switch (type) { switch (type) {
case CONTENT_TYPE_SS: case CONTENT_TYPE_SS:
if(!BuildConfig.USE_EXOPLAYER_SMOOTH_STREAMING) {
DebugLog.e("Exo Player Exception", "Smooth Streaming is not enabled!");
throw new IllegalStateException("Smooth Streaming is not enabled!");
}
mediaSourceFactory = new SsMediaSource.Factory( mediaSourceFactory = new SsMediaSource.Factory(
new DefaultSsChunkSource.Factory(mediaDataSourceFactory), new DefaultSsChunkSource.Factory(mediaDataSourceFactory),
buildDataSourceFactory(false) buildDataSourceFactory(false)
); );
break; break;
case CONTENT_TYPE_DASH: case CONTENT_TYPE_DASH:
if(!BuildConfig.USE_EXOPLAYER_DASH) {
DebugLog.e("Exo Player Exception", "DASH is not enabled!");
throw new IllegalStateException("DASH is not enabled!");
}
mediaSourceFactory = new DashMediaSource.Factory( mediaSourceFactory = new DashMediaSource.Factory(
new DefaultDashChunkSource.Factory(mediaDataSourceFactory), new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
buildDataSourceFactory(false) buildDataSourceFactory(false)
); );
break; break;
case CONTENT_TYPE_HLS: case CONTENT_TYPE_HLS:
if (!BuildConfig.USE_EXOPLAYER_HLS) {
DebugLog.e("Exo Player Exception", "HLS is not enabled!");
throw new IllegalStateException("HLS is not enabled!");
}
mediaSourceFactory = new HlsMediaSource.Factory( mediaSourceFactory = new HlsMediaSource.Factory(
mediaDataSourceFactory mediaDataSourceFactory
); );
@ -844,6 +860,11 @@ public class ReactExoplayerView extends FrameLayout implements
); );
break; break;
case CONTENT_TYPE_RTSP: case CONTENT_TYPE_RTSP:
if (!BuildConfig.USE_EXOPLAYER_RTSP) {
DebugLog.e("Exo Player Exception", "RTSP is not enabled!");
throw new IllegalStateException("RTSP is not enabled!");
}
mediaSourceFactory = new RtspMediaSource.Factory(); mediaSourceFactory = new RtspMediaSource.Factory();
break; break;
default: { default: {

View File

@ -65,14 +65,28 @@ buildscript {
### Enable custom feature in gradle file ### Enable custom feature in gradle file
#### Enable client side ads insertion You can disable or enable the following features by setting the following variables in your `android/build.gradle` file:
To enable client side ads insertion CSAI with google IMA SDK, you need to enable it in your gradle file. - `useExoplayerIMA` - Enable Google IMA SDK (Ads support)
- `useExoplayerRtsp` - Enable RTSP support
- `useExoplayerSmoothStreaming` - Enable SmoothStreaming support
- `useExoplayerDash` - Enable Dash support
- `useExoplayerHls` - Enable HLS support
Each of these features enabled will increase the size of your APK, so only enable the features you need.
By default enabled features are: `useExoplayerSmoothStreaming`, `useExoplayerDash`, `useExoplayerHls`
Example:
```gradle ```gradle
buildscript { buildscript {
ext { ext {
... ...
RNVUseExoplayerIMA = true useExoplayerIMA = true
useExoplayerRtsp = true
useExoplayerSmoothStreaming = true
useExoplayerDash = true
useExoplayerHls = true
... ...
} }
} }

View File

@ -9,7 +9,13 @@ buildscript {
ndkVersion = "26.1.10909125" ndkVersion = "26.1.10909125"
kotlinVersion = "1.9.22" kotlinVersion = "1.9.22"
RNVUseExoplayerIMA = System.getenv("RNV_SAMPLE_ENABLE_ADS") ?: true useExoplayerIMA = System.getenv("RNV_SAMPLE_ENABLE_ADS") ?: true
useExoplayerRtsp = true
// use the following to disable ExoPlayer modules - this will reduce the size of your app
// useExoplayerSmoothStreaming = false
// useExoplayerDash = false
// useExoplayerHls = false
} }
repositories { repositories {
google() google()