Cocos Creator Android 打包疑難雜癥記錄

Android Studio 運行 Apk,不會采用最新構建的 Cocos 內容問題

每次在Cocos構建項目后,在Android Studio上點擊 Run,「可能」會發現這次Run,并不會采用剛剛構建的Cocos內容!??

劃重點: 「可能」

  • 有些人/電腦/AndroidStudio版本 會 立即采用剛剛構建的 Cocos 內容
  • 有些人/電腦/AndroidStudio版本 不會 立即采用剛剛構建的 Cocos 內容

如果這個能引起你的共鳴,那么不妨試著看下去~

Cocos & Android 構建原理

解決這個問題,我們可以先大概了解一下 Cocos & Android 的一些構建原理:

1.Cocos 構建資源會放在 Android 項目的 assets 資源目錄中
2.app 運行時,讀取 assets 資源目錄,從而獲取到 Cocos 構建后的資源

這里面,我們重點探究的是 Cocos 是怎么將構建的內容放到 Android 的 assets 資源目錄中呢?

這個操作其實在構建后的 app/build.gradle 中,關鍵代碼如下:

android.applicationVariants.all { variant ->
    // delete previous files first
    delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"

    // 復制 Cocos 資源到 Assets 目錄中
    variant.mergeAssets.doLast {
        // ....
        copy {
            from "${sourceDir}/res"
            into "${outputDir}/res"
        }
        copy {
            from "${sourceDir}/subpackages"
            into "${outputDir}/subpackages"
        }
        copy {
            from "${sourceDir}/src"
            into "${outputDir}/src"
        }
        copy {
            from "${sourceDir}/jsb-adapter"
            into "${outputDir}/jsb-adapter"
        }
        copy {
            from "${sourceDir}/main.js"
            from "${sourceDir}/project.json"
            into outputDir
        }
    }
    //....
}

怎么理解上面這段代碼呢?

首先 Android 打包 Apk 是由 Google 開發的一套 Gradle 插件去完成打包的。實際上,每次打包會有很多構建任務,比如:編譯java,編譯C++等等。各個任務之間存在依賴關系,插件根據依賴關系執行對應任務,最后就生成了APK。

而其中有一個插件內置的 Android 構建任務 mergeAssets ,其目的在于將 Android 項目及各個依賴 Library 的 Assets 資源文件合并到構建緩存目錄,方便最后打包。

而 Cocos 就是在 這個任務最后(variant.mergeAssets.doLast),添加了一些復制任務,將 Cocos 的腳本資源等等內容復制到 Android Apk 的 Assets 資源目錄中。

現在,你應該(必須)能很好地理解上面這段代碼以及 Cocos & Android 的構建過程了~

問題成因

那么問題來了?

為什么有些人,他們構建Cocos的游戲后,在Android Studio中運行,每次都能更新 Cocos 構建后的資源,而有些人卻不會更新 Cocos 構建后的資源呢?

實際上,這里用有些人不是很恰當,只是大家習慣于這樣子描述問題。這個問題的差異化在于所用的引擎版本和Android構建Gradle版本,在不同人/PC上可能會采用不同Android Studio版本,不同的構建Gradle版本

問題代碼具體為上面的此行代碼

delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"

這個代碼的意圖在于每次復制 Cocos 的資源到 assets 目錄時,先刪除Android之前有可能構建過的 assets 構建暫存目錄,以實現每次打包都能 Copy 最新的 Cocos 構建后的內容進去。

為什么要先刪除 assets 構建暫存目錄呢?這里面,還得插入一個知識點。

Groovy 的 Copy 任務會自動識別本次是否應該執行復制。比如:復制文件A到一個目錄兩次,在第二次執行的時候,同名文件則不會復制,而是會 UP-TO-DATE 不會再執行。

因此為了避免 Cocos 二次構建后的(同名文件)內容也能在 Android Studio 中 Run 的時候也能用上,那么就需要先刪除目錄,讓復制后的目錄沒有同名文件,這樣子在執行復制的時候就會真的是觸發復制邏輯,從而更新最新的 Cocos 構建內容到 Apk 包中。

嗯,這個意圖很清晰,但是上述代碼并不完美。

首先,這種 Hard Code 寫法很容易出現問題,如果路徑換了一下,那么實際上就不能很好的執行這個刪除意圖了。而問題恰好就是這個路徑問題。

實際上,有些同學可能會用不同版本的 Android Studio ,用了不同版本的 Gradle Plugin。而不同版本的 Gradle Plugin 的 mergeAssets Task 的暫存目錄并不全是上面的絕對路徑。

事實上,不同 Gradle Plugin 版本的 mergeAssets 的輸出路徑有哪些,我也不知道有哪些路徑,并且我們也不應該去固化這個路徑。Android 在持續發展,打包工具也在持續更新,構建任務也可能會修改升級,但這種 Hard Code 路徑的寫法卻極有可能不會能持續用下去。

我們更應該用的是 variant.mergeAssets.outputDir 變量去表示 mergeAssets 的輸出路徑,而不是某個 Hard Code 的字符串。

而 Cocos 恰好是用了 Hard Code 的路徑字符串,從而導致了這個小問題:有些(版本)每次運行都能拿到最新的 Cocos 構建資源,而有些版本缺不可以

解決方案
至此,修復起來就很簡單了,只需要一個很簡單的修改就可以修復:

-- delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
++ delete variant.mergeAssets.outputDir

當然,這個寫法能持續兼容多久,不能保證,但是相信到時候你已經知道應該怎么解決了

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容