vlc-android: two of the five documented folders are not in the tree
VLC for Android, Android TV and ChromeOS
At a glance
- What is it?
- The official Android port of VLC, whose cheapest build path pulls prebuilt libraries from a host the repository names nowhere else, whose app is GPLv2 or later with a note about why that becomes GPLv3 in practice, and whose engine build still asks for a JDK 8 toolchain while pull requests have to go to a GitLab server rather than the forge the repository is mirrored on.
- Who is it for?
- Use the LibVLC artifact if you are embedding a player, since that is the supported path and the engine is LGPLv2, and read the licence note before you combine it with anything: the application is GPLv2 or later, and the file itself explains that Android libraries make that de facto GPLv3.
- Can I use it commercially?
- Yes, with conditions. GPL-2.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 5 days ago.
- What is it written in?
- Mainly Kotlin, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- videolan/vlc-android4,144 ★ · +125
| Repository | 2026-09-24 | 2026-11-14 |
|---|---|---|
| videolan/vlc-android | 4k | 4.1k |
125 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Two of the five project folders are missing from a fresh clone
The project structure section names five folders. `application` is the Android application source code organised by modules, `buildsystem` holds the build scripts, CI and maven publication configuration, `medialibrary` is a gradle module, `libvlc` is described as the LibVLC gradle module with the note that VLC source code will be cloned into `vlc/` at root level, and `extension-api` is the application extensions SDK with a parenthetical that it is not released yet.
A fresh clone has three of them. The top level holds `application/`, `buildsystem/` and `medialibrary/`, alongside `build.gradle`, `settings.gradle`, `gradle.properties`, `COPYING`, `NEWS`, a `.mailmap`, a `.tx/` directory for translations and a `.gitlab/` directory, and there is no `libvlc/` and no `extension-api/`.
The `libvlc` case has a stated reason, since the module is a wrapper that expects the engine source to be cloned in separately. The `extension-api` case does not: it is described as not released yet and it is simply absent, which is the same information twice. So the folder list in the README is a picture of the intended layout rather than of what you get, and the two differ in a way that matters if you are scripting a build.
The description promises Android TV and ChromeOS, the README says Android
The repository description reads VLC for Android, Android TV and ChromeOS. The README opens by calling itself the official Android port of VLC and then never mentions either platform again. There is no section on TV, no section on ChromeOS, and nothing in the project structure that is obviously aimed at either.
The closest thing is the `extension-api` module, an extensions SDK for the application that the README marks as not released yet, which is the kind of surface a leaner form factor would need. That is an inference rather than a statement in the file, and the file does not make it.
What the README does describe is the media side: the port plays the same files as the classical version of VLC, and it ships a media database for audio and video files and streams, which is the `medialibrary` module in the tree. So a reader arriving from the description is told about three platforms and given documentation for one, plus a database and an extension point that is not there yet.
GPLv2 for the app, LGPLv2 for the engine, and a note about the difference
The licence section is two paragraphs and the second one is the interesting one. VLC for Android is licensed under GPLv2 or later, with the file named. The VLC engine, LibVLC for Android, is licensed under LGPLv2, with its own licence file inside `libvlc/`. And between them the README inserts a sentence that is really a legal note: Android libraries make this, de facto, a GPLv3 application.
That sentence explains why the application licence is not simply the one you would read off the COPYING file. Linking against the Android platform libraries pulls in terms that the GPLv2 grant cannot satisfy on its own, so the effective terms of the distributed application become GPLv3, whether or not the file says so.
For anyone embedding the player rather than shipping the app, the split matters more than the note. The engine is the LGPLv2 half, it is published as a `.aar` under the `org.videolan.android` group with the artifact named `libvlc-all`, and sample code for driving it lives on the project's own server. So the LGPL path is the supported route for building your own Android media player on the VLC engine.
The cheapest build path depends on a host named once
Three build routes are offered and they differ in how much they compile. You can build the application and take the native libraries as gradle dependencies, which the README notes is a JVM build only. You can build the whole app, meaning LibVLC, the medialibrary and the application. Or you can build LibVLC alone and end up with an `.aar` package.
The route that does the least work depends on prebuilt artifacts, and the sentence introducing it names one host: native libraries are published on bintray, and the Release and Debug gradle modes fetch LibVLC and the medialibrary from there, compiling only the application source. `SignedRelease` does the same and additionally lets you sign the application APK with a local keystore. `Dev` is the mode that builds LibVLC and the medialibrary locally and then links the application against those binaries, through the build scripts.
So the trade is explicit: three gradle modes for people who want the app, one for people who need signed output, and one that does the native work. What the repository does not do is name a second host for those prebuilt libraries, and whether that one is still serving them is not something the README addresses, which is worth confirming before you plan a release around it.
The engine build still asks for openjdk-8
Building the engine is a different exercise from building the app, and the README is candid about the platform: you need a recent Linux distribution, and it should work with Windows 10 and macOS, but there is no official support for either.
The dependency list for Debian and Ubuntu is one long line, and the entry that dates it is the JDK:
sudo apt install automake ant autopoint cmake build-essential libtool-bin \
patch pkg-config protobuf-compiler ragel subversion unzip git \
openjdk-8-jre openjdk-8-jdk flex python wgetAutotools, cmake, ragel and a protobuf compiler sit comfortably alongside a JDK 8 package, and a JDK that old is the one item in the list a current distribution is unlikely to hand you without a repository of its own. The rest of the setup is two environment variables, `ANDROID_SDK` and `ANDROID_NDK`, pointed at your SDK and NDK directories.
The build itself is a single script, `buildsystem/compile.sh -l -a <ABI>`, where the ABI is one of `arm`, `arm64`, `x86`, `x86_64` or `all` for a multi-ABI build. Adding `-r` gives a library release build, and building the medialibrary instead is the same script with `-ml` in place of `-l`.
Pull requests go to GitLab, translations go to Transifex
The contribution path is not where the repository is mirrored. Pull requests must be proposed on the project's own gitlab server, which means creating an account there, forking vlc-android, and proposing merge requests from the fork. The repository's own top level reflects that, holding a `.gitlab/` directory and no `.github/` one.
Translations are the single exception to the rule about forks. They are contributed on the transifex vlc project instead, and the merge requests are then generated from that work, so a translator never touches the gitlab server. Contributions of UI or new features are expected to start with an issue so there can be a discussion before code exists.
The issue rules are stated just as firmly. The bugtracker is on the same gitlab server, a template is provided and should be used, and a report should carry the VLC app version, the device and the Android version. The last line is the one to note: issues without relevant information will be ignored.
Support is a mailing list, an IRC channel and a form in the app
Usage questions are routed away from the issue tracker by design. The in-app feedback option in the About screen is the first destination, then the Android mailing list at [email protected], then the bugtracker, then IRC on the `#videolan` channel on libera, then the VideoLAN forum. That is five channels for a project whose tracker is explicitly for bugs rather than for help.
The engine's capability list explains why a user would end up there with a question rather than a report. It covers every media format, codec and streaming protocol, hardware decoding up to 8K, network browsing of remote filesystems such as SMB, FTP, SFTP and NFS and of servers speaking UPnP and DLNA, Audio CD, DVD and Blu-ray with menu navigation, HDR including tonemapping for SDR streams, audio passthrough over SPDIF and HDMI for the HD audio codecs, video and audio filters, 360 video and 3D audio including Ambisonics, and casting to distant renderers such as Chromecast and UPnP devices.
The list ends with the two words and more, so it is a selection rather than a specification, and the reader is left with the documentation site and the forum for the rest.
Editorial conclusion
Use the LibVLC artifact if you are embedding a player, since that is the supported path and the engine is LGPLv2, and read the licence note before you combine it with anything: the application is GPLv2 or later, and the file itself explains that Android libraries make that de facto GPLv3. For building, decide early whether you want the prebuilt libraries from the remote host the README names, because the alternative is a native toolchain that still expects a JDK 8 era package list. And check the folder list against your clone before you plan around it, because two of the five directories the README describes are not there until a clone step runs.
Frequently asked questions
What is LibVLC for Android and how do I get it?
It is the Android library that embeds the VLC engine, and the README suggests it for powering your own Android media player. You can download the .aar directly from Maven under the org.videolan.android group with the artifact named libvlc-all, or build it from source. Sample code for driving it is hosted on the project's own server at code.videolan.org, and the engine is licensed under LGPLv2.
What licence applies to VLC for Android?
Two. The application is GPLv2 or later, and the README inserts the note that Android libraries make this, de facto, a GPLv3 application. The engine, LibVLC for Android, is licensed separately under LGPLv2 with its own licence file inside the libvlc directory. Embedding the engine as the .aar is therefore the LGPL side of the project.
How do I build LibVLC for Android from source?
On a recent Linux distribution, since Windows 10 and macOS are said to work but have no official support. Install the build dependencies listed for Debian and Ubuntu, which include autotools, cmake, ragel, a protobuf compiler and openjdk-8, then point ANDROID_SDK and ANDROID_NDK at your SDK and NDK directories. The build is buildsystem/compile.sh -l -a <ABI> with the ABI set to arm, arm64, x86, x86_64 or all; add -r for a release library build, or use -ml instead of -l to build the medialibrary.
Where do the prebuilt VLC Android libraries come from?
From bintray, according to the build section, which says native libraries are published there. The Release and Debug gradle modes fetch LibVLC and the medialibrary from that host and compile only the application source, SignedRelease does the same and adds signing with a local keystore, and Dev builds LibVLC and the medialibrary locally before linking the application. The repository names no other host for those prebuilt artifacts.
Does vlc-android support Android TV and ChromeOS?
The repository description says it covers Android, Android TV and ChromeOS, but the README describes only the Android port and does not mention either of the other two anywhere. The project structure does list an application extensions SDK module, which it marks as not released yet and which is absent from a fresh clone. The documentation in the repository covers Android only.
Where do I report a bug or send a patch for VLC for Android?
Bugs go to the issue tracker on the project's own gitlab server, using the provided template and including the VLC app version, the device and the Android version; the README says issues without relevant information will be ignored. Pull requests must also be proposed on that gitlab server, from a fork, with translations handled separately through the transifex project. Usage questions go to the in-app feedback form, the Android mailing list, IRC or the forum instead.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/videolan-vlc-android)Star history chart for your README
[](https://hysenlabs.com/projects/videolan-vlc-android)Was this useful?