這篇文章用於記錄在Mac上編譯vlc-android源碼的過程以及遇到的各種坑。
vlc-android源碼網站:https://code.videolan.org/videolan/vlc-android
編譯指導wiki網址:https://wiki.videolan.org/AndroidCompile/
下載vlc-android
使用git下載將vlc-android下載到本地。
git clone https://code.videolan.org/videolan/vlc-android.git
Android相關的工具
最好將Android SDK中的tools和platform及編譯sdk更新到最新。NDK的版本需要13+,最好更新到最新版本,使用低版本的NDK會報錯。
在當前用戶的.bash_profile文件中將SDK和NDK的安裝路徑添加到path中:
export ANDROID_SDK=/xxx/xxx/android-sdk
export ANDROID_NDK=/xxx/xxx/android-ndk
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools
下載其它軟件包
wiki上Ubantu系統上需要安裝的軟件包:
sudo apt-get install automake ant autopoint cmake build-essential libtool \
patch pkg-config protobuf-compiler ragel subversion unzip git \
openjdk-8-jre openjdk-8-jdk
Mac上可以參照這個安裝相關的軟件,如果已安裝,則可以跳過。如果沒有安裝Homebrew,需要先安裝該軟件包。具體安裝步驟請查看:https://brew.sh/index_zh-cn.html。然後使用brew命令安裝所缺的軟件包。
安裝過程中遇到的一些問題:
使用brew install autopoint
安裝autopoint軟件包,運行結果如下:
MacBook-Air:~ $ brew install autopoint
Error: No available formula with the name "autopoint"
==> Searching for a previously deleted formula...
Warning: homebrew/core is shallow clone. To get complete history run:
git -C "$(brew --repo homebrew/core)" fetch --unshallow
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.
提示錯誤:Homebrew庫中並沒有該軟件包。
google上找了一大圈,才發現Mac中並沒有這個軟件包。最後在Homebrew的git上的[autopoint #24070]
(https://github.com/Homebrew/legacy-homebrew/issues/24070)問題中找倒解決辦法。其實這個軟件包被存放到gettext中,使用brew install gettext
安裝該軟件。它會被安裝到/usr/local/Cellar目錄中,在gettext/0.19.8.1/bin目錄中便有autopoint。需要將‘/usr/local/Cellar/gettext/0.19.8.1/bin’添加到path,這樣就能使用autopoint。
編譯
進入到vlc-android工程的根目錄,執行如下命令:
./compile.sh
在編譯的過程中遇到了不少問題:
1,sha1sum錯誤
錯誤信息:
./compile-libvlc.sh: line 768: sha1sum: command not found
直接使用brew install sha1sum
命令安裝,結果安裝失敗,提示沒有sha1sum。在HOWTO: Install md5sum & sha1sum on Mac OS X這篇博客中找到軟件包的名稱:md5sha1sum。然後使用brew install md5sha1sum
命令安裝。
2,GP錯誤
錯誤信息:
{standard input}: Assembler messages:
{standard input}:146: Error: unknown register alias 'GP'
clang38: error: assembler command failed with exit code 1 (use -v to see invocation)
需要修改vlc-android/vlc/contrib/src/ffmpeg/rules.mak文件,在該文件的FFMPEGCONF配置中添加’–disable-asm \’。
添加結果如下圖:
3,網絡問題
google被牆,導致constraint-layout的pom下載失敗。錯誤信息:
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':vlc-android'.
> Could not resolve all dependencies for configuration ':vlc-android:_chromeMIPS64SignedReleaseApkCopy'.
> Could not resolve com.android.support.constraint:constraint-layout:1.1.0-beta1.
Required by:
project :vlc-android
> Could not resolve com.android.support.constraint:constraint-layout:1.1.0-beta1.
> Could not get resource 'https://maven.google.com/com/android/support/constraint/constraint-layout/1.1.0-beta1/constraint-layout-1.1.0-beta1.pom'.
> Could not GET 'https://maven.google.com/com/android/support/constraint/constraint-layout/1.1.0-beta1/constraint-layout-1.1.0-beta1.pom'.
> Remote host closed connection during handshake
開啓Android Studio,點擊“SDK Manager”圖標,在彈出的“Default Preferences”設置框中選擇“SDK Tools”項,然後勾選“Show Packages Details”,繼續勾選“ConstraintLayout for Android”和“Solver for ConstraintLayout”,再點擊“OK”按鈕,便會自動下載ConstraintLayout相關aar文件。
如下圖:
下載下來最新的ConstraintLayout版本爲1.0.2,需要將工程根目錄的build.gradle文件中”constraintLayoutVersion = ‘1.1.0-beta1’”中的’1.1.0-beta1’改爲’1.0.2’。
再次運行./compile.sh
,又報出編譯問題:
vlc-android/build/intermediates/data-binding-layout-out/vanillaARMv7/debug/layout/info_activity.xml:152: AAPT: No resource identifier found for attribute 'barrierDirection' in package 'org.videolan.vlc.debug'
vlc-android/build/intermediates/data-binding-layout-out/vanillaARMv7/debug/layout/info_activity.xml:152: AAPT: No resource identifier found for attribute 'constraint_referenced_ids' in package 'org.videolan.vlc.debug'
出錯的佈局文件位置:
<android.support.constraint.Barrier
android:id="@+id/barrier"
android:layout_width="0dp"
android:layout_height="0dp"
vlc:layout_constraintTop_toTopOf="@id/length_title"
vlc:layout_constraintBottom_toBottomOf="@id/size_title"
vlc:barrierDirection="end"
vlc:constraint_referenced_ids="size_title, length_title"/>
這是因爲1.0.2版本的ConstratintLyaout中無android.support.constraint.Barrier這個類,所以info_activity.xml中’barrierDirection’和’constraint_referenced_ids’獲取不到對應的資源。於是,又將build.gradle文件中constraintLayoutVersion信息改回’1.1.0-beta1’。
再次運行compile.sh文件,結果還是無法獲取pom。
在網上查看許多博客和文檔,最後發現工程根目錄的build.gradle文件maven中的url有一個可選項,於是將url改爲可選的值。如下所示:
allprojects {
repositories {
maven {
//url 'https://maven.google.com'
// Alternative URL is 'https://dl.google.com/dl/android/maven2/'
url 'https://dl.google.com/dl/android/maven2/'
}
jcenter()
}
}
繼續運行./compile.sh
,等待了幾分鐘,終於編譯成功。
運行
編譯生成的apk在vlc-android/build/outputs/apk/VLC-Android-2.1.16-ARMv7.apk。
使用x86的模擬器運行apk,結果安裝後運行失敗。以爲生成的apk有問題,使用手機運行,能夠正常運行。模擬運算失敗的原因是不支持生成的so文件。
運行截圖:
總結
網絡實在是影響編譯最大問題,需要一把暢通的梯子,能夠下載SDK,NDK和工程中引用到的第三方軟件或工程。還有就是最好使用Ubantu或其它linux系統來編譯,這樣遇到的問題會少很多。
如果覺得使用命令行不是很方便,也可以使用Android Studio導入工程,然後Run和修改。
參考博客
Android版本-編譯VLC
http://hanhailong.com/2015/10/27/Android%E7%89%88%E6%9C%AC-%E7%BC%96%E8%AF%91VLC/
【VLC-Android】Mac下編譯vlc-android
http://www.cnblogs.com/over140/p/3924209.html
Mac OS 下編譯Vlc for android
http://www.jianshu.com/p/9b35e3fd2c8c