Quickstart
Publish your first native app to BYD cars — scaffold the project, attest and upload the APK, then promote a staged rollout.
Walk through one full publish, from an empty directory to a staged rollout on real cars. You bring a release-signed .apk; the SDK hashes, attests, uploads, and submits it for review.
Publishing native apps is invite-only. Your account needs the can_publish_native grant, and the CLI signs in with your SSH key. Without both, apk publish returns 403. See Authentication.
Confirm your prerequisites
Before you start, make sure you have:
- The
can_publish_nativegrant on your account (curated invite in v1). - An SSH key registered and signed in per Authentication. The same key attests every artifact you publish (this is K1 — see Signing and trust).
- A release-signed
.apkyou built yourself. The SDK does not build Android; it hashes, attests, uploads, and submits the file you point it at.
Scaffold the project
Create a project directory with a starter apk.json and .gitignore, then move into it.
i99dash apk init my-app
cd my-appThe generated apk.json looks like this:
{
"id": "com.example.myapp",
"versionName": "1.0.0",
"versionCode": 1,
"apkPath": "./app-release.apk",
"signerSha256": "REPLACE_WITH_APKSIGNER_SHA256",
"category": "utilities",
"requires": { "minAndroidSdk": 29 }
}Edit the manifest
Read the SHA-256 of your APK signing certificate:
apksigner verify --print-certs ./app-release.apkThen edit apk.json:
- Set
idto your AndroidapplicationId(reverse-DNS, e.g.com.acme.dashcam). This is your durable identity — never change it after publishing. - Set
apkPathto the relative path of your release-signed.apk. - Paste the certificate SHA-256 into
signerSha256(the value afterSHA-256in theapksigneroutput). - Set
versionName(display string) andversionCode(positive integer; the ordering key).
For the full field reference, see apk.json reference.
Validate
Check the manifest, the .apk, and the signer SHA before you upload anything.
i99dash apk validateFix any reported errors until validation passes.
Publish
Validate, hash, SSH-attest, request a presigned URL, PUT the .apk direct to storage, and submit the manifest for review.
i99dash apk publishThe submit lands in pending — native code on a vehicle goes through human review and is not auto-approved. To rehearse without uploading, run i99dash apk publish --dry-run. For every flag, see the CLI reference.
Wait for approval
Check where your release sits in review:
i99dash apk statusThe state moves pending → approved once an admin approves it. On approval, the platform mints the signed release envelope the car verifies offline (K3 — see Signing and trust).
Promote a staged rollout
Promote the approved release to a fraction of cars first, then raise it as you gain confidence.
i99dash apk promote --rollout 10--rollout 10 exposes the release to a stable per-car bucket of roughly 10% of cars. Re-run with a higher percentage as you watch it, and use --status published for a full release that supersedes older versions. See Distribution for how rollout buckets work.
What the owner sees
There is no silent install for third-party apps. The car lists approved apps in its owner-facing Native Apps tab, and the owner installs each one through the standard Android install dialog. The car verifies the release envelope, APK hash, signer SHA, downgrade, and revocation checks offline before that dialog appears.
Next time you ship
Bump versionCode to a value strictly greater than the package current max — a downgrade or replay is rejected at submit. Update versionName, then run i99dash apk publish again. The new version goes back through review, then promote it the same way.