Search code examples
google-nativeclient

Reduce network traffic for Native Client installation from Chrome Web Store


My Chrome app contains three .nexe files for arm, x86-32 and 64-bit processors. When I install this app from Chrome web store, the size of downloaded package is the same as the size of the app containing all .nexe files. Is it possible to optimize this network traffic?

My .nmf file bundled in the app looks like this:

{
  "program": {
    "arm": { "url": "arm.nexe" },
    "x86-32": { "url": "x86_32.nexe" },
    "x86-64": { "url": "x86_64.nexe" }
  }
}

Thanks


Solution

  • Yes, you can add a platform specific section to your manifest.json. Then the packages will only download the components that are specified for that CPU architecture.

    There is documentation for that feature here: https://developer.chrome.com/native-client/devguide/distributing#reducing-the-size-of-the-user-download-package

    And there is an example in the SDK as well: examples/tutorial/multi_platform

    To summarize the documentation above: First create a _platform_specific directory in your App package. For each architecture, create a subdirectory with that name:

    |-- my_app_directory/
    |       |-- manifest.json
    |       |-- my_app.html
    |       |-- my_module.nmf
    |       +-- css/
    |       +-- images/
    |       +-- scripts/
    |       |-- _platform_specific/
    |       |       |-- x86-64/
    |       |       |       |-- my_module_x86_64.nexe
    |       |       |-- x86-32/
    |       |       |       |-- my_module_x86_32.nexe
    |       |       |-- arm/
    |       |       |       |-- my_module_arm.nexe
    |       |       |-- all/
    |       |       |       |-- my_module_x86_64.nexe
    |       |       |       |-- my_module_x86_64.nexe
    |       |       |       |-- my_module_x86_32.nexe
    

    Then in the manifest.json file, specify the location of these directories:

    ...
    "platforms": [
        {
          "nacl_arch": "x86-64",
          "sub_package_path": "_platform_specific/x86-64/"
        },
        {
          "nacl_arch": "x86-32",
          "sub_package_path": "_platform_specific/x86-32/"
        },
        {
          "nacl_arch": "arm",
          "sub_package_path": "_platform_specific/arm/"
        },
        {
          "sub_package_path": "_platform_specific/all/"
        }
      ]
    

    You'll want your .nmf to point to the location of these nexes. The SDK build system has an option to do all of this for you automatically, I'd suggest using it.