Linux系統編譯VLC-Android

一、前言

本文記錄了編譯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=.:CLASSPATH: JAVA_HOME/lib:JAVAHOME/jre/lib30exportPATH= PATH:JAVAHOME/bin: JAVA_HOME/jre/bin
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 JAVAHOMEecho PATH
二:下面是配置linux的環境變量:
. 修改/etc/profile文件 (全局所有用戶)
vi 此文件/etc/profile
在profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk1.8
export PATH=JAVAHOME/bin: PATH
export CLASSPATH=.:JAVAHOME/lib/dt.jar: JAVA_HOME/lib/tools.jar
.修改.bash_profile文件 (某個用戶權限使用這些環境變量)
.bash_profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk11.8
export PATH=JAVAHOME/bin: PATH
export CLASSPATH=.:JAVAHOME/lib/dt.jar: JAVA_HOME/lib/tools.jar
.shell終端執行下列命令: (臨時用)
export JAVA_HOME=/usr/share/jdk1.8
export PATH=JAVAHOME/bin: PATH
export CLASSPATH=.:JAVAHOME/lib/dt.jar: JAVA_HOME/lib/tools.jar
三. 卸載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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章