게임 룸 번들 분석기

이 페이지에서는 게임 룸 번들 분석기를 사용하는 방법을 설명합니다.

안내

게임 룸 번들 분석 도구는 게임 룸 게임 번들에서 실행하여 실행할 수 있습니다. Google에 애셋을 업로드하기 전에 게임 번들에서 여러 차례의 유효성 검사를 드라이브.

기본 요건

스크립트 만들기

  1. 시스템에서 스크립트를 만들 디렉터리를 식별합니다 (예: ~/scripts)을 입력합니다.
  2. 제공된 샘플 코드를 사용하여 컴퓨터에 파일을 만듭니다. playables_bundle_analyzer.py라고 합니다.

스크립트를 실행하여 게임 번들 분석

  1. 머신에서 터미널 창을 열고 디렉터리로 이동합니다. playables_bundle_analyzer.py 스크립트 포함
  2. 다음 명령어를 실행하여 스크립트를 실행합니다. [GAME_DIRECTORY_PATH] 게임 번들 디렉터리의 실제 경로로 바꿉니다.

    python3 playables_bundle_analyzer.py [GAME_DIRECTORY_PATH]
    
  3. 스크립트 디렉터리에 번들 분석 보고서가 생성됩니다. 데이터 커리큘럼 내의 이름은 playable_bundle_analysis_report.txt여야 합니다.

  4. 자세한 내용은 안정성 및 성능 요구사항을 참고하세요. 자세한 내용은 번들 크기 및 파일 이름 요구사항을 참조하세요.

코드

# 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()