---
title: Publish a Capacitor App on Huawei AppGallery
description: Publish a Capacitor app on Huawei AppGallery with the APK you already build. Audit plugins for Google Play services and automate every submission.
date:
  created: 2026-09-28
  updated: 2026-09-28
authors:
  - robingenz
categories:
  - Capacitor
  - Cloud
  - Guides
links:
  - Huawei AppGallery Destination: cloud/app-store-publishing/destinations/huawei-appgallery.md
  - Submit Automatically After a Build: cloud/app-store-publishing/submit-automatically.md
faq: true
---

# Publish a Capacitor App on Huawei AppGallery

Yes, you can publish a Capacitor app on Huawei AppGallery with the same APK or App Bundle you build for Google Play, and Capacitor itself has no Google Play services dependency. The work is in your plugins. Huawei phones launched since late 2019 ship without Google services, so push notifications through Firebase Cloud Messaging, Google Maps and Google Play Billing need a check or a fallback before the first upload. This guide covers the plugin audit, the one-time setup in AppGallery Connect and automatic submission from Capawesome Cloud. AppGallery Connect can release an app in up to 200 countries and regions in one submission, so the same APK reaches every market where Huawei sells phones without Google services.

<!-- more -->

<div class="capawesome-z29o10a">
  <a href="https://capawesome.io/" target="_blank">
    <img alt="Try Capawesome Cloud free for 14 days — iOS builds without a Mac" src="https://capawesome.io/assets/banners/cloud-free-trial-capacitor-apps.png" />
  </a>
</div>

**Key takeaways:**

- AppGallery accepts the APK or App Bundle you already build for Google Play, so a Capacitor app needs no separate build for Huawei.
- Capacitor core depends only on AndroidX and the Cordova framework library, so Google Play services problems on Huawei phones come from individual plugins.
- Without Google Play services, FCM, Google Maps, Google Sign-In, Play Billing and unbundled ML Kit modules fail, while Firestore, Crashlytics, Firebase email sign-in and bundled ML Kit models keep working.
- The Capacitor Google Play Services plugin's `getStatus()` method resolves to `SERVICE_MISSING` on Huawei devices, so the app can hide features that need Google Play services.
- A Capawesome Cloud destination uploads builds to AppGallery Connect and, with the release status Completed, submits them for review, which usually takes 1 to 3 working days.

## Same build, different store

AppGallery Connect accepts Android apps as an APK or an App Bundle, the same two formats Google Play takes, so publishing a Capacitor app on Huawei AppGallery starts from the package you already build. Capacitor itself is not the problem. Its Android library depends on AndroidX and the Cordova framework and on nothing from Google, and the platform requirements stop at API level 24 and a recent WebView. The `google-services` Gradle plugin that the app template applies when it finds a `google-services.json` file is a build-time helper, not a runtime dependency on Google Play services.

Which format to upload is the first decision. An APK has to be a 64-bit package under 4 GB, one per version, and Huawei's App Signing service is optional for it. An App Bundle works only after you sign the App Signing agreement and configure a key in AppGallery Connect, because Huawei compiles the bundle into APKs and re-signs them, which takes 2 to 5 minutes, and it rejects bundles whose download size exceeds 150 MB. Huawei documents the first path in its [APK release guide](https://developer.huawei.com/consumer/en/doc/app/agc-help-releaseapkrpk-0000001106463276){:target="_blank"}. The [App Bundle release guide](https://developer.huawei.com/consumer/en/doc/app/agc-help-releasebundle-0000001100316672){:target="_blank"} covers the second.

We recommend the APK, signed with your own keystore. The key stays with you, there is no agreement to sign, and the size limit doesn't apply. Choose that key with care, because every update has to keep the package name and the signature of the version already on AppGallery. If you build with [Capawesome Cloud](https://capawesome.io/){:target="_blank"}, both formats exist after every build. The [Android signing certificate](../../cloud/native-builds/certificates/android.md) you upload once signs the APK.

That APK reaches the Huawei phones sold outside China, which run Android-based EMUI, currently EMUI 15 and 16 on models such as the Pura 80 and the Mate 80 Pro. It does not reach phones in China that run HarmonyOS 5 or later, which accept only native HarmonyOS apps, as Huawei's [migration guide](https://developer.huawei.com/consumer/en/doc/harmonyos-guides/app-data-migration-overview){:target="_blank"} for those devices explains.

## Google Play services audit

Google Play services is the dependency to check before your first AppGallery submission. Huawei phones have shipped without it since the Mate 30 series in September 2019, four months after the US government put Huawei on its Entity List, and Google's own [setup guide](https://developers.google.com/android/guides/setup){:target="_blank"} tells apps to check for Google Play services before they call any Google API on devices without the Play Store. A Google feature that fails on a Huawei phone is also a review risk. AppGallery's [review guidelines](https://developer.huawei.com/consumer/en/doc/app/50104-overview){:target="_blank"} expect an app to work on mainstream Huawei devices (guideline 3.1), and Huawei lists crashes and launches with a blank screen among the common reasons for a rejection.

The table maps common Capacitor plugins to their Google dependency, based on each plugin's Android build file and documentation:

| Plugin | Google services dependency | On Huawei devices |
|---|---|---|
| `@capacitor/push-notifications` | Firebase Cloud Messaging | Breaks |
| [Capacitor Firebase Cloud Messaging plugin](../../sdks/capacitor/firebase/cloud-messaging.md) | Firebase Cloud Messaging | Breaks |
| `@capacitor/google-maps` | Maps SDK for Android | Breaks |
| [Capacitor Google Sign-In plugin](../../sdks/capacitor/google-sign-in.md) | `play-services-auth` | Breaks |
| [Capacitor Purchases plugin](../../sdks/capacitor/purchases.md) (Insiders) | Google Play Billing | Breaks |
| [Capacitor App Update plugin](../../sdks/capacitor/app-update.md) | Play in-app updates | Breaks |
| [Capacitor App Review plugin](../../sdks/capacitor/app-review.md) | Play in-app review | Breaks |
| [Capacitor App Integrity plugin](../../sdks/capacitor/app-integrity.md) | Play Integrity | Breaks |
| [Capacitor Document Scanner plugin](../../sdks/capacitor/document-scanner.md) (Insiders) | Play services ML Kit module | Breaks |
| [Capacitor Watch plugin](../../sdks/capacitor/watch.md) (Insiders) | `play-services-wearable` | Breaks, all methods reject |
| [Capacitor ML Kit Barcode Scanning plugin](../../sdks/capacitor/mlkit/barcode-scanning.md) | Bundled model, Google code scanner | `startScan(...)` works, `scan(...)` breaks |
| [Capacitor Barcode Scanner plugin](../../sdks/capacitor/barcode-scanner.md) (Insiders) | Bundled ML Kit model | Works |
| `@capacitor/geolocation` | `play-services-location` | Works, falls back to `LocationManager` |
| [Capacitor Background Geolocation plugin](../../sdks/capacitor/background-geolocation.md) (Insiders) | `play-services-location` | Works, falls back to the platform location manager |
| [Capacitor MapLibre plugin](../../sdks/capacitor/maplibre.md) | None | Not affected |
| [Capacitor Live Update plugin](../../sdks/capacitor/live-update.md) | None | Not affected |

Plugins marked Insiders are part of the paid [Capawesome Insiders](../../insiders/index.md) subscription.

The barcode rows split on where the ML Kit model lives. Google ships the model either [bundled into the app](https://developers.google.com/ml-kit/vision/barcode-scanning/android){:target="_blank"}, at about 2.4 MB, or downloaded on demand through Google Play services. The Google code scanner behind the ML Kit plugin's `scan(...)` method lives entirely inside Google Play services, while `startScan(...)` runs on the bundled model, which is why one method works on a Huawei phone and the other doesn't.

`@capacitor/geolocation` keeps working because its `enableLocationFallback` option, on by default, switches to Android's `LocationManager` when the Google Play services location checks fail. Its README warns that the fallback "may not be as effective" as the Google implementation. The [Capacitor Geofences plugin](../../sdks/capacitor/geofences.md) (Insiders) uses Google Play services' `GeofencingClient` and documents no fallback. In-app updates need the Play Store, and the App Update plugin's `openAppStore(...)` method opens the Play Store entry, the wrong store for an AppGallery install.

Firebase publishes its own [per-SDK list](https://firebase.google.com/docs/android/android-play-services){:target="_blank"} of what needs Google Play services. Cloud Messaging has no functionality without it, and neither does the Play Integrity provider that the Capacitor Firebase App Check plugin uses on Android. Analytics still sends events, but automatic insights such as demographics need Google Play services. Authentication, Cloud Firestore, Crashlytics, Remote Config, Cloud Storage and Realtime Database don't. The exception inside Authentication is the Google provider of the [Capacitor Firebase Authentication plugin](../../sdks/capacitor/firebase/authentication.md), which adds `play-services-auth` when you enable it, so email and password sign-in keeps working while Google sign-in doesn't.

## Degrade gracefully

The [Capacitor Google Play Services plugin](../../sdks/capacitor/google-play-services.md) tells your app at runtime whether Google Play services exists on the device, so you can hide the features from the table before a Huawei user or reviewer opens them. The plugin is free and depends only on `play-services-base`, whose availability check works on any Android device, including devices without Google Play services. The [Installation](../../sdks/capacitor/google-play-services.md#installation) section of the plugin documentation covers the setup.

[`getStatus()`](../../sdks/capacitor/google-play-services.md#getstatus) resolves to `SERVICE_MISSING` when Google Play services is not installed at all, which is the case on Huawei devices with Huawei Mobile Services, and to `SUCCESS` only when it is installed, enabled and up to date. The following example skips push registration and turns off the map screen unless the status is `SUCCESS`:

```typescript
import { Capacitor } from '@capacitor/core';
import { PushNotifications } from '@capacitor/push-notifications';
import { GooglePlayServices, Status } from '@capawesome/capacitor-google-play-services';

export const features = { maps: true, pushNotifications: true };

const isGooglePlayServicesUsable = async () => {
  if (Capacitor.getPlatform() !== 'android') {
    return true;
  }
  const { status } = await GooglePlayServices.getStatus();
  return status === Status.Success;
};

const initializeFeatures = async () => {
  const usable = await isGooglePlayServicesUsable();
  features.maps = usable;
  features.pushNotifications = usable;
  if (features.pushNotifications) {
    await PushNotifications.register();
  }
};
```

The platform check keeps iOS and web builds away from the plugin, which is Android-only and rejects every call on other platforms. Statuses such as `SERVICE_DISABLED` and `SERVICE_VERSION_UPDATE_REQUIRED` mean Google Play services is installed but disabled or outdated. The features stay off in that case too, until [`makeAvailable()`](../../sdks/capacitor/google-play-services.md#makeavailable) has fixed it through the system dialog and a second `getStatus()` call reports `SUCCESS`. On a Huawei phone, `makeAvailable()` is rejected, because there is no Play Store to install Google Play services from.

Hiding a feature is the minimum. When Huawei users need the feature itself, HMS Core has replacements. For push, that is [Push Kit](https://developer.huawei.com/consumer/en/doc/HMSCore-Guides/service-introduction-0000001050040060){:target="_blank"}. There is no official Capacitor HMS plugin, so Huawei's documented route for Capacitor apps is its Cordova plugin `@hmscore/cordova-plugin-hms-push`, while devices with Google Play services keep the FCM setup from [Capacitor Push Notifications: The Complete Guide](./capacitor-push-notifications-guide.md). Map Kit, Account Kit and Huawei IAP cover maps, sign-in with a HUAWEI ID and in-app purchases, and guideline 6.4 recommends Huawei IAP for apps with in-app purchases without requiring it. Huawei's HMS Toolkit is no shortcut here. Its Convertor rewrites Java and Kotlin projects, not a web layer, and Huawei is sunsetting the toolkit, with overseas services ending on December 30, 2026.

## AppGallery Connect setup

AppGallery Connect requires a verified HUAWEI Developers account before you can create an app. Registration is [free](https://developer.huawei.com/consumer/en/doc/help/identityverfication-0000001053292680){:target="_blank"} for individual and enterprise developers. Individuals verify with a bank document plus an ID card, passport or driver's license, and the bank document has to show the full name in English and stay valid for at least 6 months. Enterprises submit a business license or a DUNS number renewed within the last two years. Huawei reviews either within 1 to 2 working days and emails the result. Two choices are permanent: an individual account can't become an enterprise account later, and the country or region you select during verification can't be changed.

With the account verified, create the Android app under **Apps and atomic services** on the **Android** tab, with APK as the package type. The device type "Mobile phone" includes tablets. The package name and the App or Game category are fixed once set, and the app name has to match the one in your package.

The first version needs a store listing. The APK release guide from the first section lists the fields, and Huawei's [asset requirements](https://developer.huawei.com/consumer/en/doc/app/agc-help-app-material-requirement-0000001146534651){:target="_blank"} set the image specifications:

- **Icon**: 216 × 216 or 512 × 512 pixels, PNG up to 2 MB, not animated.
- **Screenshots**: 3 to 8 images at 800 × 450 or 450 × 800 pixels.
- **Introductions**: A brief introduction of up to 80 characters, with 25 or fewer advised, and a full introduction of up to 8,000 characters.
- **Age rating**: A questionnaire that produces the rating.
- **Privacy policy**: A URL if the app collects user data, plus an easy-to-find link inside the app (guideline 7.1).
- **Language**: English (US) in the app package and on the App information page, if you distribute outside the Chinese mainland.
- **Test account**: Sign-in details for Huawei's reviewers if the app requires sign-in.

Guideline 1.16 bans names, icons and imagery of other device brands and app platforms from your listing, so screenshots with a Google Play badge have to go. If the same app is already on Google Play, AppGallery can reject it as a duplicate; Huawei's [release FAQ](https://developer.huawei.com/consumer/en/doc/app/agc-help-releasefaq-0000001110342644){:target="_blank"} asks the owner to email Huawei operations from the contact details used on Google Play, with the developer name and email address of both accounts. For the assets you share with Apple and Google, see [How to Prepare Your App Store Listing](./how-to-prepare-your-app-store-listing.md).

The last one-time step is the API client that Capawesome Cloud uses to reach AppGallery Connect. The destination guide covers it under [Obtaining credentials](../../cloud/app-store-publishing/destinations/huawei-appgallery.md#obtaining-credentials).

## Submit with Capawesome Cloud

A [Huawei AppGallery destination](../../cloud/app-store-publishing/destinations/huawei-appgallery.md) lets Capawesome Cloud upload a finished Android build to AppGallery Connect, so nobody has to upload APKs in the browser. You create it once, in the Console with the fields the guide lists or with [`apps:destinations:create`](../../cloud/cli/commands.md#appsdestinationscreate) from the Capawesome CLI:

```bash
npx @capawesome/cli apps:destinations:create \
  --app-id 00000000-0000-0000-0000-000000000000 \
  --name "AppGallery Production" \
  --platform android \
  --type huawei-appgallery \
  --huawei-app-id <huawei_app_id> \
  --huawei-client-id <client_id> \
  --huawei-client-secret <client_secret> \
  --android-build-artifact-type apk \
  --android-release-status completed
```

`--app-id` is the ID of your app in Capawesome Cloud, while the three `--huawei-*` values come from the API client you created in AppGallery Connect. The artifact type follows the APK recommendation above, and the release status is explained below. Huawei's Publishing API can neither create an app nor complete its content rating, which is why the listing from the previous section stays a one-time manual step.

From then on, a submission is one command. [`apps:deployments:create`](../../cloud/cli/commands.md#appsdeploymentscreate) takes the build number and the destination name:

```bash
npx @capawesome/cli apps:deployments:create --build-number 42 --destination "AppGallery Production"
```

In the Console, the Deployments page does the same with **Create deployment**. The destination's release status decides whether the upload stays a draft for you to submit in AppGallery Connect or goes to review automatically, as the guide explains under [Release status](../../cloud/app-store-publishing/destinations/huawei-appgallery.md#release-status). The same build number can go to a Google Play Store destination in a second deployment, so one native build serves both stores.

To take the command out of your release process, attach the destination and your signing certificate to an automation that triggers on `v*` tags. Every matching tag then runs the pipeline from Git to build to AppGallery Connect, as described in [Submit Automatically After a Build](../../cloud/app-store-publishing/submit-automatically.md).

A successful deployment means Huawei has the build, not that users can install it. App review usually takes 1 to 3 working days, rejections arrive by email, and reviewers check each release country or region against local policies and remove the ones where the app doesn't comply. If a deployment fails because another version is still under review, the guide covers the fix under [Submission fails because a version is under review](../../cloud/app-store-publishing/destinations/huawei-appgallery.md#submission-fails-because-a-version-is-under-review).

## FAQ

### Can I publish my Capacitor app on Huawei AppGallery?

Yes. AppGallery Connect accepts the same APK or AAB you build for Google Play, and Capacitor core has no Google Play services dependency. Check your plugins first, because Huawei phones ship without Google Play services, and features such as FCM push notifications, Google Maps and Google Play Billing don't work there. A Capawesome Cloud destination can then upload and submit every release.

### Do Huawei phones still run Android apps?

Huawei phones sold outside China do. Huawei's international models run Android-based EMUI, currently EMUI 15 and 16, and install APKs from AppGallery. Phones in China that run HarmonyOS 5 or 6 accept only native HarmonyOS apps, so a Capacitor APK doesn't reach them.

### Does Capacitor need Google Play services?

No. The Capacitor Android library depends only on AndroidX and the Cordova framework. Google Play services comes in through plugins such as `@capacitor/push-notifications`, which uses Firebase Cloud Messaging, and `@capacitor/google-maps`, which uses the Maps SDK for Android. That is why the audit happens at the plugin level.

### How long does AppGallery review take?

Huawei's current release documentation says app review usually takes 1 to 3 working days, and a rejection arrives by email. If your developer account is new, add 1 to 2 working days for identity verification before your first submission.

### Can I upload the same APK to Google Play and AppGallery?

Yes. AppGallery takes the APK you build for Google Play as it is. If Google Play signs your app through Play App Signing, installs from Google Play carry the app signing key that Google holds, while installs from AppGallery carry the key you signed the APK with, so the two usually report different certificate fingerprints.

### Does Capawesome Cloud submit to AppGallery automatically?

Yes. A Huawei AppGallery destination uploads the build to AppGallery Connect and, with the release status Completed, submits the version for review. Attach the destination to an automation that triggers on `v*` tags, and every release tag goes from Git to AppGallery without a manual step.

## Related posts

- [Convert a Web App to a Mobile App in 11 Steps](./11-steps-to-get-your-web-app-on-the-app-store.md)
- [How to Sign & Build Capacitor Apps in the Cloud](./how-to-sign-and-build-your-capacitor-app-in-the-cloud.md)
- [How to Prepare Your App Store Listing](./how-to-prepare-your-app-store-listing.md)

## Try it yourself

Once your Android builds run in Capawesome Cloud, AppGallery is one destination away. Upload your keystore, add a Huawei AppGallery destination and push a `v*` tag to watch the first version arrive in AppGallery Connect. You can run all of it during the 14-day free trial.

[Try Capawesome Cloud Free](https://capawesome.io){ .md-button .md-button--primary }

## Final thoughts

Run the audit before the first upload. If none of your plugins lands in a "Breaks" row, submit the APK you already build. If one does, gate it with `getStatus()`, ship without that feature on Huawei phones, and add an HMS replacement only when Huawei users can't do without it. Sign the APK with your own keystore unless you want Huawei to hold the key, and hand the submissions to a tag automation once the first listing is live.

Before that first submission, put the APK on a Huawei phone without a store, as described in [How to Distribute iOS and Android Apps to Testers](./how-to-distribute-ios-and-android-apps-to-testers.md). Questions about a specific plugin on Huawei devices are welcome on the [Capawesome Discord server](https://discord.gg/VCXxSVjefW){:target="_blank"}, and the [Capawesome newsletter](https://capawesome.io/newsletter/){:target="_blank"} announces new plugins and Cloud features as they ship.
