全文較長,但是面面俱到的寫了我遇到的很多問題,希望能幫到你
前言:
最近在弄網安實操結合的小游戲 Demo,跟老師目前討論的是需要發布手機平台,第一步是Android平台,因為微信小程序表現不出那種真實感,所以繼續用Unity3D進行開發。雖然我對unity3d有過幾年的開發經驗,但是沒有真正接觸過手機平台,都是在PC和web端。接下來是踩過的那些坑,更多的是跟sqlite相關的。
最后卡住我的問題是這個 android - Unity SQLite conection unable to open database file - Stack Overflow 在這個問題上,我卡了很久,一天差不多得有了,幸好最后解決了,沒白瞎這些功夫,利用這些時間,也弄懂了許多地方,接下來一一道來:
一、發布Android到底需要多少dll和so文件
首先要知道的是dll文件是干啥用,中文是動態鏈接庫,簡單的說就是,提前做好的一些函數放在里面了,然后程序可以從里面調用,問題是,實際上 dll 是windows平台下的概念,也就是說如果在PC下運行的好好的,到了Android運行有問題,那么一定是so文件的問題,而不是dll文件的問題。
然后,so文件是什么呢,是給Android用的,在pc環境下有沒有或者對不對,對Editor運行的結果都沒有影響。so文件其實可以理解為Linux的動態鏈接庫。因為Android和Linux的架構是一致的,所以才會用到so文件。
- 針對sqlite3我們需要這幾個文件:Mono.Data.Sqlite.dll(從對應版本的unity目錄 Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0 中復制) 和 sqlite3.dll(從官網 https://www.sqlite.org/download.html 中下載適合開發用電腦的版本,而不是Android版本)
- 針對發布Android平台,我們需要再加這幾個文件:System.Data.dll(從對應版本的unity目錄 Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0 中復制) 和 libsqlite3.so(在此下載)
二、dll文件和so文件的配置問題
首要問題是下載正確的版本,上一節已經講了,然后現在需要做的是在Unity中配置相關的屬性,這里需要提的一點是版本!Unity3D的版本!並不是所有版本都是穩定的,比如我以前的隨筆中提到過的發布web GL的問題:IL2CPP問題,就是個版本問題,不過Android的目前看來是最新的穩定版本肯定最好用。我現在是 2019.2.0 版本,導出的APK無誤。
Mono.Data.Sqlite.dll 和 sqlite3.dll文件的配置都是一樣的:
System.Data.dll文件的配置:因為這個是只給Android用的,需要打包在包里,而在PC環境中不需要,所以只選擇安卓平台。如果全平台,會跳紅bug,在2017版本中是沒有這個bug的,在2019版本中就有了,我是在升級之后遇到的這個問題,就是告訴你這個文件多余的意思,這時候不要刪除,雖然unity editor測試很好,但是apk之后沒有這個文件,程序依舊GG,請如下配置。
libsqlite3.so文件的配置:正如我前文提到的so文件對應平台的,在舊的unity版本中,發布Android是全平台的,也就是說unity3d默認你的so也適應全平台,但是網上下載的這里的so文件只對應armv7平台(也就是主流的平台,v8向下兼容),故應該這樣配置。
如果so文件配置不好,很容易出現下圖的問題 Database is not open ******balabala
三、發布時候需要注意的事項
兩個常見打包問題在另一篇隨筆中有提到,一個是打包位置的問題,一個是net 2.0的問題然后這里還有個問題是:一定要在Project setting 的 Player setting中的other setting的configuration中勾掉不需要的平台也就是這里:
四、這四個所需的文件應該放在哪里?
現在網上的大多數說法,其實都在照搬,也沒說為什么。實際上dll文件和so文件確實就要放在一個Plugins文件夾下,需要打包的屬於需要配置的文件都要放在這里面,然后.db數據庫文件就不需要那樣復雜了,可以像我這樣放在Asset/Android下的assets下,也可以放在Assets新建的StreamingAssets下,都是可以的,只要最后Android平台的時候能獲取並復制到就ok了。
還在開發中,肯定還會遇到其他問題,未完待續。。。