用unity開發的遊戲,打包成android平台的apk檔案之後,如果解開這個apk,會在assets\bin\data目錄下看到大量的檔名很長而且無意義的檔案。像下圖這樣。本文要分析的就是這些檔案。
首先要感謝unitystudio的作者的辛勤工作,我也正是從他的**中才學到這些知識的。在此整理出來供大家一起交流,同時也作為我自己學習歷程的記錄。
這裡分析的是unity 4.6.x版本的unity生成的asset檔案格式,5.x以後的版本在格式上會有一些調整,但是不會差別太大。確實需要的,就自己查閱unitystudio的源**吧。
在unity中,有兩種訪問資源的方式,一種是使用assetbundle,這是unity提供的一種資源打包格式;另一種就是直接用resources.load()方法。而本文的目標檔案是第二種方式可以讀取的檔案。當unity工程在編輯器模式下執行的時候,他會直接訪問放在工程的resources目錄下的資源,而當打包成apk發布的時候,unity把這些資源全都打散了,然後把資源的檔名都變成了上圖中顯示的檔案hash值。這麼做的原因,我個人猜測,一方面是為了保護遊戲開發者的資源,另一方面也可以加快資源訪問的速度。
這些檔案其實都是以asset檔案的格式組織的。在這一堆檔案中,應該還有乙個檔名不奇怪,且體積相對比較大的檔案,這個檔案就是所有這些檔案的組織者,或者叫領導。這個檔案一般應該叫maindata,或者unity.assets。從這個檔案入手,就能把所有的這些檔案都串起來。
和很多標準格式一樣,asset檔案格式也是由檔案頭,若干資料描述塊,和若干真實資料構成。若用c#語言描述,其結構為:
struct assetfileheader
然後接下來跟著的是n塊資料區。結果定義如下:
struct basedata
上面的basestruct陣列,當basecount為0時,結構也是不存在的,不占用空間。其結構如下:
struct baststruct
struct memberstruct
todo :至於這個結構裡儲存的是什麼資料,目前還沒遇到帶有這個結構的資源檔案,碰到的時候再補上。
接下來就是我們最關心的asset結構了
struct assetdata
sturct assetstruct
struct sharefilestruct
再後面跟著的就是asset的真實資料了。原則上根據不同的asset型別,正確的反序列化出來,就能得到能使用的資源了。
再說那些用hash值做名字的檔案,其實這些檔案都會在這個maindata檔案中有引用,他們的格式也是上面列出的asset檔案格式。因此,從maindata檔案開始,遞迴的處理好所有依賴的asset檔案,就能訪問到這個目錄下所有的檔案。
最後要宣告,我不鼓勵任何破解他人的遊戲來竊取他人勞動成果並用於非法用途的行為。但是根據本文的知識,我們看到提取他人未保護的資源並不難。所以要想更好的保護自己的勞動成果,應該考慮其他資源的加密方法。這方面的知識,可以參考趙四同學的部落格,後續我也會在我的部落格裡寫一些我自己的學習成果(但是只會有相關的技術**,而不會有針對特定應用的破解教程)。
unity打包APK報錯
unity打apk,總是彈出下面的提示框 可是在android studio中我已經把sdk更新了,不管了,統統點了use hightest installed按鈕,結果打包報錯了 網上搜了一堆辦法都不行,無意中看到了sdk的路徑,unity裡寫的是sdk的安卓路徑 然後看到android stud...
unity 打包apk 崩潰記錄
最近在做乙個專案,碰到乙個詭異的問題。專案好像變得很脆弱,只要進資源,打包時候就會崩潰 could not allocate memory system out of memory 然後如履薄冰的去刪資源,刪乙個資源,打包測一次,刪乙個測一次。問題持續了一月之久。因為專案不是我啟動的,我是半道接手的...
打包AS中的APK檔案
2 簡單點說就是給你的apk發身份證,上戶口,防止和你長的一樣的人,假冒你。這裡的apk身份證就是我們的 jks 檔案。所以這個jks檔案很重要。如果你同一 生成兩個jks檔案打包,那就代表的是兩個軟體。打包當然有很多種途徑,可以用as自帶的簽名,也可以通過gradle簽名等,這裡就講講常規的。2....