มีอะไรใหม่สำหรับเว็บใน Play

นับตั้งแต่ที่มีการเปิดตัวกิจกรรมในเว็บที่เชื่อถือได้เมื่อปีที่แล้ว ทีม Chrome ก็ได้ทำงานอย่างต่อเนื่อง ทำให้การใช้งานง่ายขึ้นด้วย Bubblewrap รวมถึงเพิ่มฟีเจอร์ใหม่ๆ เช่น Google Play ที่กำลังจะเปิดตัว การผสานรวมการเรียกเก็บเงิน และการทำให้ใช้ได้ในแพลตฟอร์มอื่นๆ เช่น ChromeOS บทความนี้จะ สรุปข้อมูลอัปเดตล่าสุดและที่กำลังจะมาถึงของกิจกรรมบนเว็บที่เชื่อถือได้

Bubblewrap ใหม่และฟีเจอร์กิจกรรมบนเว็บที่เชื่อถือได้

Bubblewrap ช่วยให้คุณสร้างแอปที่เปิด PWA ภายในกิจกรรมบนเว็บและที่เชื่อถือได้โดยไม่ต้อง ซึ่งจำเป็นต้องมีความรู้เรื่องเครื่องมือเฉพาะแพลตฟอร์ม

ขั้นตอนการตั้งค่าที่ง่ายขึ้น

ก่อนหน้านี้ การใช้ Bubblewrap จำเป็นต้องมีการตั้งค่า Java Development Kit และ Android ด้วยตนเอง SDK ซึ่งทั้ง 2 รายการนี้มีโอกาสเกิดข้อผิดพลาด ตอนนี้เครื่องมือจะเสนอให้ดาวน์โหลดไฟล์ภายนอกโดยอัตโนมัติ ทรัพยากร Dependency เมื่อเรียกใช้เป็นครั้งแรก

คุณยังคงสามารถเลือกใช้การติดตั้ง Dependencies ที่มีอยู่ได้ หากต้องการ และคำสั่ง doctor ใหม่จะช่วยค้นหาปัญหาและแนะนำการแก้ไขการกำหนดค่า ซึ่งสามารถ จะสามารถอัปเดตจากบรรทัดคำสั่งโดยใช้คำสั่ง updateConfig

วิซาร์ดที่ปรับปรุงใหม่

เมื่อสร้างโปรเจ็กต์ด้วย init Bubblewrap ต้องใช้ข้อมูลเพื่อสร้างแอป Android เครื่องมือจะแยกค่าจากไฟล์ Manifest ของเว็บแอปและระบุค่าเริ่มต้นหากเป็นไปได้

คุณเปลี่ยนค่าเหล่านั้นได้เมื่อสร้างโปรเจ็กต์ใหม่ แต่ก่อนหน้านี้ความหมายของแต่ละช่องไม่ได้ ล้าง เราได้สร้างกล่องโต้ตอบการเริ่มต้นใหม่โดยมีคำอธิบายและการตรวจสอบความถูกต้องมากขึ้นสำหรับแต่ละ ฟิลด์ป้อนข้อมูล

การแสดงผล: รองรับโหมดเต็มหน้าจอและการวางแนว

ในบางกรณี คุณอาจต้องการให้แอปพลิเคชันใช้หน้าจอให้มากที่สุดเท่าที่จะทำได้ ในการสร้าง PWA โดยการตั้งค่าช่อง display จากไฟล์ Manifest ของเว็บแอปเป็น fullscreen

เมื่อ Bubblewrap ตรวจพบตัวเลือกแบบเต็มหน้าจอในไฟล์ Manifest ของเว็บแอป ระบบจะกำหนดค่า เพื่อเปิดโหมดเต็มหน้าจอหรือ โหมดสมจริง ใน Android โดยเฉพาะ

ช่อง orientation จากไฟล์ Manifest ของเว็บแอประบุว่าแอปพลิเคชันควรเริ่มทำงานใน โหมดแนวตั้ง โหมดแนวนอน หรือแนวที่อุปกรณ์กำลังใช้อยู่ ใช้ Bubblewrap เลย อ่านช่องไฟล์ Manifest ของเว็บแอปและใช้เป็นค่าเริ่มต้นเมื่อสร้างแอป Android

รวมถึงปรับแต่งการกําหนดค่าทั้ง 2 รายการได้ ซึ่งเป็นส่วนหนึ่งของขั้นตอน bubblewrap init

เอาต์พุตของ AppBundles

App Bundle คือรูปแบบการเผยแพร่สำหรับแอปที่มอบสิทธิ์การสร้าง APK ขั้นสุดท้ายและ กำลังลงชื่อเข้าใช้ Play ในทางปฏิบัติ วิธีนี้จะช่วยให้สามารถแสดงผลไฟล์ขนาดเล็กแก่ผู้ใช้เมื่อดาวน์โหลด จาก Store

ตอนนี้ Bubblewrap ทำแพ็กเกจแอปพลิเคชันเป็น App Bundle ในไฟล์ที่ชื่อว่า app-release-bundle.aab คุณควรเลือกใช้รูปแบบนี้เมื่อเผยแพร่แอปไปยัง Play Store เนื่องจากร้านค้ากำหนดให้ดำเนินการในช่วงครึ่งหลังของปี 2021

การมอบสิทธิ์ตำแหน่งทางภูมิศาสตร์

ผู้ใช้คาดหวังให้แอปพลิเคชันที่ติดตั้งในอุปกรณ์มีลักษณะการทำงานที่สอดคล้องกัน ไม่ว่า เทคโนโลยี เมื่อใช้ภายในกิจกรรมบนเว็บที่เชื่อถือได้ คุณจะสามารถเข้าถึงGeoLocationได้ ที่ได้รับมอบสิทธิ์ในระบบปฏิบัติการ และเมื่อเปิดใช้ ผู้ใช้จะเห็นกล่องโต้ตอบเดียวกันกับที่แอปสร้างขึ้น ด้วย Kotlin หรือ Java แล้วค้นหาการควบคุมเพื่อจัดการสิทธิ์ได้ในที่เดียว

คุณสามารถเพิ่มฟีเจอร์นี้ผ่าน Bubblewrap และเนื่องจากจะเพิ่มทรัพยากร Dependency เพิ่มเติมลงใน Android ได้ คุณควรเปิดใช้เฉพาะเมื่อเว็บแอปใช้สิทธิ์เข้าถึงตำแหน่งทางภูมิศาสตร์

ไบนารีที่เพิ่มประสิทธิภาพ

อุปกรณ์ที่มีพื้นที่เก็บข้อมูลจำกัดมีการใช้งานทั่วไปในบางพื้นที่ทั่วโลก และเจ้าของอุปกรณ์เหล่านั้น มักชอบแอปพลิเคชันขนาดเล็กกว่า แอปพลิเคชันที่ใช้กิจกรรมบนเว็บที่เชื่อถือได้จะสร้างขนาดเล็ก ไบนารี ซึ่งจะช่วยขจัดความกังวลบางส่วนออกไปจากผู้ใช้เหล่านั้น

Bubblewrap ได้รับการเพิ่มประสิทธิภาพโดยการลดรายการไลบรารี Android ที่จำเป็น ส่งผลให้ ไฟล์ไบนารีที่สร้างขึ้น ซึ่งมีขนาดเล็กลง 800k ในทางปฏิบัติ ขนาดดังกล่าวไม่ใช่ขนาดเฉลี่ยครึ่งหนึ่ง ที่สร้างโดยเวอร์ชันก่อนหน้า หากต้องการใช้ประโยชน์จากไบนารีขนาดเล็ก คุณเพียงแค่อัปเดต แอปของคุณได้โดยใช้ Bubblewrap เวอร์ชันล่าสุด

วิธีอัปเดตแอปที่มีอยู่

แอปพลิเคชันที่สร้างโดย Bubblewrap ประกอบด้วยเว็บแอปพลิเคชันและ Android ที่มีน้ำหนักเบา Wrapper ที่เปิด PWA แม้ว่า PWA จะเปิดภายในกิจกรรมบนเว็บและที่เชื่อถือได้ตาม รอบการอัปเดตเดียวกันกับเว็บแอปใดๆ ควรอัปเดต Wrapper แบบเดิม

คุณควรอัปเดตแอปเพื่อให้แอปใช้ Wrapper เวอร์ชันล่าสุดที่มีเวอร์ชันล่าสุด แก้ไขข้อบกพร่องและฟีเจอร์ต่างๆ เมื่อติดตั้ง Bubblewrap เวอร์ชันล่าสุดแล้ว คำสั่ง update จะ นำ Wrapper เวอร์ชันล่าสุดไปใช้กับโปรเจ็กต์ที่มีอยู่:

npm update -g @bubblewrap/cli
bubblewrap update
bubblewrap build

อีกเหตุผลหนึ่งในการอัปเดตแอปพลิเคชันเหล่านั้นคือการตรวจสอบให้แน่ใจว่า การเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์ Manifest ในเว็บ กับแอปพลิเคชัน ใช้คำสั่ง merge ใหม่เพื่อดำเนินการดังกล่าว

bubblewrap merge
bubblewrap update
bubblewrap build

การอัปเดตเกณฑ์คุณภาพ

Chrome 86 ได้เปลี่ยนแปลงเกณฑ์คุณภาพของกิจกรรมบนเว็บที่เชื่อถือได้ ซึ่งได้อธิบายไว้ใน โปรดอ่านการเปลี่ยนแปลงเกณฑ์ด้านคุณภาพสำหรับ PWA ที่ใช้กิจกรรมในเว็บซึ่งเชื่อถือได้

โดยสรุปแล้ว คุณควรตรวจสอบว่าแอปพลิเคชันของคุณจัดการกับสถานการณ์ต่อไปนี้เพื่อ ป้องกันไม่ให้แอปขัดข้อง

  • ไม่สามารถยืนยันลิงก์เนื้อหาดิจิทัลเมื่อเปิดแอปพลิเคชัน
  • แสดงผล HTTP 200 สำหรับคำขอทรัพยากรเครือข่ายแบบออฟไลน์ไม่สำเร็จ
  • แสดงผลข้อผิดพลาด HTTP 404 หรือ 5xx ในแอปพลิเคชัน

นอกจากการตรวจสอบว่าแอปพลิเคชันผ่านการตรวจสอบลิงก์เนื้อหาดิจิทัลแล้ว Service Worker จะจัดการสถานการณ์ต่างๆ ได้ดังนี้

self.addEventListener('fetch', event => {
  event.respondWith((async () => {
    try {
      return await fetchAndHandleError(event.request);
    } catch {
      // Failed to load from the network. User is offline or the response
      // has a status code that triggers the Quality Criteria.
      // Try loading from cache.
      const cachedResponse = await caches.match(event.request);
      if (cachedResponse) {
        return cachedResponse;
      }
      // Response was not found on the cache. Send the error / offline
      // page. OFFLINE_PAGE should be pre-cached when the service worker
      // is activated.
      return await caches.match(OFFLINE_PAGE);
    }
  })());
});

async function fetchAndHandleError(request) {
  const cache = await caches.open(RUNTIME_CACHE);
  const response = await fetch(request);

  // Throw an error if the response returns one of the status
  // that trigger the Quality Criteria.
  if (response.status === 404 ||
      response.status >= 500 && response.status < 600) {
    throw new Error(`Server responded with status: ${response.status}`);
  }

  // Cache the response if the request is successful.
  cache.put(request, response.clone());
  return response;
}

Workbox จะนำแนวทางปฏิบัติแนะนำออกและนำต้นแบบออกเมื่อใช้ Service Worker หรือลองใช้ปลั๊กอิน Workbox เพื่อจัดการกับสถานการณ์เหล่านั้น ดังนี้

export class FallbackOnErrorPlugin {
  constructor(offlineFallbackUrl, notFoundFallbackUrl, serverErrorFallbackUrl) {
    this.notFoundFallbackUrl = notFoundFallbackUrl;
    this.offlineFallbackUrl = offlineFallbackUrl;
    this.serverErrorFallbackUrl = serverErrorFallbackUrl;
  }

  checkTrustedWebActivityCrash(response) {
    if (response.status === 404 || response.status >= 500 && response.status <= 600) {
      const type = response.status === 404 ? 'E_NOT_FOUND' : 'E_SERVER_ERROR';
      const error = new Error(`Invalid response status (${response.status})`);
      error.type = type;
      throw error;
    }
  }

  // This is called whenever there's a network response,
  // but we want special behavior for 404 and 5**.
  fetchDidSucceed({response}) {
    // Cause a crash if this is a Trusted Web Activity crash.
    this.checkTrustedWebActivityCrash(response);

    // If it's a good response, it can be used as-is.
    return response;
  }

  // This callback is new in Workbox v6, and is triggered whenever
  // an error (including a NetworkError) is thrown when a handler runs.
  handlerDidError(details) {
    let fallbackURL;
    switch (details.error.details.error.type) {
      case 'E_NOT_FOUND': fallbackURL = this.notFoundFallbackUrl; break;
      case 'E_SERVER_ERROR': fallbackURL = this.serverErrorFallbackUrl; break;
      default: fallbackURL = this.offlineFallbackUrl;
    }

    return caches.match(fallbackURL, {
      // Use ignoreSearch as a shortcut to work with precached URLs
      // that have _WB_REVISION parameters.
      ignoreSearch: true,
    });
  }
}

Google Play Billing

นอกจากการอนุญาตให้แอปขายสินค้าดิจิทัลและการสมัครใช้บริการใน Play Store แล้ว Google Play Billing มีเครื่องมือสำหรับจัดการแคตตาล็อก ราคา และการสมัครใช้บริการ รายงาน และขั้นตอนการชำระเงินที่ขับเคลื่อนโดย Play Store ที่ผู้ใช้คุ้นเคยอยู่แล้ว ทั้งนี้ ยังเป็นข้อกำหนดสำหรับแอปพลิเคชันที่เผยแพร่ใน Play Store ที่ขายสินค้าดิจิทัลด้วย

Chrome 88 จะเปิดตัวพร้อมช่วงทดลองใช้จากต้นทางบน Android ซึ่งช่วยให้สามารถผสานรวม กิจกรรมบนเว็บที่เชื่อถือได้, Payment Request API และ Digital Goods API, เพื่อ ใช้ขั้นตอนการซื้อผ่าน Google Play Billing เราคาดว่าช่วงทดลองใช้จากต้นทางนี้จะพร้อมให้บริการด้วย สำหรับ ChromeOS เวอร์ชัน 89

สำคัญ: Google Play Billing API มีคำศัพท์ของตนเองและรวมถึงเกี่ยวกับไคลเอ็นต์และ คอมโพเนนต์แบ็กเอนด์ ส่วนนี้จะครอบคลุมเฉพาะส่วนเล็กๆ ของ API เฉพาะเกี่ยวกับการใช้ Digital Goods API และกิจกรรมบนเว็บที่เชื่อถือได้ โปรดอ่าน เอกสารประกอบเกี่ยวกับ Google Play Billing และทำความเข้าใจแนวคิดก่อนที่จะผสานรวมเข้ากับ แอปพลิเคชันเวอร์ชันที่ใช้งานจริง

ขั้นตอนพื้นฐาน

เมนู Play Console

หากต้องการให้บริการสินค้าดิจิทัลผ่าน Play Store คุณจะต้องกำหนดค่าแคตตาล็อกใน Play Store รวมถึงเชื่อมต่อ Play Store เป็นวิธีการชำระเงินจาก PWA

เมื่อพร้อมกำหนดค่าแคตตาล็อกแล้ว ให้เริ่มด้วยการหาส่วนผลิตภัณฑ์ทางด้านซ้าย เมนูด้านข้างใน Play Console

ที่นี่คุณจะพบตัวเลือกเพื่อดูผลิตภัณฑ์ ในแอปและการสมัครรับข้อมูลที่มีอยู่ และ มองหาปุ่มสร้างสำหรับเพิ่มใหม่

ผลิตภัณฑ์ในแอปพลิเคชัน

รายละเอียดผลิตภัณฑ์

หากต้องการสร้างไอเทมที่ซื้อในแอปใหม่ คุณจะต้องใช้รหัสผลิตภัณฑ์ ชื่อ รายละเอียด และราคา ตอนนี้ ในการสร้างรหัสผลิตภัณฑ์ที่มีความหมายและจดจำได้ง่าย คุณจะต้องใช้รหัสในภายหลังและรหัส ไม่สามารถเปลี่ยนแปลงได้หลังจากสร้างแล้ว

เมื่อสร้างการสมัครใช้บริการ คุณจะต้องระบุช่วงเวลาที่เรียกเก็บเงินด้วย คุณจะมีตัวเลือก แสดงสิทธิประโยชน์ของการสมัครใช้บริการ และเพิ่มฟีเจอร์ต่างๆ เช่น คุณมีช่วงทดลองใช้ฟรีไหม ราคาช่วงแนะนำ ระยะเวลาผ่อนผัน และตัวเลือกการสมัครอีกครั้ง

หลังจากที่สร้างผลิตภัณฑ์แต่ละรายการแล้ว ให้เปิดใช้งานจากแอปของคุณโดยการเปิดใช้งาน

คุณเพิ่มผลิตภัณฑ์ผ่าน Play Developers API ได้หากต้องการ

เมื่อกำหนดค่าแคตตาล็อกแล้ว ขั้นตอนถัดไปคือการกำหนดค่าขั้นตอนการชำระเงินจาก PWA คุณ จะใช้ Digital Goods API และ Payment Request API ร่วมกันเพื่อให้บรรลุเป้าหมาย นี้

ดึงข้อมูลราคาผลิตภัณฑ์ด้วย Digital Goods API

เมื่อใช้ Google Play Billing คุณควรตรวจสอบว่าราคาที่แสดงให้ผู้ใช้เห็นตรงกับ ราคาจากข้อมูลผลิตภัณฑ์ใน Store การทำให้ราคาเหล่านั้นตรงกันด้วยตนเองคงเป็นไปไม่ได้ ดังนั้น Digital Goods API ทำให้เว็บแอปพลิเคชันสามารถค้นหาการชำระเงินที่เกี่ยวข้อง ผู้ให้บริการข้อมูลราคา:

// The SKU for the product, as defined in the Play Store interface
async function populatePrice(sku) {
  try {
    // Check if the Digital Goods API is supported by the browser.
    if (window.getDigitalGoodsService) {
      // The Digital Goods API can be supported by other Payments provider.
      // In this case, we're retrieving the Google Play Billing provider.
      const service =
          await window.getDigitalGoodsService("https://play.google.com/billing");

      // Fetch product details using the `getDetails()` method.
      const details = await service.getDetails([sku]);

      if (details.length === 0) {
        console.log(`Could not get SKU: "${sku}".`);
        return false;
      }

      // The details will contain both the price and the currenncy.
      item = details[0];
      const value = item.price.value;
      const currency = item.price.currency;

      const formattedPrice = new Intl.NumberFormat(navigator.language, {
        style: 'currency', currency: currency }).format(value);

      // Display the price to the user.
      document.getElementById("price").innerHTML = formattedPrice;
    } else {
      console.error("Could not get price for SKU \""   sku   "\".");
    }
  } catch (error) {
    console.log(error);
  }
  return false;
}

คุณตรวจหาการรองรับ Digital Goods API ได้โดยตรวจสอบว่า getDigitalGoodsService() ตรงกับ ใช้ได้ในออบเจ็กต์ window

จากนั้นเรียก window.getDigitalGoodsService() โดยมีตัวระบุ Google Play Billing เป็นพารามิเตอร์ การดำเนินการนี้จะส่งคืนอินสแตนซ์บริการสำหรับ Google Play Billing และผู้ให้บริการรายอื่นๆ สามารถใช้การสนับสนุนได้ สำหรับ Digital Goods API และจะมีตัวระบุที่แตกต่างกัน

สุดท้าย ให้เรียกใช้ getDetails() ในการอ้างอิงออบเจ็กต์ Google Play Billing ที่ส่ง SKU สำหรับ รายการเป็นพารามิเตอร์ เมธอดจะแสดงออบเจ็กต์รายละเอียดที่มีทั้งราคาและ สกุลเงินของรายการที่สามารถแสดงต่อผู้ใช้ได้

เริ่มขั้นตอนการซื้อ

Payment Request API จะเปิดใช้ขั้นตอนการซื้อบนเว็บและใช้กับ Google Play ได้ด้วย การผสานรวมการเรียกเก็บเงิน ดูวิธีการทำงานของ Payment Request API เพื่อดูข้อมูลเพิ่มเติมหากคุณยังไม่คุ้นเคยกับการชำระเงิน ส่งคำขอ API

หากต้องการใช้ API กับ Google Play Billing คุณจะต้องเพิ่มเครื่องมือการชำระเงินที่ มี Meet ที่รองรับชื่อ https://play.google.com/billing และเพิ่ม SKU เป็นส่วนหนึ่งของข้อมูล สำหรับเครื่องมือ:

const supportedInstruments = [{
  supportedMethods: "https://play.google.com/billing",
  data: {
    sku: sku
  }
}];

จากนั้นสร้างออบเจ็กต์ PaymentRequest ตามปกติและใช้ API ตามปกติ

const request = new PaymentRequest(supportedInstruments, details);

ตอบรับการซื้อ

เมื่อธุรกรรมเสร็จสมบูรณ์ คุณจะต้องใช้ Digital Goods API เพื่อรับทราบ ออบเจ็กต์การตอบกลับจาก PaymentRequest จะมีโทเค็นที่คุณจะใช้เพื่อ รับทราบธุรกรรม

const response = await request.show();
const token = response.details.token;
const service =
          await window.getDigitalGoodsService("https://play.google.com/billing");
await service.acknowledge(token, 'onetime');

Digital Goods API และ Payment Request API ไม่มีความรู้เกี่ยวกับข้อมูลประจำตัวของผู้ใช้ เพื่อ คุณจึงจะเชื่อมโยงการซื้อกับผู้ใช้ในแบ็กเอนด์และตรวจสอบว่าผู้ใช้ สิทธิ์เข้าถึงรายการที่ซื้อ เมื่อเชื่อมโยงการซื้อกับผู้ใช้ อย่าลืมบันทึก โทเค็นการซื้อ เนื่องจากคุณอาจต้องใช้โทเค็นนี้ในการยืนยันว่าการซื้อนั้นถูกยกเลิกหรือคืนเงินแล้ว หรือในกรณีที่ การสมัครใช้บริการยังคงใช้งานได้อยู่ ดู Real Time Developer Notifications API และ Google Play Developer API เนื่องจากมีปลายทางสำหรับการจัดการกรณีเหล่านั้นในแบ็กเอนด์ของคุณ

ตรวจสอบการให้สิทธิ์ที่มีอยู่

ผู้ใช้อาจแลกรหัสโปรโมชันแล้วหรืออาจสมัครใช้บริการผลิตภัณฑ์ของคุณอยู่ ใน เพื่อตรวจสอบว่าผู้ใช้มีสิทธิ์ที่เหมาะสม คุณสามารถเรียกใช้ คำสั่ง listPurchases() สำหรับบริการสินค้าดิจิทัล การดำเนินการนี้จะแสดงการซื้อทั้งหมดที่ สร้างไว้ในแอปของคุณ หน้านี้เป็นที่สำหรับแสดงการยอมรับใดๆ ที่ยังไม่ได้รับทราบ เพื่อให้แน่ใจว่าผู้ใช้แลกสิทธิ์การให้สิทธิ์ของตนอย่างถูกต้องแล้ว

const purchases = await itemService.listPurchases();
for (p of purchases) {
  if (!p.acknowledged) {
    await itemService.acknowledge(p.purchaseToken, 'onetime');
  }
}

อัปโหลดไปยัง Play Store ของ ChromeOS

กิจกรรมบนเว็บที่เชื่อถือได้จะพร้อมใช้งานตั้งแต่ Chrome 85 ใน ChromeOS Play Store ด้วย กระบวนการ การแสดงแอปของคุณใน Store จะเหมือนกับการแสดงแอปใน ChromeOS สำหรับ Android

เมื่อสร้าง App Bundle แล้ว Play Console จะแนะนำขั้นตอน ขั้นตอนในการแสดงแอปใน Play Store ดูความช่วยเหลือได้จากเอกสารประกอบของ Play Console สร้างข้อมูลแอป จัดการไฟล์ APK และการตั้งค่าอื่นๆ รวมถึงวิธีการ เพื่อการทดสอบและการเปิดตัวแอปอย่างปลอดภัย

หากต้องการจำกัดแอปพลิเคชันของคุณให้อยู่ใน Chromebook เท่านั้น ให้เพิ่มแฟล็ก --chromeosonly เมื่อเริ่มต้น แอปพลิเคชันใน Bubblewrap:

bubblewrap init --manifest="https://example.com/manifest.json" --chromeosonly

เมื่อสร้างแอปพลิเคชันด้วยตนเอง โดยไม่ใช้ Bubblewrap ให้เพิ่ม Flag uses-feature ใน ไฟล์ Manifest ของ Android:

<uses-feature  android:name="org.chromium.arc" android:required="true"/>

หากคุณแชร์ข้อมูลของคุณกับแอป Android เวอร์ชันแพ็กเกจอย่างเดียวของ ChromeOS จะมี ให้สูงกว่าเวอร์ชันแพ็กเกจแอป Android คุณสามารถตั้งค่าเวอร์ชัน Bundle ของ ChromeOS เป็น สูงกว่าเวอร์ชัน Android คุณจึงไม่ต้องอัปเดตทั้ง 2 เวอร์ชันด้วย