cocos 2 dx-lua熱更新の考え方
4656 ワード
最近、会社のプロジェクトにホットアップデートの修正をしています.cococos 2 dが持っていたAssetManagerEXを使ったことがあります.しかし、その更新方法はちょっと大げさです.その後、以前の経験や他の同僚との議論に基づいて、最後の更新方法を決定しました.
まずAndroidの携帯電話プラットフォームの下で2つの更新をサポートします.
1つはapkを更新し、ダウンロードし、apkを再インストールすることです.
二つ目は、リソースを熱的に更新し、差別化されたリソースパッケージをダウンロードし、zip圧縮パッケージにパッケージ化し、携帯電話側にダウンロードし、書き込み可能なパスに解凍することです.
更新プロセス:
appが起動した後にwebインタフェースを要求し、要求したパラメータは主に現在のappのチャネルとappバージョン番号があり、web戻りフィールドには更新方式があり、0-は更新する必要はない.1-ホットアップデートリソース;2-apkを強制的に更新します.リソースをホット更新すると、webは複数のzipパッチパッケージのurlを返し、順次ダウンロードして解凍します.強制的にapkを更新する場合は、apkがダウンロードしたurlに戻り、ダウンロードが完了したらインストールすればよい.その後、パッチパッケージを何回か更新すると、apkの強制更新が主にバックグラウンドで制御されます.
リソースフローをホット更新し、Webから返された複数のzipパッチパッケージをダウンロードし、完了したらreload luaスクリプトをダウンロードし、ゲームに入ります.
主に使用するcococos 2 d-xのdownloaderをダウンロードします.
パッチパッケージを生成するPythonスクリプトを以下に示します.交流を歓迎します.QQ群:617600093
最後に自分の書いた小さなゲームに広告を打って、あなたの圧力を解放する小さなゲームで、あなたがそれを動かすことができる小さなゲームです.やってみる勇気がないの?
Google play storeダウンロードリンク:https://play.google.com/store/apps/details?id=org.rockgame.noiseboy
まずAndroidの携帯電話プラットフォームの下で2つの更新をサポートします.
1つはapkを更新し、ダウンロードし、apkを再インストールすることです.
二つ目は、リソースを熱的に更新し、差別化されたリソースパッケージをダウンロードし、zip圧縮パッケージにパッケージ化し、携帯電話側にダウンロードし、書き込み可能なパスに解凍することです.
更新プロセス:
appが起動した後にwebインタフェースを要求し、要求したパラメータは主に現在のappのチャネルとappバージョン番号があり、web戻りフィールドには更新方式があり、0-は更新する必要はない.1-ホットアップデートリソース;2-apkを強制的に更新します.リソースをホット更新すると、webは複数のzipパッチパッケージのurlを返し、順次ダウンロードして解凍します.強制的にapkを更新する場合は、apkがダウンロードしたurlに戻り、ダウンロードが完了したらインストールすればよい.その後、パッチパッケージを何回か更新すると、apkの強制更新が主にバックグラウンドで制御されます.
リソースフローをホット更新し、Webから返された複数のzipパッチパッケージをダウンロードし、完了したらreload luaスクリプトをダウンロードし、ゲームに入ります.
主に使用するcococos 2 d-xのdownloaderをダウンロードします.
パッチパッケージを生成するPythonスクリプトを以下に示します.交流を歓迎します.QQ群:617600093
# -*- coding: utf-8 -*-
'''
1. apk ,
2. apk (OLD_APK, NEW_APK)
3.
4. , zip
'''
import os
import time
import hashlib
import zipfile
import shutil
OLD_APK = 'old.apk'
NEW_APK = 'new.apk'
diff_files_count = 0
def calc_file_md5(filename):
if not os.path.isfile(filename):
return
if os.path.getsize(filename) > 8096:
return _calc_large_file_md5(filename)
return _calc_small_file_md5(filename)
def _calc_small_file_md5(filename):
with open(filename, 'rb') as f:
obj = hashlib.md5()
obj.update(f.read())
return obj.hexdigest()
def _calc_large_file_md5(filename):
obj = hashlib.md5()
with open(filename, 'rb') as f:
while True:
b = f.read(8096)
if not b:
break
obj.update(b)
return obj.hexdigest()
def fix_sep(path, sep):
if path is None or type(path) != str:
return path
if sep is None or type(sep) != str or sep == '':
return path
if sep != '\\':
return path.replace('\\', sep)
if sep != '/':
return path.replace('/', sep)
return path
def check_dirs(file_path):
file_path = fix_sep(file_path, os.sep)
if os.path.exists(file_path):
return
if os.path.splitext(file_path)[1] != '':
file_path = file_path[: file_path.rfind(os.sep)]
if os.path.exists(file_path):
return
os.makedirs(file_path)
def walk(assets_dir, out_path, old_assets, new_assets):
old_apk_prefix_len = len(old_assets)+1
new_assets_prefix_len = len(os.path.join(new_assets, 'assets'))+1
for f in os.listdir(assets_dir):
ff = os.path.join(assets_dir, f)
if os.path.isdir(ff):
walk(ff, out_path, old_assets, new_assets)
elif os.path.isfile(ff):
fff = os.path.join(old_assets, ff[old_apk_prefix_len:])
if not os.path.isfile(fff) or calc_file_md5(fff) != calc_file_md5(ff):
global diff_files_count
diff_files_count += 1
out_file = os.path.join(out_path, ff[new_assets_prefix_len:])
check_dirs(out_file)
shutil.copyfile(ff, out_file)
def main():
if not os.path.exists(OLD_APK):
print('old apk is not exists')
return
if not os.path.exists(NEW_APK):
print('new apk is not exists')
return
if os.path.exists('temp'):
shutil.rmtree('temp')
old_assets = os.path.join('temp', 'old_apk')
new_assets = os.path.join('temp', 'new_apk')
print('uncompress apk')
old_zip = zipfile.ZipFile(OLD_APK)
old_zip.extractall(old_assets)
new_zip = zipfile.ZipFile(NEW_APK)
new_zip.extractall(new_assets)
print('check diff assets')
zip_filename = time.strftime('%Y%m%d')
out_path = os.path.join('temp', zip_filename)
walk(os.path.join(new_assets, 'assets', 'src'), out_path, old_assets, new_assets)
walk(os.path.join(new_assets, 'assets', 'res'), out_path, old_assets, new_assets)
print('diff files count:', diff_files_count)
shutil.make_archive(zip_filename, 'zip', root_dir=out_path)
shutil.rmtree('temp')
print('finish,zip filename:', zip_filename + '.zip')
if __name__ == '__main__':
main()
os.system('pause')
最後に自分の書いた小さなゲームに広告を打って、あなたの圧力を解放する小さなゲームで、あなたがそれを動かすことができる小さなゲームです.やってみる勇気がないの?
Google play storeダウンロードリンク:https://play.google.com/store/apps/details?id=org.rockgame.noiseboy