Ubuntu 16.04下编译vlc-android

date: 2016.08.19; modification:2016.08.19

目录:

1 前言

vlc官方本身就提供了完整的android版本的源码, 只不过网上的很多编译说明都比较老了, 这个代码变更很快, 网上找到的一些中文说明都是一年多前的, 和现在(2016.08.19)的版本相比, 从代码仓库路径到目录结构, 代码结构, 都有很多的变化. 所以另起一文, 略做说明.

本文编译环境为ubuntu16.04, vlc-android版本为2.0.5. 在git clone出的源码中, 用git tag可以看到该版本. 这是到目前为止最新tag版本.

2 环境准备

  1. 安装ubuntu软件:

    sudo apt-get install -y automake autopoint cmake ant build-essential libtool patch sudo apt-get install -y pkg-config protobuf-compiler ragel subversion unzip git sudo apt-get install -y liba52-0.7.4-dev libxcb-composite0-dev libxcb-xv0-dev libxcb-randr0-dev libasound2-dev sudo apt-get install -y libprotobuf-c-dev libprotobuf-c1 libprotobuf-dev protobuf-c-compiler

上面这些软件不都是编译安卓需要的, 其中后面两行lib打头的, 明显是pc端编译需要的库, 在此一并列出.

  1. 准备Android编译环境

需要准备好Android的ndk与sdk, 其中ndk要求的是r11版本, 否则会报错. sdk需要的好像是23还是24版本, 我记不清了, 为了保险, 我都下载了.

2.1 注意事项

  1. 由于编译的过程中, 会继续检查一些环境是否具备, 如果不具备会自动去下载, 比如一些工具包, 一些android sdk版本等. 所以需要保持网络畅通. 如果不确定android sdk版本是否满足的化, 最好挂上vpn, 它也会自动去下载.
  2. 官方提供的编译脚本, 只有编译, 却没有clean, 所以如果中途报错退出, 并且报错与后文描述不一致的话, 可以尝试将所有源码删除重新来过, 这样通过的概率大一些. 如果您的环境像作者这样, 不是很稳定的话, 强烈建议先将本文通读一遍, 将其中的几个较大的包先下载好, 然后再进行编译, 这样免得花费时间太多. 作者是在尝试了几十次后, 才编译通过的. 所以分享一下经验, 免得后人再走弯路. (本文最后也说明了需要下载的是哪些包, 可以在首次编译通过后, 将这些包备份, 这样以后如果拿到别的机器上再编译就不需要重新下载了)
  3. 一旦开始执行过了官方的compile.sh, 就不要再修改源码的目录名称与位置了, 否则可能会造成下次再编译就不过了, 因为里面有很多绝对路径在编译过程中会固定下来.

3 源码下载

3.1 vlc-android下载

git clone https://code.videolan.org/videolan/vlc-android.git

3.2 检出版本

cd vlc-android
git checkout 2.0.5

如果依照本文说明编译, 请务必检出该版本, 因为官方原版的编译脚本是编译不过的, 需要按照后续步骤改一些bug, 并且我试过临近的几个版本, 没一个能直接编过的, 错误还都不一样, 所以强调该点.

3.3 vlc源码

上面的vlc-android只是android层的封装以及app, 所以还不能独立使用, 还需要vlc的native层的核心源码. vlc的下载路径在:

git clone git://git.videolan.org/vlc.git

这个不需要自己手动check对应的版本, vlc-android的官方编译脚本会自动去做的, 只需要把clone下载的vlc文件夹, 放到上面的vlc-android目录下即可.

其实这步不做也是可以的, 因为编辑脚本会自动去下载vlc源码的, 如果您的网络稳定, 也可以省略该步骤.

4 编译

环境变量设置:

export ANDROID_SDK=/home/xxx/android-sdk-linux
export ANDROID_NDK=/home/xxx/android-ndk-r11
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools

上面的路径分别改成你的环境中对应的sdk与ndk路径.

然后按照官方的说明, 只需要执行:

cd vlc-android
./compile.sh

应该就可以编译通过了. 但是至少作者没有这么幸运, 在经历了n次的折腾后, 总结如下方法, 可以编译通过.

5 所需软件包备份

如上文所说, 编译脚本执行过程中, 会下载很多东西, 而且有些下载后, 原包还删了, 不利于源码的备份, 所以再次说明一下需要哪些包, 以利于您的备份.

作者把上述这些以及vlc与vlc-android备份后, 亲测断网仍然可以编译出来apk. 当然, 上述的包备份后, 是需要放到对应的路径的, 为了方便, 写了个自动拷贝的脚本, 将其中的一些路径改为您的备份路径即可.

我的脚本如下:

# -----------------------------------------------------------------------------
# Env
# -----------------------------------------------------------------------------
export ANDROID_SDK=/home/wuyt/usr/android-sdk-linux
export ANDROID_NDK=/home/wuyt/usr/android-ndk-r11
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools

# -----------------------------------------------------------------------------
# Get all packages
# -----------------------------------------------------------------------------
DOWNLOADS_DIR=$PWD/downloads

# get vlc-android and vlc
version=2.0.5
TOP_DIR="vlc-android_${version}"
if [[ -e ${TOP_DIR} ]]; then
    echo -e "\033[01;31m${TOP_DIR} has already existed, please remove it first.\033[0m"
    exit 1
fi

# Get android-vlc and vlc
tar xf ${DOWNLOADS_DIR}/vlc-android_git_20160811.tar.gz
mv ./vlc-android ./vlc-android_${version}
cd ./vlc-android_${version}/
git co ${version}
tar xf ${DOWNLOADS_DIR}/vlc.tar.gz # 放置下载好的vlc, 就不用在自动去下载了.

# get gradle
sed -i -e 's,wget ${GRADLE_URL}.*,cp ../downloads/gradle-2.10-all.zip .,' compile.sh      # 将下载gradle改为解压本地包

# get sdk-manager-plugin (将下载sdk-manager-plugin改为解压本地包)
sed -i -e 's,git clone https://github.com/JakeWharton/sdk-manager-plugin.git,tar xf ../../downloads/sdk-manager-plugin.tar.gz,' compile.sh

# get vlc/extras/tools/*.tar.gz
cd vlc/extras/tools/
cp ${DOWNLOADS_DIR}/vlc__extras__tools/* ./         # 这里放置vlc/extras/tools下的所有压缩包
cd -

# get vlc/contrib/tarballs/*.tar.xx
cd vlc/contrib/tarballs/
cp ${DOWNLOADS_DIR}/vlc__contrib__tarballs/* ./     # 这里放置vlc/contrib/tarballs下的所有压缩包
cd -

# -----------------------------------------------------------------------------
# Fix bugs
# -----------------------------------------------------------------------------

# Change vlc config
sed -i -e 's/enable-lua/disable-lua/' ./compile-libvlc.sh  # Disable lua
sed -i -e 's/\-llua/\-lvpx/' ./libvlc/jni/Android.mk       # Remove lua lib, and add vpx lib

# Fix bug for code
sed -i -e 's/discoverer_description/discoverer_description_t/' ./libvlc/jni/libvlcjni-mediadiscoverer.c

# -----------------------------------------------------------------------------
# Compile
# -----------------------------------------------------------------------------

time ./compile.sh -a armeabi-v7a 2>&1 | tee mlog

6 参考

官方wiki编译说明