總的筆記:https://www.cnblogs.com/guobaoxu/p/12055930.html
在漢化過程中,不可避免的,會遇到要修改代碼中字符串的情況,而Android端的代碼有兩種腳本后端,Mono和il2cpp,本文針對Mono來講。首先比較基本的,Mono腳本后端會把代碼編譯進DLL里,然后放在assets\bin\Data\Managed文件夾下,在沒有其他安全措施的情況下,我們可以直接用dnSpy來處理
dnSpy:https://github.com/0xd4d/dnSpy
一個開源工具,主要用於C#代碼的逆向,目前已經支持直接編輯DLL中的代碼
下面開始介紹具體過程:
一、樣例
一個簡易的樣例,頁面上一個UI/Text,綁定一個腳本,腳本代碼如下
1 public class MyScript : MonoBehaviour 2 { 3 void Start() 4 { 5 var text = gameObject.GetComponent<Text>(); 6 text.text = "my string"; 7 } 8 }
運行效果如下:
二、修改
因為我們不考慮其他安全措施,所以對apk的處理就簡單粗暴一下,直接用解壓軟件打開,把assets\bin\Data\Managed文件夾整個拖出來,可以看到他的內容如下:
一般來說,開發者開發的代碼在Assembly-CSharp.dll中,但是還是要把整個文件夾拖出來,因為會有引用關系的。把所有的DLL都放進dnSpy里,我的Demo很簡單,所以直接展開Assembly-CSharp.dll的話,就可以直接看到反編譯后的代碼了,效果如下:
可以看到和源碼甚至相差無幾,直接在方法內的代碼處右鍵,這里右鍵菜單里有兩個“編輯函數”,齒輪的那個是方法的一些屬性用的,我們用【另一個】,在彈出的編輯框里直接改代碼就好了,和正向開發中的一樣,然后點擊右下角【編譯】按鈕。
然后要保存回DLL,菜單欄-文件-保存模塊,確定。
最后壓回apk,因為DEMO沒有安全措施,所以直接壓縮后就可以安裝了,運行起來,效果如下:
三、補充
Demo因為太簡單了,直接展開Assembly-CSharp.dll就找到了要修改的類,但是實際上遇到的游戲都不會這么簡單,所以搜索上也是一個麻煩的事情,dnSpy中按Ctrl+Shift+K,可以彈出搜索框,類型選擇【數字/字符串】,范圍選【所選文件】,可以很快搜索到。
可以看到,如果沒有安全措施,用的又是Mono后端,那么你的代碼可以說是基本裸奔的狀態,要修改簡直易如反掌,所以Mono腳本后端現在多被用在開發過程中快速迭代使用,而不用於最終上線版本。