প্লে ম্যানেজড পাবলিশিং

এই ডকুমেন্টটিতে দেখানো হয়েছে কীভাবে প্লে ম্যানেজড ইনস্টলেশন ব্যবহার করে পিসিতে গুগল প্লে গেমসে আপনার গেম প্রকাশ করবেন।

প্লে ম্যানেজড ইনস্টলেশনের মাধ্যমে, গুগল প্লে একটি উইন্ডোজ অ্যাপ বান্ডেল (WAB) ফাইলে আপনার দেওয়া গেম ফাইল এবং মেটাডেটা ব্যবহার করে গেমটির ইনস্টলেশন, আপডেট এবং আনইনস্টলেশন পরিচালনা করে।

শুরু করার আগে

আপনার গেমে গুগল প্লে গেমস এসডিকে (SDK) যুক্ত করুন।

আপনার গেমটি একটি WAB ফাইল হিসেবে প্যাকেজ করুন।

একটি প্লে ম্যানেজড ইনস্টলেশন WAB ফাইল তৈরি করতে, এই ধাপগুলো অনুসরণ করুন:

  1. প্লে পাবলিশিং টুলটি ডাউনলোড করুন। আপনি এই টুলটি উইন্ডোজ কমান্ড লাইন বা পাওয়ারশেলে চালাতে পারেন।

  2. যেকোনো নামে প্লে পাবলিশিং কনফিগারেশন ফাইলটি তৈরি করুন। উদাহরণস্বরূপ, play_publishing_config.xml ফাইলটি নিম্নলিখিত ফরম্যাটে তৈরি করুন:

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <!-- Application metadata: This section contains basic information about your game. -->
      <application>
        <package-name>PACKAGE_NAME</package-name>
        <version-name>VERSION_NAME</version-name>
      </application>
    
      <!-- Game files: This section specifies which game files to include in the bundle and how to treat them. -->
      <game-files>
        <file-set>
          <root-folder-path>PATH_TO_ROOT_FOLDER</root-folder-path>
          <!-- absolute or relative to the parent directory of the config xml -->
          <!-- Exclusions: A list of files or folders to exclude from the bundle.
               This is useful for removing development files, temporary data, or redundant assets. -->
          <exclusions>
            <file-path>REGEX_PATTERN_OF_EXCLUDED_FILES</file-path>
            <file-path>PATH_TO_BE_EXCLUDED</file-path>
          </exclusions>
    
          <!-- File attributes: Define special handling for certain files during installation and updates. -->
          <file-attribute value=FILE_ATTRIBUTE_VALUE>
            <file-path>PATH_TO_FILE</file-path>
            <file-path>REGEX_PATTERN_OF_FILE_ATTRIBUTE_FILES</file-path>
          </file-attribute>
        </file-set>
      </game-files>
    
      <!-- This file represents the startup process for this game. Google Play Games for PC should start
          this process when user clicks on "Play" on this game. -->
      <launch-command>
        <path>PATH_TO_LAUNCH_FILE</path>
        <arguments>ARGUMENTS</arguments>
      </launch-command>
    
      <!-- Lifecycle operations: Custom actions to be performed during the game's installation and uninstallation. -->
      <lifecycle-operations>
        <!-- Install operations: These actions run when the game is installed. 'requiresElevation="true"'
            will trigger a UAC prompt for administrator rights. There are three types of install
            operations that can be specified. An instance of each is listed below. -->
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <execute-file>
            <path>PATH_TO_INSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <update-registry baseKey=BASE_KEY>
            <sub-key>SUB_KEY_PATH</sub-key>
            <value-name>VALUE_NAME</value-name>
            <value type=REGISTRY_VALUE_TYPE>VALUE_TEXT</value>
          </update-registry>
        </install-operation>
    
        <!-- Uninstall operations: These actions run before the game is uninstalled. -->
        <uninstall-operation requiresElevation=UNINSTALL_OPERATION_REQUIRES_ELEVATION>
          <execute-file>
            <path>PATH_TO_UNINSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PACKAGE_NAME : আপনার গেমের প্যাকেজ নাম। এটি একটি অনন্য শনাক্তকারী যা গুগল প্লে-তে আপনার গেমের সাথে যুক্ত থাকবে। উদাহরণস্বরূপ, com.yourcompany.yourgame । প্যাকেজ নামটি অবশ্যই নিম্নলিখিত নিয়মগুলি মেনে চলতে হবে:
      • এতে অবশ্যই কমপক্ষে দুটি অংশ (এক বা একাধিক বিন্দু) থাকতে হবে।
      • প্রতিটি অংশ অবশ্যই একটি অক্ষর দিয়ে শুরু হতে হবে।
      • সমস্ত অক্ষর অবশ্যই অ্যালফানিউমেরিক বা আন্ডারস্কোর ( [a-zA-Z0-9_] ) হতে হবে।
    • VERSION_NAME : গেমটির ভার্সন স্ট্রিং। এটি যেকোনো স্ট্রিং হতে পারে, কিন্তু আপনার গেমের জন্য আপলোড করা সমস্ত WAB-এর মধ্যে এটি অবশ্যই অনন্য হতে হবে। উদাহরণস্বরূপ: 1.0 , 1.0.1-beta , 2025.11.24 , v1.rc1
    • রুট ফোল্ডারের পাথ PATH_TO_ROOT_FOLDER ): আপনার গেম ফাইলগুলো যে রুট ফোল্ডারে রয়েছে, এটি সেই ফোল্ডারের পাথ। বর্জন তালিকায় উল্লেখিত ফাইলগুলো ছাড়া এই ফোল্ডারের বাকি সব ফাইল বান্ডেলে যোগ করা হয়। এই পাথটি অ্যাবসোলিউট (absolute) অথবা play_publishing_config.xml ফাইলটি যে ডিরেক্টরিতে রয়েছে, তার সাপেক্ষে রিলেটিভ (relative) হতে পারে।

    • exclusions : (ঐচ্ছিক) PATH_TO_ROOT_FOLDER মধ্যে থাকা ফাইলগুলির পাথ বা প্যাটার্ন নির্দিষ্ট করে, যেগুলিকে বান্ডেল থেকে বাদ দেওয়া হবে। আপনি exclusions এলিমেন্টের মধ্যে একাধিক file-path এলিমেন্ট অন্তর্ভুক্ত করতে পারেন। একটি পাথ দুটি উপায়ের যেকোনো একটিতে উপস্থাপন করা যেতে পারে:

      • ফাইল পাথ হিসেবে : যে ফাইলটি বাদ দিতে চান তার পাথ।
      • রেজেক্স স্ট্রিং হিসেবে : যে সকল ফাইল রেগুলার এক্সপ্রেশন স্ট্রিংটির সাথে মিলে যায়, সেগুলোকে বান্ডেল থেকে বাদ দেওয়া হয়। RE2 সিনট্যাক্স ব্যবহার করুন।
    • file-attribute : (ঐচ্ছিক) নির্দিষ্ট ফাইল বা রেগুলার এক্সপ্রেশন প্যাটার্নের সাথে মেলে এমন ফাইলগুলির জন্য অ্যাট্রিবিউট নির্ধারণ করে।

      • FILE_ATTRIBUTE_VALUE : নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:
        • SKIP_UPDATE : আপডেটের সময়, এই অ্যাট্রিবিউটটি সিস্টেমকে নির্দেশ দেয় যে ফাইলটি যদি আগে থেকে উপস্থিত না থাকে তবেই যেন সেটি কপি করা হয়, এবং বিদ্যমান ফাইলের যেকোনো পরিবর্তন অক্ষুণ্ণ রাখা হয়।
        • ডিভাইসে MODIFIED_ON_DEVICE ): যে ফাইলগুলো অবশ্যই আপডেট করতে হবে, কিন্তু ইনস্টলেশনের পরে ডিভাইসে পরিবর্তিত হতে পারে, সেগুলোর জন্য এটি ব্যবহার করুন। সিস্টেম আপডেটের সময় সম্পূর্ণ নতুন ফাইলটি ডাউনলোড করে এবং ইনস্টল করা সংস্করণটিকে ওভাররাইট করে দেয়। ইনস্টলেশন ইন্টিগ্রিটি চেকের সময় যদি এই ফাইলটি ইনস্টল করা সংস্করণ থেকে ভিন্ন হয়, তবে ইনস্টলেশনটি ত্রুটিপূর্ণ বলে বিবেচিত হয় না।
      • file-path : এই অ্যাট্রিবিউটের জন্য ফাইল শনাক্ত করে। আপনি প্রতিটি file-attribute এলিমেন্টের মধ্যে একাধিক file-path এলিমেন্ট অন্তর্ভুক্ত করতে পারেন। প্রতিটি পাথ দুটি উপায়ের যেকোনো একটিতে উপস্থাপন করা যেতে পারে:
        • ফাইল পাথ হিসেবে : যে ফাইলের সাথে এই অ্যাট্রিবিউটটি যুক্ত করতে চান, তার পাথ।
        • রেজেক্স স্ট্রিং হিসেবে : যে সমস্ত ফাইল রেগুলার এক্সপ্রেশন স্ট্রিংটির সাথে মেলে, সেগুলোকে অ্যাট্রিবিউট ভ্যালুটির সাথে যুক্ত করা হয়। RE2 সিনট্যাক্স ব্যবহার করুন।
    • PATH_TO_LAUNCH_FILE পাথ : গেমটি চালু করতে ব্যবহৃত এক্সিকিউটেবল ফাইলের পাথ।

    • ARGUMENTS : (ঐচ্ছিক) কমান্ড-লাইন আর্গুমেন্টস। <arguments> এলিমেন্টটি <launch-command> , <install-operation> , বা <uninstall-operation> -এ নির্দিষ্ট করা কোনো এক্সিকিউটেবল ফাইলে আর্গুমেন্টস পাস করার জন্য ব্যবহৃত হয়। <arguments> এলিমেন্টের প্রতিটি ব্যবহার শুধুমাত্র সেই এক্সিকিউটেবলের ক্ষেত্রেই প্রযোজ্য যার সাথে এটি সংজ্ঞায়িত করা হয়েছে, ফলে আপনি বিভিন্ন এক্সিকিউটেবলের জন্য ভিন্ন ভিন্ন আর্গুমেন্টস নির্দিষ্ট করতে পারেন।

      • কোনো এক্সিকিউটেবল ফাইলের একাধিক আর্গুমেন্ট থাকলে, সেগুলোকে একটি স্পেস দিয়ে আলাদা করুন।
      • এক্সিকিউটেবলটির প্রয়োজন হলে আর্গুমেন্টগুলোর শুরুতে -- বা - যোগ করুন। উদাহরণ:
        <arguments>--package_name --version_name</arguments>
    • lifecycle-operations : (ঐচ্ছিক) গেম ইনস্টলেশন বা আনইনস্টলেশনের সময় সম্পাদন করার জন্য কাস্টম অ্যাকশন।

      • install-operation : গেমটি ইনস্টল করার সময় যে কাজটি চালানো হবে। আপনি দুই ধরনের ইনস্টল অপারেশন নির্দিষ্ট করতে পারেন: execute-file এবং update-registry )।
      • uninstall-operation : গেমটি আনইনস্টল করার আগে চালানোর জন্য একটি পদক্ষেপ। আনইনস্টলেশনের সময় update-registry অপারেশনগুলো স্বয়ংক্রিয়ভাবে পূর্বাবস্থায় ফিরে আসে।
      • INSTALL_OPERATION_REQUIRES_ELEVATION : এটি নির্দেশ করে যে ইনস্টল অপারেশনটি অ্যাডমিনিস্ট্রেটর প্রিভিলেজ সহ চালানোর প্রয়োজন আছে কিনা।

        • 'true' : প্রশাসক হিসেবে চালান।
        • 'false' : বর্তমান ব্যবহারকারী হিসেবে চালান। নির্দিষ্ট না করা হলে এটিই ডিফল্ট হিসেবে গণ্য হবে।
      • UNINSTALL_OPERATION_REQUIRES_ELEVATION : এটি নির্দেশ করে যে আনইনস্টল অপারেশনটি অ্যাডমিনিস্ট্রেটর প্রিভিলেজ সহ চালাতে হবে কিনা।

        • 'true' : প্রশাসক হিসেবে চালান।
        • 'false' : বর্তমান ব্যবহারকারী হিসেবে চালান। নির্দিষ্ট না করা হলে এটিই ডিফল্ট হিসেবে গণ্য হবে।
      • operation-identifier : একটি install-operation শনাক্ত করার জন্য একটি অনন্য স্ট্রিং।

      • execute-file : একটি এক্সিকিউটেবল ফাইল রান করে।

        • PATH_TO_INSTALL_EXECUTE_FILE : ইনস্টলেশনের সময় চালানোর জন্য এক্সিকিউটেবল ফাইলের পাথ।
        • আনইনস্টলেশনের আগে চালানোর জন্য PATH_TO_UNINSTALL_EXECUTE_FILE ফাইলের পাথ।
      • update-registry : উইন্ডোজ রেজিস্ট্রি এন্ট্রি তৈরি বা আপডেট করে।

        • BASE_KEY : উইন্ডোজ রেজিস্ট্রি-তে ব্যবহৃত রুট কী নির্ধারণ করে। গৃহীত মানগুলি হলো: HKEY_CLASSES_ROOT , HKEY_CURRENT_CONFIG , HKEY_CURRENT_USER , HKEY_LOCAL_MACHINE , HKEY_PERFORMANCE_DATA , এবং HKEY_USERS । যখন কোনো update-registry অপারেশন করা হয়, তখন ব্যবহৃত baseKey উপর ভিত্তি করে প্যারেন্ট install-operation requiresElevation="true" সেট করুন।
          • HKEY_LOCAL_MACHINE অথবা HKEY_CURRENT_CONFIG : requiresElevation="true" সেট করুন।
          • HKEY_CURRENT_USER : requiresElevation="true" এর প্রয়োজন নেই।
          • HKEY_CLASSES_ROOT : শুধুমাত্র মেশিন-ব্যাপী সেকশনে লেখার ক্ষেত্রে requiresElevation="true" সেট করুন; ব্যবহারকারী-নির্দিষ্ট সেকশনের জন্য এটির প্রয়োজন নেই।
          • HKEY_USERS : এখানে সকল ব্যবহারকারীর প্রোফাইল থাকে। বর্তমান ব্যবহারকারী ব্যতীত অন্য ব্যবহারকারীর (যেমন, অন্যান্য ব্যবহারকারী বা .DEFAULT ) প্রোফাইল পরিবর্তন করার সময় requiresElevation="true" সেট করুন।
        • SUB_KEY_PATH : এটি উইন্ডোজ রেজিস্ট্রি-র মধ্যে থাকা একটি নির্দিষ্ট কী-এর পাথকে বোঝায়, যা মূল baseKey অধীনে অবস্থিত।
        • VALUE_NAME : এটি নির্দিষ্ট সাব-কী-এর মধ্যে আপনি যে ডেটা এন্ট্রিটি পরিবর্তন করতে চান তার নাম নির্দিষ্ট করে।
        • REGISTRY_VALUE_TYPE : এই অ্যাট্রিবিউটটি রেজিস্ট্রি-তে লেখা ভ্যালুটির ডেটা টাইপ নির্দিষ্ট করে। সমর্থিত ভ্যালুগুলো হলো স্ট্রিং-এর জন্য STRING অথবা ৩২-বিট সংখ্যার জন্য DWORD
        • VALUE_TEXT : রেজিস্ট্রি কী-তে সংরক্ষণ করার জন্য ডেটা।

    রেগুলার এক্সপ্রেশন কীভাবে ব্যবহার করবেন

    আপনি file-path ট্যাগে RE2 সিনট্যাক্স রেগুলার এক্সপ্রেশন ব্যবহার করে একদল ফাইলের উপর বর্জন বা ফাইল অ্যাট্রিবিউট প্রয়োগ করতে পারেন। মনে রাখবেন, ডিরেক্টরি বিভাজকের জন্য ফরওয়ার্ড স্ল্যাশ / ব্যবহার করতে হবে এবং বিশেষ রেগুলার এক্সপ্রেশন ক্যারেক্টারগুলোকে ব্যাকস্ল্যাশ \ দিয়ে এস্কেপ করতে হবে। উদাহরণস্বরূপ, একটি আক্ষরিক ডট ( . মেলানোর জন্য \. ব্যবহার করুন, অথবা একটি সংখ্যা মেলানোর জন্য \d ব্যবহার করুন।

    এখানে কিছু সাধারণ উদাহরণ দেওয়া হলো:

    • যেকোনো ডিরেক্টরিতে একটি নির্দিষ্ট এক্সটেনশন (যেমন, .log) আছে এমন সমস্ত ফাইল মেলান।

      যে কোনো পাথ যা .log দিয়ে শেষ হয়, যেমন game.log বা logs/errors.log , সেটিকে মেলাতে .*\.log ব্যবহার করুন।

      <file-path>.*\.log</file-path>
    • একটি নির্দিষ্ট ফোল্ডারের (উদাহরণস্বরূপ, 'temp') মধ্যে থাকা সমস্ত ফাইল এবং সাবডিরেক্টরি মেলান।

      temp/ দিয়ে শুরু হওয়া সমস্ত পাথ মেলানোর জন্য temp/.* ব্যবহার করুন, যেমন temp/data.txt বা temp/saves/file.sav

      <file-path>temp/.*</file-path>
    • একটি নির্দিষ্ট ফোল্ডারে একটি প্যাটার্নের সাথে মেলে এমন ফাইলগুলো মেলান।

      assets/level\d\.dat assets/level1.dat assets/level2.dat ব্যবহার করুন, কিন্তু assets/other.dat সাথে নয়।

      <file-path>assets/level\d\.dat</file-path>
    • পাথের যেকোনো স্থানে ফোল্ডারের নামটি থাকলে তা মেলান।

      cache নামের যেকোনো ডিরেক্টরির অধীনে থাকা ফাইলগুলো মেলানোর জন্য . .*/cache/.* ব্যবহার করুন, যেমন game/cache/file.txt বা temp/cache/other.log

      <file-path>.*/cache/.*</file-path>
    • বিভিন্ন এক্সটেনশনের (যেমন, .ini, .cfg, .sav) যেকোনো একটির সাথে ফাইলগুলো মেলান।

      .ini , .cfg , বা .sav দিয়ে শেষ হওয়া যেকোনো ফাইল, যেমন settings.ini , config.cfg , বা saves/slot1.sav , মেলানোর জন্য . .*\.(ini|cfg|sav) ব্যবহার করুন।

      <file-path>.*\.(ini|cfg|sav)</file-path>
    • নির্দিষ্ট ডিরেক্টরিতে নির্দিষ্ট এক্সটেনশনযুক্ত ফাইল মেলান (উদাহরণস্বরূপ, music/ বা sfx/ ডিরেক্টরিতে .ogg)।

      music/ অথবা sfx/ ডিরেক্টরির অধীনে থাকা যেকোনো .ogg ফাইল মেলানোর জন্য (music|sfx)/.*\.ogg ব্যবহার করুন, কিন্তু অন্য কোথাও নয়। এটি music/level1.ogg বা sfx/explosion.ogg মেলায়, কিন্তু voice/intro.ogg মেলায় না।

      <file-path>(music|sfx)/.*\.ogg</file-path>

    প্লে পাবলিশিং কনফিগারেশন ফাইলের উদাহরণ

    TestGame নামক একটি গেমের জন্য play_publishing_config.xml একটি উদাহরণ নিচে দেওয়া হলো:

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <application>
        <package-name>com.test.package</package-name>
        <version-name>1.0</version-name>
      </application>
    
      <game-files>
        <file-set>
          <root-folder-path>C:\Users\Username\game-files</root-folder-path>
          <exclusions>
            <file-path>mock_game\d\.exe</file-path> <!-- exclude files using a regex -->
            <file-path>deprecated_graphics</file-path> <!-- exclude a folder -->
            <file-path>.*\.log</file-path> <!-- recursively exclude all files with .log extension -->
          </exclusions>
    
          <file-attribute value="SKIP_UPDATE">
            <file-path>settings.ini</file-path>
          </file-attribute>
    
          <file-attribute value="MODIFIED_ON_DEVICE">
            <file-path>game_assets\d\.zip</file-path> <!-- define the path using regex -->
          </file-attribute>
        </file-set>
      </game-files>
    
      <launch-command>
        <path>launcher_test_game.exe</path>
        <arguments>--launch-arg</arguments> <!-- optional -->
      </launch-command>
    
      <lifecycle-operations>
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-execute-file</operation-identifier>
          <execute-file>
            <path>install_file.exe</path>
            <arguments>--arg</arguments> <!-- optional -->
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-update-registry</operation-identifier>
          <update-registry baseKey="HKEY_LOCAL_MACHINE">
            <sub-key>SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TestGame</sub-key>
            <value-name>InstallLocation</value-name>
            <value type="STRING">C:\Program Files\TestGame</value>
          </update-registry>
        </install-operation>
    
        <uninstall-operation requiresElevation="true">
          <execute-file>
            <path>uninstall.exe</path>
            <arguments>--test-arg</arguments> <!-- optional -->
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>
  3. build-bundle কমান্ড ব্যবহার করে Windows কমান্ড লাইন বা Powershell-এ Play পাবলিশিং টুলটি চালান:

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH
    

    একই নামের বিদ্যমান WAB ফাইল ওভাররাইট করতে, --force আর্গুমেন্টটি ব্যবহার করুন।

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH --force
    

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PLAY_PUBLISHING_CONFIG_PATH : প্লে পাবলিশিং কনফিগের পাথ। উদাহরণস্বরূপ, path\to\play_publishing_config.xml
    • WAB_OUTPUT_PATH : WAB ফাইলের পাথ। উদাহরণস্বরূপ, path\to\output_bundle.wab

    প্লে পাবলিশিং টুল কীভাবে ব্যবহার করবেন

    যদি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে playpublishingtool.exe , play_publishing_config.xml এবং game_files/ আপনার গেম ফাইলগুলো থাকে:

    .\
    ├── game_files/
    ├── play_publishing_config.xml
    ├── playpublishingtool.exe
    

    একই ডিরেক্টরিতে pmi_bundle.wab তৈরি করতে, চালান:

    playpublishingtool.exe build-bundle --input=play_publishing_config.xml --output=pmi_bundle.wab
    

    টুলটি বান্ডেলটি তৈরি করার সময়, আপনি টার্মিনালে একটি অগ্রগতি বার দেখতে পাবেন:

    Building bundle: [====       ] 40%
    

    সফল হলে, আপনি নিম্নলিখিতের অনুরূপ আউটপুট দেখতে পাবেন:

    Building bundle: [===========] 100%
    Successfully built the managed install bundle at pmi_bundle.wab
    

    ফোল্ডারটিতে WAB ফাইলটি খুঁজুন:

      .\
      ├── game_files/
      ├── pmi_bundle.wab
      ├── play_publishing_config.xml
      ├── playpublishingtool.exe