一、前言
本文記錄了編譯VLC-Android的全部過程,由於在老版本的ubuntu及無法翻牆的情況下編譯時會出現許多bug,對於新手來說可以參考使用Ubuntu17.04和翻牆軟件的環境下編譯,這樣會省卻很多不必要的麻煩。主要參考有一下:
a) 官網編譯教程:https://wiki.videolan.org/AndroidCompile
如果是編譯其它平臺上的請參考:https://wiki.videolan.org/Compile_VLC/
b) CSND博客 : http://blog.csdn.net/wkw1125/article/details/56845405
二、系統環境配置
2.1 系統平臺
編譯環境介紹:
.Linux版本:ubuntu17.04(64位)
.JDK:java version “1.8.0_151”
.SDK:jdk8
.NDK:android-ndk-r14b-linux-x86_64.zip
說明:JDK,SDK和NDK是我到官網下載。之所以選擇ubuntu最新版的,是因爲在老版本先編譯時出現許多莫名的bug,解決起來比較棘手。
2.2 安裝編譯需要的軟件
2.2.1 通過官網知道,我們必須安裝部分軟件,不然後面會導致編譯失敗。通過apt-get安裝下列軟件:
sudo apt-get update
sudo apt-get install autoconf
sudo apt-get install libtool
sudo apt-get install automake
sudo apt-get install make
sudo apt-get install m4
sudo apt-get install gawk
sudo apt-get install mawk
sudo apt-get install a.k.a
sudo apt-get install a.k.a
sudo apt-get install g++
sudo apt-get install patch
sudo apt-get install pkg-config
sudo apt-get install Ant
sudo apt-get install cmake
sudo apt-get install protobuf-compiler
sudo apt-get install ragel
sudo apt-get install Subversion
sudo apt-get install git
sudo apt-get install unzip
sudo apt-get install wget
上面這些軟件需要比較新的版本,如gettext 需要0.19.3及以上版本。我們可以使用gettext -V查看使用版本。
如果你是使用在Android-x86設備上,還必須安裝yasm。
對於64位的系統。我們還需要額外安裝一些32位的庫:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install zlib1g:i386 libstdc++6:i386 libc6:i386
對於比較老的系統版本,還需要安裝下面的庫:
sudo apt-get install ia32-libs
對於上面的這些軟件的版本信息要求寫在編譯腳本里:
73 check autoconf 2.69
74 check automake 1.15
75 check m4 1.4.16
76 check libtool 2.4
77 check pkg-config
78 check cmake 3.4.1
79 check yasm
80 check_tar
81 check ragel
82 check_sed
83 check protoc 2.6.0
84 check ant
85 check xz
2.3 安裝JDK、SDK和NDK
2.3.1 安裝JDK
安裝JDK時,有兩種方法安裝,因爲編譯腳本中通過環境變量JAVA_HOME尋找jdK,第二種的自動配置環境變量,所以建議使用第一種方法下載安裝包後本地安裝:
第一種方法:下載安裝包後本地安裝。
1、安裝包下載:jdk-8u121-linux-x64.tar.gz
2、解壓、移動到 /usr/local/jdk8,便於管理。
sudo tar zxvf jdk-8u121-linux-x64.tar.gz
sudo mv jdk1.8.0_151/ /usr/local/jdk8
3、JDK環境變量設置,打開/etc/profile文件,在末尾寫入下面的內容。寫完後終端中輸入source /etc/profile刷新環境變量:
export JAVA_HOME=/usr/local/jdk8
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
4、將安裝的JDK設置爲ubuntu默認JDK
由於Ubuntu安裝openJDK在根目錄下,這會導致Ubuntu將openJDK設置爲默認的JDK(java -version出現“openjdk version 1.8.0_121”),需要將自己安裝的oracle JDK設爲默認。方法如下。命令後面的數字3000表示當前的JDK的優先級,這是系統選擇默認jdk的參考值。可以設置爲任意值:
sudo update-alternatives --install /usr/bin/java java /usr/local/jdk8/bin/java 3000
sudo update-alternatives --install /usr/bin/javac javac /usr/local/jdk8/bin/javac 3000
sudo update-alternatives --config java
選擇自己安裝的jdk即可。
5、驗證:java -version
第二種通過apt-get在線安裝,由於系統中自帶安裝openjdk,最後需要我們選擇使用版本:
(此步驟參考:https://www.cnblogs.com/woshimrf/p/ubuntu-install-java.html)
a) 安裝Jave8
1、 導入Webupd8 PPA
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
2、安裝,選擇確認條款,用Tab鍵切換。:sudo apt-get install oracle-java8-installer
3、 設置爲默認jdk:sudo apt install oracle-java8-set-default
4、確認安裝成功:
輸入:java -version
顯示:java version "1.8.0_151"
顯示:Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
顯示:Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
b) 安裝Java9
1、導入Webupd9 PPA
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
2、 安裝:sudo apt-get install oracle-java9-installer
3、 設置環境變量:sudo apt-get install oracle-java9-set-default
4、驗證
java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
5、在多介紹一個刪除安裝後的JDK命令:sudo apt-get --purge remove oracle-java9-installer
c)多個JDK的切換,選擇需要的版本即可
輸入:sudo update-alternatives --config java
顯示:There are 3 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-9-oracle/bin/java 1091 auto mode
1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-8-oracle/jre/bin/java 1081 manual mode
* 3 /usr/lib/jvm/java-9-oracle/bin/java 1091 manual mode
2.3.2 安裝SDK
1、下載:tools_r25.2.3-linux.zip,Android Studio不是必須
2、解壓:新建一個文件夾/usr/local/sdk,並將tools.zip解壓文件夾移動至其下,解壓出的文件夾名爲tools。
unzip tools_r25.2.3-linux.zip
sudo mv tools/ /usr/local/sdk/
3、SDK環境變量設置,打開/etc/profile,在最後寫入下面的語句,VLC編譯腳本只認 $ANDROID_SDK 環境變量:
export ANDROID_SDK=/usr/local/sdk/
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools1
4、驗證:輸入android命令,若打開了SDK Manager則說明SDK安裝成功,可在SDK Manager中下載需要的SDK版本。建議把5.0(API21)以上的SDK都安裝,後續編譯APK時對版本有要求。
2.3.3 安裝NDK
最新VLC需要NDK r13以上版本
1、下載:android-ndk-r14b-linux-x86_64.zip
2、解壓,移動解壓後文件裏的內容移至/usr/local/ndk:
unzip android-ndk-r14b-linux-x86_64.zip
sudo mv android-ndk-r14b1/usr/local/ndk
3、NDK環境變量,打開/etc/profile
export ANDROID_NDK=/usr/local/ndk
export PATH=$PATH:$ANDROID_NDK
4、驗證,終端輸入:ndk-build
若出現“Android NDK: Could not find application project directory”表示NDK正確安裝,只是沒有待編譯的工程而已,可以android官網下載ndk samples進行編譯(這是一個ndk sample)
三、編譯。
通過第二步我們準備好了編譯的環境,現在我們開始編譯。
1、選擇我們編譯後運行的設備類型,不設置環境變量時,默認採用armeabi-v7a。更多設備類型請訪問官方編譯文檔。打開/etc/profile。在最後添加:export ANDROID_ABI=armeabi-v7a
2、下載vlc-android代碼,在終端輸入下面命令:
git clone https://code.videolan.org/videolan/vlc-android.git
注意:上面的命令從官網得到:https://wiki.videolan.org/AndroidCompile。vlc-android只是編譯android apk所需環境的代碼,其中的compile.sh腳本是主程序,整個腳本運行完畢會生成vlc播放器的apk。該腳本中會下載vlc源碼,並執行另外一個腳本compile-libvlc.sh對vlc源碼進行*.so類庫的編譯。如果只需vlc類庫,可只執行compile-libvlc.sh。這兩個腳本是整個編譯過程的主要腳本,通讀這兩個腳本會對編譯過程有很大幫助。
3、在開始編譯前在下載的vlc-android文件夾下的 local.properties 和gradle.properties 文件中添加下列信息:
sdk.dir=<SDK path from $ANDROID_SDK>
ndk.dir=<NDK path from $ANDROID_NDK>
4、爲了提高編譯效率,可以在gradle.properties 文件中添加下列信息:
org.gradle.parallel=true
org.gradle.configureondemand=true
# If you have a BUNCH of RAM available
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048M
5、開始編譯,在終端輸入(需要根用戶權限):sh compile.sh
此時編譯的是帶bug調試信息的版本,如果需要不帶bug信息的版本可以輸入:sh compile.sh release
編譯過程如果可以的話,請保持翻牆聯網,因爲許多安裝包需要翻牆後才能下載。如果一切順利,編譯會顯示:BUILD SUCCESSFUL。
四、Debugging
下面記錄編譯過程中遇到的bug及解決方法。
1、出現許多次.touch錯誤。這是因爲編譯器的原因出現錯誤,再次運行編譯器即可:sh compile.sh
2、出現編譯器內部錯誤,官方解釋是:Compilation error on Dependencies
Sometimes, especially when gradle dependencies have been upgraded, the compile.sh will fail to refetch dependencies. Just close Android Studio and re-run the script to fix this issue.
解決方法:多次運行編譯器sh compile.sh
五、後記
本文是在使用ubuntu14.04編譯VLC時出現許多bug時的替代方案,由於個人水平有限,無法完全理解整個腳本的執行,所以對於出現的bug無法解決。個人覺得整個老版本ubuntu出現許多莫名的bug是因爲安裝的軟件版本不對的原因。雖然我使用sudo apt-get update後sudo apt-get install 安裝的軟件 都是最新版。但是可能由於軟件源的問題導致軟件並不是最新版。我們可以採用更新源列表後安裝適合版本的軟件。以上只是我的個人猜測,由於時間原因,我沒有繼續驗證我的想法。我採用最新版的ubuntu系統是因爲它安裝的軟件比較新,安裝在VWware中可以方便翻牆聯網。下面是我使用ubuntu14.04真機時遇到的一些問題及解決方法。
一、 gettext的版本問題。官網要求0.19.3及以上。gettext -V查看我的版本是0.18.3所以需要升級,可以下載源碼後本地解壓、編譯、安裝。本地解壓、編譯、安裝命令如下:
tar -xvf 源碼包名
./configure --prefix=/usr/local
make
sudo make install
二、新版VLC要求使用protobuf3
(此部分內容參考:http://blog.csdn.net/wkw1125/article/details/56845405)
從官網git到的VLC在編譯環節要求使用protobuf3,而Ubuntu16.04默認的和通過protobuf-compiler安裝的是libprotoc2.6.1版本,編譯器libprotoc不認識VLC的protobuf3代碼,會出現“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
三、遇到的一個比較有意思的安裝jdk工具的方法:
1)下載
2)解壓
3)移動到/usr/share/jdk8
4)刪除以前軟鏈接,此鏈接是系統默認的執行方法:
sudo rm -rf /usr/bin/java
sudo rm -rf /usr/bin/javac
sudo rm -rf /usr/bin/jar
5)創建新的軟連接
sudo ln -s /usr/share/jdk8/bin/java /usr/bin/java
sudo ln -s /usr/share/jdk8/bin/javac /usr/bin/javac
sudo ln -s /usr/share/jdk8/bin/jar /usr/bin/jar
6)修改環境變量sudo vim /etc/profile
添加下面3行語句
28 export JAVA_HOME=/usr/java
29 export CLASSPATH=.:
7)source /etc/profile:
8)驗證
java -version
四、 編譯過程的BUG
a) 第一個bug
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine java version from '9.0.1'.
這是我們自動配置的android JDK的安裝和環境配置,VLC要求環境配置名有特定寫法:
ANDROID_JDK
解決思路:1:改配置
2:改腳本
我選擇改配置:
(參考:https://www.cnblogs.com/kerrycode/archive/2015/08/27/4762921.html)
linux下查找java的命令:
whereis java
which java (java執行路徑)
echo
二:下面是配置linux的環境變量:
. 修改/etc/profile文件 (全局所有用戶)
vi 此文件/etc/profile
在profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk1.8
export PATH=
export CLASSPATH=.:
.修改.bash_profile文件 (某個用戶權限使用這些環境變量)
.bash_profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk11.8
export PATH=
export CLASSPATH=.:
.shell終端執行下列命令: (臨時用)
export JAVA_HOME=/usr/share/jdk1.8
export PATH=
export CLASSPATH=.:
三. 卸載jdk
·找到jdk安裝目錄的_uninst子目錄
·在shell終端執行命令./uninstall.sh即可卸載jdk。
b) 第二個bug
前面顯示:
NOTE: autopoint (GNU gettext-tools) appears to be missing or out-of-date.
Please install or update GNU gettext tools.
Otherwise, you will not be able to build a source tarball.
後面顯示:
autoreconf: automake failed with exit status: 1
vlc: bootstrap failed
解決方法:
安裝:gettext-tools方法不對。前面安裝時沒有指定暗轉到/usr/local目錄下,所以編譯腳本在環境變量中找不到
#./configure --prefix=/usr/local
#make
#make install
c) 第二個bug,下載超時
curl -f -L -- "http://downloads.videolan.org/pub/contrib/jpeg/jpegsrc.v9a.tar.gz" > "../../contrib/tarballs/jpegsrc.v9a.tar.gz" || ( curl -f -L -- "http://www.ijg.org/files/jpegsrc.v9a.tar.gz" > "../../contrib/tarballs/jpegsrc.v9a.tar.gz" && echo "Please upload this package jpegsrc.v9a.tar.gz to our FTP" )
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
23 5140k 23 1214k 0 0 2049 0 0:42:49 0:10:07 0:32:42 0Receiving objects: 4% (19236/480900), 4.68 MiB | 602.00 KiB/s
curl: (56) Recv failure: Connection timed out
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
6 7 29 7665k1 6 k error: RPC failed; result=56, HTTP code = 20020:07 0
6 7627 348710 2 k 0 0 fatal: The remote end hung up unexpectedly
0 0 171813 2 0 0 2 :03:01:40:91 2 0 :01:01:00:21 4 2 :02:00:30:75 8 0
0
ccuurrll:: ((5566)) RReeccvv ffaaiilluurree:: CCoonnnneeccttiioonn ttiimmeedd oouutt
fatal: early EOF
fatal: index-pack failed
make: *** [../../contrib/tarballs/ffmpeg-5a93a85fd0ad62c6c9cdf69415959f116c015f0e.tar.xz] Error 128
make: *** Waiting for unfinished jobs....
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 976k 100 976k 0 0 35352 0 0:00:28 0:00:28 --:--:-- 41384
Please upload this package jpegsrc.v9a.tar.gz to our FTP
100 5140k 100 5140k 0 0 162k 0 0:00:31 0:00:31 --:--:-- 224k
Please upload this package libiconv-1.15.tar.gz to our FTP
0 0 0 0 0 0 0 0 --:--:-- 0:17:05 --:--:-- 0
curl: (56) Recv failure: Connection reset by peer
make: *** [../../contrib/tarballs/gnutls-3.4.14.tar.xz] Error 56
make: *** Deleting file `../../contrib/tarballs/gnutls-3.4.14.tar.xz'
contribs: make fetch failed
分析:
提示錯誤的有以下,知道連接超時:
....
curl: (56) Recv failure: Connection timed out
......
curl: (56) Recv failure: Connection reset by peer
make: *** [../../contrib/tarballs/gnutls-3.4.14.tar.xz] Error 56
make: *** Deleting file `../../contrib/tarballs/gnutls-3.4.14.tar.xz'
contribs: make fetch failed
解決方法:
根據前面的描述知道在網上下載jpegsrc.v9a.tar.gz並保存到../../contrib/tarballs/下,我們手動下載並保存到相應目錄下../../contrib/tarballs/:
curl -f -L -- "http://downloads.videolan.org/pub/contrib/jpeg/jpegsrc.v9a.tar.gz" > "../../contrib/tarballs/jpegsrc.v9a.tar.gz"
d)第四個bug。檢查libdsm-0.2.8.tar.gz,第一個網站沒有,到第二個網站去下載放入對應的位置。
touch .sum-zvbi
0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0h=`sed -n -e "s,^\([0-9a-fA-F]\{40\}\) ../../contrib/tarballs/ffmpeg-5a93a85fd0ad62c6c9cdf69415959f116c015f0e.tar.xz,\1,p" < "../../contrib/tarballs/ffmpeg-5a93a85fd0ad62c6c9cdf69415959f116c015f0e.githash"` && test "$h" = "5a93a85fd0ad62c6c9cdf69415959f116c015f0e"
touch .sum-ffmpeg
0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0curl: (7) Failed to connect to github-production-release-asset-2e65be.s3.amazonaws.com port 443: Connection timed out
make: *** [../../contrib/tarballs/libdsm-0.2.8.tar.gz] Error 7
make: *** Deleting file `../../contrib/tarballs/libdsm-0.2.8.tar.gz'
contribs: make fetch failed
e)第五個bug。有一些宏沒有定義,可能有一些工具沒有安裝。
configure.ac:20: error: possibly undefined macro: AM_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
autoreconf: /home/huxian/vlc_android/soure_android/vlc-android/vlc/extras/tools/build/bin/autoconf failed with exit status: 1
make: * [.ogg] Error 1
make: * Waiting for unfinished jobs….
configure.in:74: error: possibly undefined macro: AC_DISABLE_SHARED
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.in:75: error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL
configure.in:76: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /home/huxian/vlc_android/soure_android/vlc-android/vlc/extras/tools/build/bin/autoconf failed with exit status: 1
make: * [.a52] Error 1
configure.ac:313: error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:314: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /home/huxian/vlc_android/soure_android/vlc-android/vlc/extras/tools/build/bin/autoconf failed with exit status: 1
make: * [.jpeg] Error 1
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /home/huxian/vlc_android/soure_android/vlc-android/vlc/extras/tools/build/bin/autoconf –include=/home/huxian/vlc_android/soure_android/vlc-android/vlc/contrib/arm-linux-androideabi/share/aclocal –force
configure.ac:108: error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:109: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /home/huxian/vlc_android/soure_android/vlc-android/vlc/extras/tools/build/bin/autoconf failed with exit status: 1
make: * [.libarchive] Error 1
contribs: make failed
安裝最新CMake
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:george-edison55/cmake-3.x
sudo apt-get update sudo apt-get install cmake
問題:vlc configure.ac: not using Libtool
解決方法,不要手動安裝libtool,compile.sh會自動安裝,刪除安裝的libtool:sudo apt-get autoremove libtool