MC源碼那些事

19w36a版本開始,Mojang決定放出自己的代碼混淆映射表,不少消息也隨之傳出:MC開源了?Forge退役了?源碼看起來更方便了?本人準(zhǔn)備在這篇專欄里進(jìn)行一定的解釋。詳細(xì)的原理和技術(shù)細(xì)節(jié)不會(huì)過于深入,一是自己學(xué)藝不精,二是這些領(lǐng)域比我更有發(fā)言權(quán)的大有人在。這里只算是科普和拋磚引玉。
首先,反混淆表是啥?
首先有必要簡單解釋一下混淆映射表是什么東西:
我們一般學(xué)習(xí)編寫的代碼,是“源代碼”,它們對于人來說有易辯識(shí)的邏輯結(jié)構(gòu),也方便計(jì)算機(jī)處理。
源代碼會(huì)被計(jì)算機(jī)分析,再變成可以快速處理執(zhí)行的“字節(jié)碼”,這個(gè)過程是Java的編譯。無關(guān)重要的變量名,注釋都會(huì)舍棄。
在編譯的時(shí)候,如果要顧及法律層面(例如不想讓其它公司知道自己代碼的思路),還會(huì)對類和方法的名稱進(jìn)行重命名,降低可讀性。這一步叫做“混淆”。
字節(jié)碼被反編譯之后,雖然注釋和名稱都會(huì)丟失,但是邏輯關(guān)系還在??梢愿鶕?jù)常量,外部包的使用,邏輯,文件操作來理解源代碼的思路,重新命名成人能快速理解的名字。這是“反混淆”。
而混淆映射表可以把反編譯后的代碼還原回源碼的命名風(fēng)格。一般人們用它保存反混淆的結(jié)果。

以上便是粗略的解釋。有了官方的映射表以后,反編譯者不需要花費(fèi)精力找出某個(gè)代碼到底是干啥的,可以專心分析代碼產(chǎn)生的效果。這也正是Mojang在官網(wǎng)上所說的:(https://www.minecraft.net/zh-hans/article/minecraft-snapshot-19w36a)
“This means that anyone who is interested may deobfuscate the game and find their way around the code without needing to spend a few months figuring out what’s what.”

所以說,MC開源了?
只關(guān)心結(jié)果的話,是的。
但是Mojang和微軟并沒有更改任何代碼相關(guān)的法律條款。使用者仍然需要承擔(dān)法律風(fēng)險(xiǎn)。(參見https://www.minecraft.net/zh-hans/article/minecraft-snapshot-19w36a)
不過Mojang對于mod和其它用途的逆向工程一直是默許,甚至歡迎的。之前的minecon邀請了幾位知名國外modder,這次又邀請了scicraft成員,不難看出他們的態(tài)度。之前也對mc的幾個(gè)庫進(jìn)行了開源,這次的映射表想必也可以放心使用。
另外,開源是放出源代碼,而要使用映射表,則需要先進(jìn)行反編譯,再映射。反編譯出來的代碼不保證一定能再編譯成字節(jié)碼...
由此看來,開源作為口頭上不精確的表達(dá),問題不大。書面使用的時(shí)候應(yīng)該進(jìn)行注意。

Forge退役了嗎?
首先,問出這個(gè)問題說明不懂什么是Forge。真正著手源碼反編譯反混淆的項(xiàng)目叫做MCP(MinecraftCoderPack)。為了給許許多多的mod提供一個(gè)兼容高,bug少,做起來方便的平臺(tái),于是就有了基于MCP是Forge。以上是MCP和Forg的簡單辨析。
就算你知道源代碼是啥,這個(gè)mod改一點(diǎn),那個(gè)mod改一點(diǎn),遲早要沖突,那么就要Forge來協(xié)調(diào)。LiteLoader是做這個(gè)的,F(xiàn)abric(基于Yarn進(jìn)行反混淆)也是做這個(gè)的。
就算是MCP本身也不會(huì)退役。它已經(jīng)采取和官方不同的一套命名規(guī)范,大規(guī)模改動(dòng)去迎合官方可能性不高。但是有了官方映射表,新版本的跟進(jìn)會(huì)方便一些。

這么說來,反混淆的放出簡化了不少工作,但并不會(huì)對現(xiàn)有的社區(qū)生態(tài)有較大的改變。
個(gè)人推測這是mojang為了吸引技術(shù)玩家進(jìn)駐高版本拋出的一個(gè)橄欖枝。但是由于每個(gè)版本都會(huì)改變不少東西,F(xiàn)orge還得辛辛苦苦做API,技術(shù)玩家還得重構(gòu)紅石機(jī)器研發(fā)新思路,此舉可能收效甚微。
不過就算這樣,技術(shù)玩家終于不用對著高版本里奇怪的變量名抓耳撓腮了。雖然一直說著neverupdate,但是能發(fā)掘出更多的新特性,也是挺有意思的(然后發(fā)掘完了繼續(xù)neverupdate)
