作为菜鸟到公司的第一天,boss就让我熟悉下VLC的内容,然后总共是第五天才编译出了VLC最新的lib类库和demo工程的apk。之所以标题为“从零开始”,是由于刚接触Linux、shell命令没多久,就要在Linux下进行VLC-Android的交叉编译,尽管只是执行官方的编译脚本,但是新手上路遇到的问题一个接一个。导致五天才编译成功的另外一个原因是,混淆了官方最新代码与公司给的旧版本,所以出现一堆环境配置问题。五天来相当的煎熬,好在前辈们不吝赐教,我也由此对Linux和shell更熟悉了一些,到公司实干还是最锻炼人的。
本文以我作为菜鸟的角度来介绍从零开始,到编译出VLC类库和APK的整个过程,所以也会比较啰嗦。
VLC是一个免费开源的跨平台多媒体播放器和框架,可以播放众多的多媒体文件,DVD、CD、VCD和各种流协议。VLC使用C语言开发,可跨平台编译为其他系统所用;VLC-Android是将VLC编译为Android可调用类库(*.so)的工程。官网建议在Linux下进行编译,由于依赖的工具包很多,并且VLC编译脚本对工具包版本、代码版本都有严格的hash校验,再加上官方说明并不是很照顾新手,所以出现了很多配置问题。
VLC官网:http://www.videolan.org
VLC源码:http://www.videolan.org/vlc/download-sources.html
VLC依赖:ftp://ftp.videolan.org/pub/contrib/ 或 http://download.videolan.org/pub/contrib/
VLC框架介绍:http://www.codeweblog.com/the-architecture-of-vlc-media-framework/
VLC-Android编译官方文档:https://wiki.videolan.org/AndroidCompile/
编译VLC-Android的整体流程基本上按照官方文档进行,但是还是会遇到很多问题只有在编译过程中边查边做才知道是怎么回事。
首先,VLC-Android官网只推荐在Linux系统上进行编译,因此需要安装Linux系统或者虚拟机。
第二,既然是编译Android程序,自然需要安装Android SDK(而Android SDK又要求安装JDK);另外,为了使用许多由C/C++语言编写的第三方库,需要安装Android NDK。
第三,整个编译过程通过shell脚本进行,因此需要对shell命令有一定的了解,能够使用常见的shell命令,能通读脚本,也才容易定位编译出错所在。
第四,编译过程中,脚本会通过git来从官网获得代码,用curl从VLC官网或工具包官网下载大量依赖包,依赖包体积不大,但资源基本都是海外网站,因此如果想通过脚本直接完成编译,你必须要会翻墙(使用VPN)。然而我买了付费VPN翻了墙,下载速度还是很慢。所以,还是要会分析脚本知道脚本在做什么,比如从哪个链接下载什么包放到哪里,这样就可以通过迅雷等工具从其他地方下载依赖包后放到指定文件夹。我五天的编译时间基本都是耗在下载包以及关于依赖包的错误上。只要这些依赖包全部正确,通过脚本编译只是时间问题。
第五,
理想情况下执行脚本即可完成编译,但是国内的脚本其中会调用大量的api或makefile,要会定位出错的位置。
第五,
编译前:
1. Ubuntu下安装JDK、SDK、NDK
2. 安装git等工具包以及automake等编译工具包
3. 各类环境变量的配置
4. 使用git下载vlc-android代码
5. 开始编译
开始编译:
vlc-android只是编译android apk所需环境的代码,其中的compile.sh脚本是主程序,整个脚本运行完毕会生成vlc播放器的apk。该脚本中会下载vlc源码,并执行另外一个脚本compile-libvlc.sh对vlc源码进行*.so类库的编译。如果只需vlc类库,可只执行compile-libvlc.sh。这两个脚本是整个编译过程的主要脚本,通读这两个脚本会对编译过程有很大帮助。
亲身体会!切忌用“不同版本”vlc-android的脚本编译“不同版本”的vlc代码,因为依赖的包不一样。我就因为用官网最新的vlc-android与其中的脚本编译公司给我的较老版本,出现了很多问题。
对后文中多次用到的shell命令,和一些操作方法进行统一的介绍。
1、安装/卸载等需要权限的命令前可以加sudo
表示最大权限
2、解压(tar.gz与zip两种压缩包)
sudo tar zxvf ./xxx.tar.gz
unzip xxx.zip
3、联网安装Ubuntu程序
sudo apt-get install xxx
4、修改环境变量
打开配置文件~/.bashrc
gedit ~/.bashrc
在文件末尾输入环境变量,如:
export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
//(注意,不使用export也可以正确配置,使用export后设置的环境变量可以在其他shell脚本中通过$JAVA_HOME访问,这在编译脚本中会用到)
保存~/.bashrc,退出gedit。
重开一个终端即可使环境变量生效,或者在终端中输入以下命令刷新环境变量:
source ~/.bashrc
编译环境:Windows 10-64bit 下虚拟机装的 Ubuntu 16.04LTS-64bit
编译版本:VLC-2.2.4
以下是官方文档提供的示例安装命令,实际操作中建议一个一个安装,以便知道安装结果。
sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git
以下包依赖其他包,ubuntu会自动一起下载安装;部分包Ubuntu16.04已自带(可更新):
安装包 | 依赖包 |
---|---|
automake | autoconf autotools-dev libsigsegv2 m4 |
ant | ant-optional ca-certificates-java default-jre-headless java-common openjdk-8-jre-headless |
cmake | cmake-data libjsoncpp1 |
libtool | libltdl-dev |
protobuf-compiler | libprotoc9v5 |
git | git-man liberror-perl |
subversion | libapr1 libaprutil1 libserf-1-1 libsvn1 (脚本中使用git,多装无妨) |
unzip | 解压工具,已自带 |
根据官网描述的所有包中,有部分包在示例安装命令中没有出现,做以下分析:
包 | 描述 |
---|---|
make mawk gcc g++ | 已自带 |
gawk | 系统未带,要安装 |
nawk | 找不到这个包,不需安装,百度awk nawk mawk gawk的关系 |
protobuf | 其安装包名为protobuf-compiler,需要安装。【VLC-2.2.4要求protobuf3】,见下文说明 |
curl wget | 下载工具,需要安装 |
gettext | 需要0.19.3以上版本,已自带0.19.7 |
yasm | 如果要为x86设备编译,需要安装 |
我2017.2.24从官网git到的VLC(应该是2.2.4版本)在编译环节要求使用protobuf3,而Ubuntu16.04默认的和通过protobuf-compiler安装的是libprotoc2.6.1版本,编译器libprotoc不认识VLC-2.2.4的protobuf代码,会出现“Unrecognized syntax identifier “proto3””的错误。因此需要手动下载protobuf3,进行安装。
1、查看protobuf版本
protoc --version
2、下载:https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz
3、解压安装:
sudo tar zxvf ./protobuf-cpp-3.1.0.tar.gz #解压
cd ./protobuf-3.1.0/ #解压出的文件夹
./configure #运行configure
make
make check
sudo make install
make clean
sudo ldconfig #更新shared library cache
若以上命令若权限不够(提示“permission denied”),可在命令前加sudo。
4、重开terminal查看protobuf版本,显示:libprotoc 3.1.0
在ubuntu可以直接使用apt-get安装openjdk,环境变量已配好,但是开发最好用oracle官方版本,并自行配环境变量。
1、下载:jdk-8u121-linux-x64.tar.gz
2、解压
sudo tar zxvf ./jdk-8u121-linux-x64.tar.gz
2*、权限:解压出来的文件夹jdk-8u121-linux-x64右下角有锁,表示有权限限制,可在属性中查看访问权限。若要解除权限可以给予root用户权限:
sudo chmod -R 777 jdk-8u121-linux-x64
给该文件夹递归地赋予root权限,不过jdk一般只需只读,所以没必要
3、JDK环境变量(设置方法见本文开头基础知识部分)
#java jdk
export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_BIN=$JAVA_HOME/bin
请注意,重开terminal环境变量才生效,或者在终端中输入source ~/.bashrc
刷新环境变量。
4、验证:输入以下命令,若输出Java相关版本信息说明JDK安装成功
java -version
5、将安装的JDK设置为ubuntu默认JDK
由于Ubuntu可以通过命令联网安装openJDK在根目录下,这会导致Ubuntu将openJDK设置为默认的JDK(java -version
出现“openjdk version 1.8.0_121”),需要将自己安装的oracle JDK设为默认。方法如下:
#查看根目录的Java,目前只有openJDK
sudo update-alternatives --config java
#将oracle JDK安装到根目录
sudo update-alternatives --install /usr/bin/java java /home/wkw/sdk/jdk1.8.0_121/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/wkw/sdk/jdk1.8.0_121/bin/javac 300
#再次查看Java配置,输入对应序号,选择oracle JDK作为默认Java
sudo update-alternatives --config java
#再次验证Java版本,可看到切换回了oracle Java
java -version
在这之前最好先安装好JDK,因为Android使用JDK
1、下载:tools_r25.2.3-linux.zip,Android Studio不是必须
2、解压
unzip tools_r25.2.3-linux.zip #解压出的文件夹名为tools,不可改名,见后文
3、SDK环境变量
#android sdk
export ANDROID_SDK=/home/wkw/sdk/tools #VLC编译脚本只认 $ANDROID_SDK 环境变量
export PATH=$PATH:$ANDROID_SDK:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
注意:要把$ANDROID_SDK添加进PATH才能使用android等命令,网上很多教程没这么做
4、验证:输入以下命令,若打开了SDK Manager则说明SDK安装成功,可在SDK Manager中下载需要的SDK版本
android
5、关于SDK文件夹的命名
unzip tools_r25.2.3-linux.zip
解压出文件夹名为tools,为方便管理想改名,但是发现改名后运行android命令提示“android: can’t find sdkmanager.jar”,不改名则正常运行。猜测应该是android命令查找sdkmanager.jar的路径名写死为tools/lib/sdkmanager.jar导致,不深究了
最新VLC-2.2.4需要NDK r13以上版本
1、下载:android-ndk-r13b-linux-x86_64.zip
2、解压
unzip android-ndk-r13b-linux-x86_64.zip #解压出的文件夹名为android-ndk-r13b
3、NDK环境变量
#android ndk
export ANDROID_NDK=/home/wkw/sdk/android-ndk-r13b #VLC编译脚本只认 $ANDROID_NDK 环境变量
export PATH=$PATH:$ANDROID_NDK
4、验证:
ndk-build
若出现“Android NDK: Could not find application project directory”表示NDK正确安装,只是没有待编译的工程而已,可以android官网下载ndk samples进行编译(这是一个ndk sample)
使用git命令从VLC官网获取最新vlc-android代码(约24M)
git clone https://code.videolan.org/videolan/vlc-android.git
注意:vlc-android只是编译环境的代码,不是vlc源码。vlc源码(约400M)的git地址在vlc-android/compile.sh脚本里定义
===Building===
建立Gradle系统
(从这里开始,最要阅读下vlc-android/compile.sh和compile-libvlc.sh)
明天继续。。。
原文:http://blog.csdn.net/wkw1125/article/details/56845405