編譯Unity使用的libmono.so


因工作需要,對Unity項目使用的libmono.so文件進行編譯,至於原因眾所周知就是為了加解密代碼,整個過程實施起來並不復雜,只是在一些流程上每個人操作過程可能不一樣,網上的資料會給比較多的困擾。下面記錄一下完整的過程,希望對大家有所幫助。

參考資料,感謝作者:

https://blog.csdn.net/u011312774/article/details/106543862

https://www.cnblogs.com/wuxun1997/p/13364183.html?utm_source=tuicool

https://blog.csdn.net/yangyangyang20092010/article/details/46350519

https://www.cnblogs.com/yaukey/p/compile_unity_mono_source.html


1、編譯平台的選擇,網上資料大多數是Linux或者對應虛擬機編譯,我這邊是因為虛擬機的版本和網絡問題放棄,使用了Win10+MinGW+MSYS來編譯。

      MinGW,Minimalist GNU for Windows,windows最簡化的GNU,就是一個C的編譯工具集。同時,需要通過MSYS使用與編譯相關的命令行,因此,需要同時安裝MinGW和 MSYS。所以下面的步驟都只是針對該搭配組合

2、安裝MinGW,下載對應的mingw-get-setup.exe,我沒用64位的,就32位也可以正常運行,這里重點提示一下,不要安裝到帶空格的目錄或者中文目錄,避免給自己帶來無限的坑,如果經常使用命令行就知道,WINDOW下的空格目錄害人不淺。

下載地址:https://sourceforge.net/projects/mingw/files/

 

 

 

或者官網:http://www.mingw.org/ 

往下拉,看左邊,我覺得sourceforge下載就挺好,因為其他很多配套資源也得去哪里下載,提前熟悉熟悉更方便。

 

 

MinGW我沒找到離線的,在線安裝也是比較慢的,只安裝Basic包就行了 ,先選擇,然后右列的全選,打上標記,之后再選菜單里面的Installation,在選擇Apply,在線安裝最大的坑就是不穩定,多試幾次

 

 

 

 

 

 如果實在不行就嘗試使用命令行安裝,用任務管理器把它kill掉,然后cmd或者powershell進入自己的安裝目錄,我是在D:\MinGW

然后執行命令:

mingw-get install gcc
mingw-get install g++
mingw-get install gdb
如果真的實在不行,那么就去官網去下載對應資源的離線包,就去sourceforge里面找資源了
路徑一般是:https://sourceforge.net/projects/mingw/files/MinGW/Extension/
缺少就去這個擴展包目錄里找,一般找最新的,然后全部下載,壞處就是沒整包下載,下完之后記得拷貝到D:\MinGW\var\cache\mingw-get\packages
也就是安裝包的緩存目錄,再執行對應的命令行就可以了。
如果順利的話,其實過程還是比較容易,遇到的問題基本上按照上面的思路都可以解決。這樣MinGW就安裝完畢,把對應路徑D:\MinGW\bin配置到環境變量里面,這一步安裝就完成了。
可以測試一下,命令行輸入 gcc -v,輸出正確就OK了。

3. 安裝 MSYS

鑒於在線安裝實在太慢,所以建議先下載完畢然后離線安裝msys

下載地址: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/  

這里選擇一個比較新的就行了,區別不大,我選的是截圖里面的。

 

解壓,然后拷貝到自己安裝好的MinGW目錄中,結構如下:

 

 

 這樣就完事了,可以測試一下,進入msys目錄,找到msys.bat,雙擊打開,可以使用Linux下命令行,比如where ls 等等,這里的where找到就是msys\bin里的

 

4、安裝好上面的工具,下載JDK和NDK,JDK我這里用的是1.8,NDK一定要使用r10e的版本,可以根據自己的系統來選擇。官方下載地址(無需FQ):32位 / 64位

這里需要提醒的一點是,要把解壓好的ndk目錄放到D:\MinGW\msys\home\xxx,路徑,同時下一步下載的mono源碼也是同理,意思是放到該賬戶的根目錄。

5、可以進入正題了,下載使用Unity對應版本的libmono庫,git地址:https://github.com/Unity-Technologies/mono, 自行選擇對應的版本就可以,有沒有mbe的都無所謂,只是說不同版本下的mbe可以同時在編輯器和Player模式下使用,通過修改對應的配置,這里忽略了

因為要使用到git,可以用命令行或者github desktop,把資源clone下來,因為git默認是克隆的主干,也就是unity-master的,需要在本地進行分支切換,使用命令行操作

 

git branch -r  查看對應遠程分支版本

git checkout -b <本地分支名字,一般保持和遠程一致> origin/<遠程分支名>,這樣就可以更新遠程分支的資源,同時切換到該分支了

git checkout  <本地分支的名稱>   切換到本地倉庫

OK,到現在為止,我們的工具和資源就准備齊全,下面需要對編譯腳本做一些修改。

6、要修改的內容並不多,建議簡單理解一下,對應目錄在mono\external\buildscripts里面,因為我們只編譯安卓平台,主要是build_runtime_android.sh和build_runtime_android_x86.sh

1)build_runtime_android.sh中添加ndk的環境變量,打開腳本,頂頭位置添加一行 export ANDROID_NDK_ROOT=/home/xxxx/android-ndk-r10e

2)然后找到KRAIT_PATCH_PATH的設置,修改為KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build",在編譯過程中會有git克隆資源,可以保證目錄結構,當然你也可以提前clone下來,那么編譯腳本會跳過克隆部分

 

3)修改文件 build_runtime_android.sh,將 -fpic -g -funwind-tables \ 修改為 -fpic -O2 -funwind-tables \ 以便編譯為 release 版本

4)修改文件 build_runtime_android.sh,只保留 armv7的編譯,注釋掉armv5和armv6的選項

5)修改文件 build_runtime_android_x86.sh,將 -fpic -g \ 修改為 -fpic -O2

6)修改文件 PrepareAndroidSDK.pm,將 elsif(lc $^O eq 'cygwin'的地方修改為elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys'),意思就是加上msys的模式

7)修改 android_krait_signal_handler 編譯腳本,如果已經啟動過第一次編譯並且失敗或者主動 clone 過,那么這里有兩種修改方式,第一是修改mono\android_krait_signal_handler\build目錄中拷貝過來的PrepareAndroidSDK.pm,

修改方式同上,改為 elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。

或者修改對應的build.pl文件,參照截圖修改:

 

 

 因為build.pl生成的目錄為armeabi-v7a,看下面截圖,所以需要修改build_runtime_android.sh中對應的路徑,下面第一個截圖是build.pl中的

 

 以下為sh腳本中的,其實一對照就很明白了。

 

至此,按照以上的步驟,所有過程中的坑基本上都是經歷過了,可以輕松愉快的輸入命令行進行編譯了。

8)運行msys.bat中,命令行中 cd 到對應的mono目錄,執行./external/buildscripts/build_runtime_android.sh,編譯過程根據電腦時間長短不一,我的電腦時間還是比較久,起碼在10分鍾以上

9)生成目錄為builds\embedruntimes\android\armv7a和x86下

 

10)可以愉快的進行修改了,路徑mono\metadata\image.c,簡單說一下,修改入口根據不同的mono版本,函數名字不同,mono_image_open_from_data_with_name或者mono_image_open_from_data_internal

修改時,做個name的判斷,具體可以看網上的一些加密方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM