google/ExoPlayer · critical · RuntimeException
Error instantiating FLAC extension
Error message
Error instantiating FLAC extension
What it means
DefaultRenderersFactory reflectively loads the optional FLAC decoder renderer (com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer) via its (Handler, AudioRendererEventListener, AudioSink) constructor when extension renderers are enabled. If the class is found but reflection fails (signature mismatch, access failure, or constructor exception), the factory throws a RuntimeException carrying the cause. ClassNotFoundException is the only tolerated outcome because it simply means the extension was not compiled in.
Source
Thrown at library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:526
}
try {
// Full class names used for constructor args so the LINT rule triggers if any of them move.
Class<?> clazz = Class.forName("com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer");
Constructor<?> constructor =
clazz.getConstructor(
android.os.Handler.class,
com.google.android.exoplayer2.audio.AudioRendererEventListener.class,
com.google.android.exoplayer2.audio.AudioSink.class);
Renderer renderer =
(Renderer) constructor.newInstance(eventHandler, eventListener, audioSink);
out.add(extensionRendererIndex++, renderer);
Log.i(TAG, "Loaded LibflacAudioRenderer.");
} catch (ClassNotFoundException e) {
// Expected if the app was built without the extension.
} catch (Exception e) {
// The extension is present, but instantiation failed.
throw new RuntimeException("Error instantiating FLAC extension", e);
}
try {
// Full class names used for constructor args so the LINT rule triggers if any of them move.
Class<?> clazz =
Class.forName("com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioRenderer");
Constructor<?> constructor =
clazz.getConstructor(
android.os.Handler.class,
com.google.android.exoplayer2.audio.AudioRendererEventListener.class,
com.google.android.exoplayer2.audio.AudioSink.class);
Renderer renderer =
(Renderer) constructor.newInstance(eventHandler, eventListener, audioSink);
out.add(extensionRendererIndex++, renderer);
Log.i(TAG, "Loaded FfmpegAudioRenderer.");
} catch (ClassNotFoundException e) {
// Expected if the app was built without the extension.
} catch (Exception e) {View on GitHub (pinned to dd430f7053)
Solutions
- Inspect the chained cause for NoSuchMethodException vs UnsatisfiedLinkError.
- Use identical versions for exoplayer-core and exoplayer-flac.
- Keep extension classes intact under R8: -keep class com.google.android.exoplayer2.ext.flac.** { *; }.
- Drop the extension and let the platform FLAC decoder handle it (Android 3.1+/most devices), i.e. EXTENSION_RENDERER_MODE_OFF.
Example fix
// before implementation 'com.google.android.exoplayer:exoplayer:2.19.1' implementation 'com.google.android.exoplayer:exoplayer-flac:2.18.1' // version drift! // after implementation 'com.google.android.exoplayer:exoplayer:2.19.1' implementation 'com.google.android.exoplayer:exoplayer-flac:2.19.1' // aligned
Defensive patterns
Strategy: try-catch
Validate before calling
try {
Class.forName("com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer")
.getConstructor(Handler.class, AudioRendererEventListener.class, AudioSink.class);
// extension structurally present
} catch (ClassNotFoundException e) {
// not packaged — fine, platform FLAC will be used
} catch (NoSuchMethodException e) {
// version drift — do not enable extension mode
} Try / catch
try {
player = new ExoPlayer.Builder(flacFactory).build(context);
} catch (RuntimeException e) {
if (e.getMessage() != null && e.getMessage().contains("FLAC extension")) {
player = new ExoPlayer.Builder(new DefaultRenderersFactory(context)).build(context);
} else { throw e; }
} Prevention
- Match exoplayer-flac version to core exactly
- Most devices have hardware FLAC — justify the extension before shipping it
- Verify no duplicate flac renderers from an uber-jar plus module combo
- Keep extension classes unobfuscated
When it happens
Trigger: EXTENSION_RENDERER_MODE_ON/PREFER plus a packaged exoplayer-flac module whose constructor cannot be resolved or whose instantiation throws (missing libflac native library).
Common situations: Mismatched exoplayer-flac and exoplayer-core versions; obfuscated release builds breaking the reflective constructor lookup; APK splits or ABI filters excluding the FLAC native .so; duplicate flac extensions (e.g. both exoplayer-flac and a full exoplayer uber-jar).
Related errors
- Error instantiating Opus extension
- Error instantiating FFmpeg extension
- Error instantiating VP9 extension
- Error instantiating AV1 extension
- Failed to load decoder native libraries.
AI-assisted analysis of google/ExoPlayer@dd430f7053 (2026-08-14).
Data as JSON: /api/errors/4e11e172ad69e3b0.
Report an issue: GitHub.