Cocos Creator Android 打包疑難雜癥記錄

Android Studio 運(yùn)行 Apk,不會采用最新構(gòu)建的 Cocos 內(nèi)容問題

每次在Cocos構(gòu)建項(xiàng)目后亿柑,在Android Studio上點(diǎn)擊 Run邢疙,「可能」會發(fā)現(xiàn)這次Run望薄,并不會采用剛剛構(gòu)建的Cocos內(nèi)容!痕支?颁虐?

劃重點(diǎn): 「可能」

  • 有些人/電腦/AndroidStudio版本 會 立即采用剛剛構(gòu)建的 Cocos 內(nèi)容
  • 有些人/電腦/AndroidStudio版本 不會 立即采用剛剛構(gòu)建的 Cocos 內(nèi)容

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

Cocos & Android 構(gòu)建原理

解決這個(gè)問題卧须,我們可以先大概了解一下 Cocos & Android 的一些構(gòu)建原理:

1.Cocos 構(gòu)建資源會放在 Android 項(xiàng)目的 assets 資源目錄中
2.app 運(yùn)行時(shí)另绩,讀取 assets 資源目錄花嘶,從而獲取到 Cocos 構(gòu)建后的資源

這里面,我們重點(diǎn)探究的是 Cocos 是怎么將構(gòu)建的內(nèi)容放到 Android 的 assets 資源目錄中呢车海?

這個(gè)操作其實(shí)在構(gòu)建后的 app/build.gradle 中隘击,關(guān)鍵代碼如下:

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

    // 復(fù)制 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 開發(fā)的一套 Gradle 插件去完成打包的埋同。實(shí)際上莺禁,每次打包會有很多構(gòu)建任務(wù)窄赋,比如:編譯java,編譯C++等等忆绰。各個(gè)任務(wù)之間存在依賴關(guān)系,插件根據(jù)依賴關(guān)系執(zhí)行對應(yīng)任務(wù)翰灾,最后就生成了APK。

而其中有一個(gè)插件內(nèi)置的 Android 構(gòu)建任務(wù) mergeAssets 平斩,其目的在于將 Android 項(xiàng)目及各個(gè)依賴 Library 的 Assets 資源文件合并到構(gòu)建緩存目錄咽块,方便最后打包。

而 Cocos 就是在 這個(gè)任務(wù)最后(variant.mergeAssets.doLast)侈沪,添加了一些復(fù)制任務(wù),將 Cocos 的腳本資源等等內(nèi)容復(fù)制到 Android Apk 的 Assets 資源目錄中瘦馍。

現(xiàn)在应役,你應(yīng)該(必須)能很好地理解上面這段代碼以及 Cocos & Android 的構(gòu)建過程了~

問題成因

那么問題來了?

為什么有些人呻惕,他們構(gòu)建Cocos的游戲后滥比,在Android Studio中運(yùn)行,每次都能更新 Cocos 構(gòu)建后的資源濒持,而有些人卻不會更新 Cocos 構(gòu)建后的資源呢寺滚?

實(shí)際上,這里用有些人不是很恰當(dāng)村视,只是大家習(xí)慣于這樣子描述問題蚁孔。這個(gè)問題的差異化在于所用的引擎版本和Android構(gòu)建Gradle版本,在不同人/PC上可能會采用不同Android Studio版本杠氢,不同的構(gòu)建Gradle版本鼻百。

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

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

這個(gè)代碼的意圖在于每次復(fù)制 Cocos 的資源到 assets 目錄時(shí)摆尝,先刪除Android之前有可能構(gòu)建過的 assets 構(gòu)建暫存目錄因悲,以實(shí)現(xiàn)每次打包都能 Copy 最新的 Cocos 構(gòu)建后的內(nèi)容進(jìn)去。

為什么要先刪除 assets 構(gòu)建暫存目錄呢臼朗?這里面蝎土,還得插入一個(gè)知識點(diǎn)。

Groovy 的 Copy 任務(wù)會自動識別本次是否應(yīng)該執(zhí)行復(fù)制誊涯。比如:復(fù)制文件A到一個(gè)目錄兩次暴构,在第二次執(zhí)行的時(shí)候,同名文件則不會復(fù)制取逾,而是會 UP-TO-DATE 不會再執(zhí)行。

因此為了避免 Cocos 二次構(gòu)建后的(同名文件)內(nèi)容也能在 Android Studio 中 Run 的時(shí)候也能用上误阻,那么就需要先刪除目錄晴埂,讓復(fù)制后的目錄沒有同名文件,這樣子在執(zhí)行復(fù)制的時(shí)候就會真的是觸發(fā)復(fù)制邏輯精耐,從而更新最新的 Cocos 構(gòu)建內(nèi)容到 Apk 包中琅锻。

嗯,這個(gè)意圖很清晰沫浆,但是上述代碼并不完美滚秩。

首先淮捆,這種 Hard Code 寫法很容易出現(xiàn)問題本股,如果路徑換了一下桐腌,那么實(shí)際上就不能很好的執(zhí)行這個(gè)刪除意圖了案站。而問題恰好就是這個(gè)路徑問題。

實(shí)際上蟆盐,有些同學(xué)可能會用不同版本的 Android Studio 石挂,用了不同版本的 Gradle Plugin。而不同版本的 Gradle Plugin 的 mergeAssets Task 的暫存目錄并不全是上面的絕對路徑痹愚。

事實(shí)上,不同 Gradle Plugin 版本的 mergeAssets 的輸出路徑有哪些窖式,我也不知道有哪些路徑动壤,并且我們也不應(yīng)該去固化這個(gè)路徑。Android 在持續(xù)發(fā)展蜒灰,打包工具也在持續(xù)更新肩碟,構(gòu)建任務(wù)也可能會修改升級,但這種 Hard Code 路徑的寫法卻極有可能不會能持續(xù)用下去翅溺。

我們更應(yīng)該用的是 variant.mergeAssets.outputDir 變量去表示 mergeAssets 的輸出路徑髓抑,而不是某個(gè) Hard Code 的字符串。

而 Cocos 恰好是用了 Hard Code 的路徑字符串褪猛,從而導(dǎo)致了這個(gè)小問題:有些(版本)每次運(yùn)行都能拿到最新的 Cocos 構(gòu)建資源羹饰,而有些版本缺不可以

解決方案
至此碳却,修復(fù)起來就很簡單了昼浦,只需要一個(gè)很簡單的修改就可以修復(fù):

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

當(dāng)然筒主,這個(gè)寫法能持續(xù)兼容多久,不能保證使兔,但是相信到時(shí)候你已經(jīng)知道應(yīng)該怎么解決了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冠胯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子置蜀,更是在濱河造成了極大的恐慌悉盆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脚翘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鞋真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門涩咖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁莹,“玉大人,你說我怎么就攤上這事咨演。” “怎么了饵较?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我嵌牺,道長,這世上最難降的妖魔是什么募疮? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任阿浓,我火速辦了婚禮蹋绽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘退敦。我一直安慰自己蚣抗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布钝域。 她就那樣靜靜地躺著锭魔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪战虏。 梳的紋絲不亂的頭發(fā)上党涕,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天膛堤,我揣著相機(jī)與錄音,去河邊找鬼。 笑死朝群,一個(gè)胖子當(dāng)著我的面吹牛中符,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播右莱,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼慢蜓,長吁一口氣:“原來是場噩夢啊……” “哼郭膛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起则剃,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤忍级,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汛蝙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴肺,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈稿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了需了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般甲。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敷存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帝雇,我是刑警寧澤蛉拙,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布孕锄,位于F島的核電站,受9級特大地震影響硫惕,放射性物質(zhì)發(fā)生泄漏恼除。R本人自食惡果不足惜曼氛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徽级。 院中可真熱鬧聊浅,春花似錦、人聲如沸低匙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绞呈。三九已至间景,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拱燃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工父晶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄跌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓埠胖,卻偏偏與公主長得像淳玩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子谋竖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容