| page.title=Packaging Wearable Apps |
| page.tags=wear |
| helpoutsWidget=true |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#Studio">Package with Android Studio</a></li> |
| <li><a href="#PackageManually">Package Manually</a></li> |
| <li><a href="#AssetCompression">Turn off Asset Compression</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>When publishing to users, you must package a wearable app inside of a handheld app, |
| because users cannot browse and install apps directly on the wearable. If packaged properly, |
| when users download the handheld app, the system automatically pushes the wearable app to the |
| paired wearable. |
| </p> |
| |
| <p class="note"><b>Note:</b> This feature doesn't work when you are signing your apps with |
| a debug key when developing. While developing, installing apps with <code>adb install</code> or |
| Android Studio directly to the wearable is required.</p> |
| |
| |
| <h2 id="Studio">Package with Android Studio</h2> |
| <p>To properly package a wearable app in Android Studio:</p> |
| |
| <ol> |
| <li>Include all the permissions declared in the manifest file of the wearable app module |
| in the manifest file of the handheld app module. For example, if you specify the {@link |
| android.Manifest.permission#VIBRATE} permission for the wearable app, you must also add that |
| permission to the handheld app.</li> |
| |
| <li>Ensure that both the wearable and handheld app modules have the same package name and |
| version number.</li> |
| |
| <li>Declare a Gradle dependency in the handheld app's <code>build.gradle</code> file |
| that points to the wearable app module: |
| <pre> |
| dependencies { |
| compile 'com.google.android.gms:play-services:5.0.+@aar' |
| compile 'com.android.support:support-v4:20.0.+'' |
| <b>wearApp project(':wearable')</b> |
| } |
| </pre> |
| </li> |
| <li>Click <b>Build > Generate Signed APK...</b> and follow the on-screen instructions |
| to specify your release keystore and sign your app. Android Studio exports the signed |
| handheld app with the wearable app embedded in it automatically into your project's root folder. |
| |
| <p>Alternatively, you can sign both apps from the command line using the |
| <a href="{@docRoot}sdk/installing/studio-build.html#gradleWrapper">Gradle wrapper</a>. Both apps |
| must be signed to have the automatic pushing of the wearable app work.</p> |
| |
| <p>Store your key file location and credentials in environment variables and run the Gradle |
| wrapper as follows:</p> |
| |
| <pre class="no-pretty-print"> |
| ./gradlew assembleRelease \ |
| -Pandroid.injected.signing.store.file=$KEYFILE \ |
| -Pandroid.injected.signing.store.password=$STORE_PASSWORD \ |
| -Pandroid.injected.signing.key.alias=$KEY_ALIAS \ |
| -Pandroid.injected.signing.key.password=$KEY_PASSWORD |
| </pre> |
| </li> |
| </ol> |
| |
| <h3>Signing the wearable and handheld app separately</h3> |
| <p>If your build process requires signing the wearable app separately from the handheld app, |
| you can declare the following Gradle rule in the handheld module's <code>build.gradle</code> to |
| embed the previously-signed wearable app:</p> |
| |
| <pre> |
| dependencies { |
| ... |
| wearApp files('/path/to/wearable_app.apk') |
| } |
| </pre> |
| |
| <p>You then sign your handheld app in any manner you wish (either with the Android Studio |
| <b>Build > Generate Signed APK...</b> menu item or with Gradle <code>signingConfig</code> rules as |
| described in the previous section.</p> |
| |
| <h2 id="PackageManually">Package Manually</h2> |
| <p> |
| It's still possible to package the wearable app into the handheld app manually |
| if you are using another IDE or another method of building. |
| </p> |
| |
| <ol> |
| <li>Include all the permissions declared in the manifest file of the wearable app |
| in the manifest file of the mobile app. For example, if you specify the {@link |
| android.Manifest.permission#VIBRATE} permission for the wearable app, you must also add that |
| permission to the mobile app.</li> |
| <li>Ensure that both the wearable and mobile APKs have the same package name and version |
| number.</li> |
| <li>Copy the signed wearable app to your handheld project's <code>res/raw</code> directory. We'll |
| refer to the APK as <code>wearable_app.apk</code>.</li> |
| <li>Create a <code>res/xml/wearable_app_desc.xml</code> file that contains the version and |
| path information of the wearable app. For example: |
| <pre> |
| <wearableApp package="wearable.app.package.name"> |
| <versionCode>1</versionCode> |
| <versionName>1.0</versionName> |
| <rawPathResId>wearable_app</rawPathResId> <!-- Do not include the .apk extension --> |
| </wearableApp> |
| </pre> |
| |
| <p> |
| The <code>package</code>, <code>versionCode</code>, and <code>versionName</code> are the |
| same values specified in the wearable app's <code>AndroidManifest.xml</code> file. |
| The <code>rawPathResId</code> is the static variable name of the APK resource. For example, |
| for <code>wearable_app.apk</code>, the static variable name is <code>wearable_app</code>. |
| </p> |
| </li> |
| <li> |
| Add a <code>meta-data</code> tag to your handheld app's <code><application></code> tag to |
| reference the <code>wearable_app_desc.xml</code> file. |
| <pre> |
| <meta-data android:name="com.google.android.wearable.beta.app" |
| android:resource="@xml/wearable_app_desc"/> |
| </pre> |
| </li> |
| <li>Build and sign the handheld app.</li> |
| </ol> |
| |
| <h2 id="AssetCompression">Turn off Asset Compression</h2> |
| <p>Many build tools automatically compress any files added to the <code>res/raw</code> |
| directory of an Android app. Because the wearable APK is already zipped, these tools re-compress the |
| wearable APK and the wearable app installer can no longer read the wearable app. |
| </p> |
| |
| <p>When this happens, the installation fails. On the handheld app, the <code>PackageUpdateService</code> |
| logs the following error: "this file cannot be opened as a file descriptor; it is probably compressed." |
| </p> |
| |
| <p>Android Studio doesn't compress your APK by default, but if you are using another build process, |
| ensure that you don't doubly compress the wearable app.</p> |