系列文章
- LIBDSM庫對多平臺、多方案支持的開發與探索 - 準備
- LIBDSM庫對多平臺、多方案支持的開發與探索 - Native Common
- LIBDSM庫對多平臺、多方案支持的開發與探索 - iOS
- LIBDSM庫對多平臺、多方案支持的開發與探索 - Android
- LIBDSM庫對多平臺、多方案支持的開發與探索 - Flutter
- LIBDSM庫對多平臺、多方案支持的開發與探索 - Unity
項目地址 - https://github.com/biezhihua/libdsm
前言
已經入行很久了,心中一直有個想法,就是寫個能夠爲大家所用的、支持多平臺的基礎庫。
主要目標有如下:
- 一個是能帶來一些成就感
- 一個是能夠熟悉更多一些的技術細節
- 一個是能夠對多平臺支持的架構設計能有一些心得
奈何種種情況之下,這個想法一直沒有達成,趁着春節,花了不少時間,終於完成了該想法。
目前針對於客戶端iOS和Android平臺,從底層到上層的的實現,各自有如下技術棧:
-
Android:
- Java/Kotlin + JNI + C/C++
- 產物: .aar
- Java/Kotlin + JNI + C/C++
-
iOS:
- OC/Swift + Birdge + C/C++
- 產物: .framework
- OC/Swift + Birdge + C/C++
-
Flutter:
- Dart + Dart Channel + Platform Plugin:
- Android Plugin: Java/Kotlin + AAR
- iOS Plugin: OC/Swift + Framework
- Dart + Dart FFI + C/C++:
- https://flutter.dev/docs/development/platform-integration/c-interop
- Dart + Dart Channel + Platform Plugin:
-
Unity3D (僅Android):
- C# + AndroidJNIModule + aar
這次的Code,也同時涉及這四個方面,分別會給出各自方案的實現。
對於DSM,這裏簡單介紹一下,這是一個用C寫的,SMB的客戶端簡版實現,由VLC團隊維護。
無意中發現該DSM庫,在各個平臺上並沒有開源的實現,故此,造一個輪子。
架構
架構以簡單明瞭爲原則,選取已實現的部分,作爲子項。
可以看到,整個的實現方案是以雙端Android和iOS的實現方案爲基礎,擴展到Flutter和Unity3D的。
並且,爲了能夠最大程度的複用,是將純C/C++作爲一個獨立的模塊。
以此圖爲架構,就能完成一個,適用於雙端的、支持原生Android、原生iOS、Flutter、Unity3D的DSM庫。
構建
由於目前的方案是基於DSM©在雙端平臺的封裝實現,自然一個前提就是首先構建出來DSM用於支持雙端架構(ARCH)的的靜態庫(.so)和動態庫(.a)。
DSM實現的很好,但是奈何在編譯產出這一步,比較繁瑣艱難。
這裏使用libs-build-tool
,可以快速協助構建產物。
Android:
/android.sh -c && ./android.sh --enable-libdsm --arch-all
iOS:
./ios.sh -c && ./ios.sh --arch-all --enable-libdsm
最後的產物結果目錄如下:
Android:
libdsm
|
|---- include
|
|---- lib
|
|---- arch
|
|---- libcharset.a
|---- libdsm.a
|---- libiconv.a
|---- libtasn1.a
iOS:
libdsm
|
|---- include
|
|---- lib
|
|---- libcharset.a
|---- libdsm.a
|---- libiconv.a
|---- libtasn1.a
構建好產物之後,現在開始各個平臺的開發。
引用
- https://github.com/videolabs/libdsm/
- https://github.com/biezhihua/libdsm
- http://videolabs.github.io/libdsm
- https://github.com/biezhihua/libs-build-tool