本頁面說明如何使用遊戲角落套件分析工具。
操作說明
遊戲角落的套裝組合分析工具可針對遊戲角落的遊戲套件執行 將資產上傳至 Google 前,請先對遊戲套件進行幾項驗證 開車、
必要條件
- 安裝 Python 3。
建立指令碼
- 找出機器上的目錄以建立指令碼 (例如:
~/scripts
)。 - 使用提供的程式碼範例,在電腦上建立檔案
名為
playables_bundle_analyzer.py
。
執行指令碼來分析遊戲套件
- 在電腦上開啟終端機視窗,然後前往以下目錄:
包含
playables_bundle_analyzer.py
指令碼 執行下列指令,將
[GAME_DIRECTORY_PATH]
替換成此指令,以執行指令碼 改成遊戲套件目錄的實際路徑:python3 playables_bundle_analyzer.py [GAME_DIRECTORY_PATH]
系統會在指令碼目錄中產生組合分析報表。這會導致 名稱是
playable_bundle_analysis_report.txt
。詳情請參閱「穩定性和效能需求」一文 關於套件大小和檔案名稱的規定。
程式碼
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Contains functions to analyze the Playable game bundles."""
import argparse
import os
import re
from typing import Dict, List, Union
SIZE_LIMITS = {
"file": 31457280, # 30 MiB
"bundle": 262144000, # 250 MiB
}
class BundleAnalyzer:
"""Class for analyzing Playable game bundles."""
def __init__(self, directory_path):
"""Initializes the BundleAnalyzer object with the specified directory path.
Args:
directory_path: The path to the directory to analyze.
"""
self.directory_path = directory_path
self.total_size = 0
self.filenames_with_issues = []
self.files_too_large = []
def analyze(self):
"""Analyzes the Playable game bundle and stores the results.
This function iterates through the directory and its subdirectories,
calculating the total size, and identifying files with
issues like unsupported characters, duplicates, and exceeding size limits.
"""
for root, _, files in os.walk(self.directory_path):
for filename in files:
file_path = os.path.join(root, filename)
file_size = os.path.getsize(file_path)
self.total_size += file_size
if file_size > SIZE_LIMITS["file"]:
self.files_too_large.append(file_path)
if not is_valid_filename(filename):
self.filenames_with_issues.append(file_path)
def get_results(self) -> Dict[str, Union[List[str], List[str], int]]:
"""Returns a dictionary containing the analysis results.
The dictionary includes information about the total number of files,
files with issues, files exceeding size limits,
and the total size of the bundle.
"""
return {
"filenames_with_issues": self.filenames_with_issues,
"files_too_large": self.files_too_large,
"total_size": self.total_size,
}
def is_valid_filename(filename: str) -> bool:
"""Checks if the filename contains valid characters.
Create a regular expression that matches allowed bundle file characters
Args:
filename: The filename to be validated.
Returns:
True if the filename is valid, False otherwise.
"""
pattern = r"^[a-zA-Z0-9\-\._]+$"
return bool(re.fullmatch(pattern, filename))
def main():
"""Main function that runs the BundleAnalyzer.
Parses command line arguments, creates a BundleAnalyzer instance,
runs the analysis, and output the results.
"""
parser = argparse.ArgumentParser(description="Analyze file size")
parser.add_argument("path", help="Path to file or directory")
args = parser.parse_args()
analyzer = BundleAnalyzer(args.path)
analyzer.analyze()
analysis_result = analyzer.get_results()
with open("playable_bundle_analysis_report.txt", "w") as f:
if analysis_result["filenames_with_issues"]:
print(
"Files with unsupported characters:"
f" {analysis_result['filenames_with_issues']}",
file=f,
)
if analysis_result["files_too_large"]:
print(
f"Files too large: {analysis_result['files_too_large']}",
file=f,
)
if analysis_result["total_size"] > SIZE_LIMITS["bundle"]:
print(
f"Total bundle is too large:: {analysis_result['total_size']} bytes",
file=f,
)
if __name__ == "__main__":
main()