前言
公司项目中使用的libvlcjni.so
库文件,有点老,对Android 6.0+
系统兼容性太差了,当程序运行在Android6.0+
系统上时,回弹出警告框,提示libvlcjni.so:text relocations
异常,虽然,程序播放视频没有问题,但是,总是弹出提示框就非常不友好了,为此,就需要重新编译一个新的库文件。
由于,在编译中遇到了一大堆难题,足足花了3天时间才将VLC-Android
源码编译成功。期间在网上查找了不少参考资料,但是,大都介绍太过详细,好多地方没有将清楚,非常容易误导他人,所以,决定下一篇详细的教程来记录此次编译的过程,希望能给大家带来帮助。
特别感谢 从零开始在Linux编译VLC-Android开源项目 这篇博客给我带来的帮助!
本博客同步发布于XueLong的博客
VLC简介
VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。VLC使用C语言开发,可跨平台编译为其他系统所用;VLC-android
是将VLC
编译为Android
可调用类库(*.so)的工程。
VLC官网
VLC-Android编译官方文档
编译系统配置
- 编译系统环境为:Windows 10 企业版(版本1607)下
VMware Workstation 12 Pro
(12.5.0 build-4352439)中安装的Ubuntu16.04 LTS 64位
虚拟机。保证有一个稳定的网络环境,即使不能FQ也可以完成本次编译。- 本次编译的VLC-Android版本为2.1.16,代码时间为2017-08-10,SHA1 ID:
6a04fdb0f10daf70ec4cc449c78d53c2a379f399
- 本次编译的VLC版本未知,代码时间为2017-08-23,SHA1 ID:
85f0e45b2304afa64ace2e3f0ddc19ad8b5accfb
- VLC编译环境代码
git clone https://code.videolan.org/videolan/vlc-android.git
- vlc源码
git clone http://git.videolan.org/git/vlc.git vlc
编译环境配置
- 编译VLC源码需要安装 JDK、NDK、SDK、automake、ant、autopoint、cmake、build-essential、 libtool、patch、pkg-config、protobuf-compiler、ragel、subversion、unzip、git
- 为了解决编译过程中不能下载
build.gradle
中的依赖环境问题,建议安装Android-Studio
JDK安装及环境变量配置
- 1、下载jdk
- 2、解压并赋权限
sudo tar zxvf ./jdk-8u144-linux-x64.tar.gz
sudo chmod -R 777 jdk-8u144-linux-x64
如果你下载的是zip
格式的则使用下面的命令进行解压
unzip jdk-8u144-linux-x64.zip
- 3、配置环境变量
打开配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾输入环境变量,保存并退出
export JAVA_HOME=/home/skylark/Software/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_BIN=$JAVA_HOME/bin
使环境变量生效
source ~/.bashrc
验证是否配置成功
java -version
- 4、设置为ubuntu默认JDK
sudo update-alternatives --config java #查看根目录的Java,目前只有openJDK
sudo update-alternatives --install /usr/bin/java java /home/skylark/Software/jdk1.8.0_144/bin/java 300 #将oracle JDK安装到根目录
sudo update-alternatives --install /usr/bin/javac javac /home/skylark/Software/jdk1.8.0_144/bin/javac 300 #将oracle JDK安装到根目录
sudo update-alternatives --config java #再次查看Java配置,输入对应序号,选择oracle JDK作为默认Java
SDK安装及环境变量配置
- 1、下载
- 2、解压,将解压后的文件夹命名为
android-sdk
sudo tar zxvf ./android-sdk_r24.4.1-linux.tar
- 3、配置环境变量
打开配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾输入环境变量,保存并退出
export ANDROID_SDK=/home/skylark/Software/android-sdk #VLC编译脚本只认 $ANDROID_SDK 环境变量
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
使环境变量生效
source ~/.bashrc
验证是否配置成功
android list target
NDK安装及环境变量配置
- 1、下载
- 2、解压
unzip android-ndk-r13b-linux-x86_64.zip
- 3、配置环境变量
打开配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾输入环境变量,保存并退出
export ANDROID_NDK=/home/skylark/Software/android-ndk-r13b #VLC编译脚本只认 $ANDROID_NDK 环境变量
export PATH=$PATH:$ANDROID_NDK
使环境变量生效
source ~/.bashrc
验证是否配置成功
ndk-build --version
Android Studio安装
为了解决编译过程中不能下载
build.gradle
中的依赖环境问题,建议安装Android-Studio
如果你可以FQ的话,可以跳过次步骤
android-studio-ide-162.3871768-linux.zip
Android Studio的安装比较简单,由于篇幅的原因,这里就不再介绍了,记得安装时的SDK路径和NDK路径选择上面步骤中我们自己的路径。
官方推荐工具包安装
官方给出了一条指令
sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git
来安装所需要的包环境,建议自己逐条安装,一步一步来,以便清楚的了解到每个包的安装情况。
protobuf3编译及安装
我所使用的代码,在编译环节要求使用protobuf3,而通过protobuf-compiler安装的是libprotoc2.6.1版本,会出现“Unrecognized syntax identifier “proto3”的错误。因此需要手动下载protobuf3,进行安装。
这里我采用的是直接下载protobuf-3.0.0的源码,然后进行编译安装
Google Github Protobuf 安装介绍
- 1、下载
- 2、编译工具准备
sudo apt-get install autoconf automake libtool curl make g++ unzip
- 3、解压
sudo tar zxvf ./protobuf-3.0.0.tar.gz #解压
cd ./protobuf-3.0.0/ #解压出的文件夹
- 4、下载 gmock-1.7.0.zip
在执行 ./autogen.sh
命令时,需要从Q外下载一个 gmock-1.7.0.zip
包,但是,由于网络原因下载失败,所以先提前下载。解压下载的文件,将文件夹重命名为 gmock
,并移动到 protobuf-3.0.0
文件夹下。
- 5、编译安装
cd ./protobuf-3.0.0/ #解压出的文件夹
./autogen.sh #首先生成configure脚本
./configure #运行configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache. #千万不要漏掉了 .
./configure --prefix=/usr #更改安装到/usr
- 6、验证是否安装成功
protoc --version
VLC环境变量配置
为VLC指定要编译的设备类型,不设置环境变量时,默认采用
armeabi-v7a
打开配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾输入环境变量,保存并退出
export ANDROID_ABI=armeabi-v7a
使环境变量生效
source ~/.bashrc
编译开始
经过上面复杂的环境变量配置及编译工具安装,现在我们终于要开始真正的VLC
源码编译了
vlc-andorid源码下载
- 克隆vlc-android源码到本地
git clone https://code.videolan.org/videolan/vlc-android.git #使用git命令从VLC官网获取最新vlc-android代码
- 克隆vlc源码到本地
cd ./vlc-android/
git clone http://git.videolan.org/git/vlc.git vlc #使用git命令从VLC官网获取最新vlc代码
- 修改vlc-android目录下的
build.gradle
//将classpath 'com.android.tools.build:gradle:3.4.1'修改为下面的
classpath 'com.android.tools.build:gradle:2.3.3'
- 修改vlc-android目录下的
compile.sh
将GRADLE标签中的配置修改如下
read -p "skylark:press any key to start #GRADLE" skylark
if [ ! -d "gradle/wrapper" ]; then
GRADLE_VERSION=3.4.1
#skylark: if there is no gradle-v-all.zip,then download it.
if [ ! -a "gradle-${GRADLE_VERSION}-all.zip" ]; then
diagnostic "Downloading gradle"
GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
checkfail "gradle: download failed"
else
echo "skylark:#FUNCTIONS find local gradle-${GRADLE_VERSION}-all.zip"
fi
unzip -o gradle-${GRADLE_VERSION}-bin.zip
checkfail "gradle: unzip failed"
#skylark: change gradle-v-bin.zip downloading url.
echo "skylark: unzip done. Next step will execute gradle-${GRADLE_VERSION}/bin/gradle wrapper.This execution will lead to the downloading of [ gradle-${GRADLE_VERSION}-bin.zip ]. Notice that,you can use a faster download url in gradle-${GRADLE_VERSION}/gradle/wrapper/gradle-wrapper.properties with the value of [ distributionUrl ] AFTER canceling default downloading process (because gradle-${GRADLE_VERSION}/bin/gradle will not be created until this execution)."
echo "Or,you can place your own [ gradle-${GRADLE_VERSION}-bin.zip ] to the location like /home/skylark/.gradle/wrapper/dists/gradle-3.3-bin/64bhckfm0iuu9gap9hg3r7ev2 , and run compile.sh again(if gradle/wrapper exists,you should remove it first to run this part shell of compile.sh)"
read -p "Press any key to continue." skylark
cd gradle-${GRADLE_VERSION}
./bin/gradle wrapper
checkfail "gradle: wrapper failed"
./gradlew -version
checkfail "gradle: wrapper failed"
cd ..
mkdir -p gradle
mv gradle-${GRADLE_VERSION}/gradle/wrapper/ gradle
mv gradle-${GRADLE_VERSION}/gradlew .
chmod a+x gradlew
#skylark : keep this package.
#rm -rf gradle-${GRADLE_VERSION}-bin.zip
fi
echo "skylark : #GRADLE done."
- 将项目导入到
Android Studio
在编译过程中,脚本会去自动下载编译APK所需要的依赖包,但是由于网络原因很难下载下来。
由于公司内部网络不能FQ,所以没有办法下载。但是,想到每次在使用Android Studio
时总是可以下载下来的,于是我就将vlc-andorid
项目导入到Android Studio
,虽然同步失败了,显示有许多错误,但是,当再次执行compile.sh
脚本时,竟然破天荒的下载成功了!
- 执行
compile.sh
脚本,开始编译
如果你看到下面的提示,恭喜你成功了!
编译完成
编译成功后的APK在
/home/skylark/projects/vlc-android/vlc-android/build/outputs/apk/VLC-Android-2.1.16-ARMv7.apk
编译成功后的aar包在/home/skylark/projects/vlc-android/libvlc/build/outputs/aar/libvlc-3.0.0-null.aar
编译出错解决
- 如果在执行compile.sh脚本时,遇到SDK或NDK环境变量未指定,则修改compile.sh,手动写死环境变量
ANDROID_SDK=/home/skylark/Software/android-sdk
ANDROID_NDK=/home/skylark/Software/android-ndk-r13b
ANDROID_ABI=armeabi-v7a
- 如果在执行compile.sh脚本时,遇到
compile.sh: line 283: ./compile-libvlc.sh: Permission denied
,则修改compile.sh
#./compile-libvlc.sh $OPTS
sh compile-libvlc.sh $OPTS
- 如果在执行compile.sh脚本时,遇到
Could not resolve all dependencies for configuration ':classpath'.
,则修改compile.sh
#classpath 'com.android.tools.build:gradle:3.4.1'
classpath 'com.android.tools.build:gradle:2.3.3'
写在最后
以上就是如何在 Ubuntu 16.04 下编译VLC源码的步骤。
如果你在参考过程中遇到问题,可以在我的联系方式中给我提问。
后面会继续介绍,Android的相关知识,欢迎继续关注我博客的更新。