RORK LABJP
DEADLINE — Google Play's Android 16 (API level 36) requirement lands tomorrow, August 31. One day left, and it covers new apps and updates to existing ones alikeDECISION — An extension cannot be filed once the deadline passes. So the real cutoff today is not the build itself but deciding whether to make it or to file insteadVISIBILITY — Apps you no longer update are not exempt. Anything still below API level 35 stops appearing for new users on newer Android devicesPITFALL — When a dependency has not caught up to the new API level, the local build can pass while the store pre-check stops you. Reading your own code will not surface thatEXPO — expo@57.0.17 moved React Native to 0.86.3. A pattern is emerging of small non-breaking patches between major SDK releases, which lowers the cost of keeping currentCHOICE — Shipping to Android too points at Rork proper and its React Native output; Apple-specific capabilities at the center of the spec point at Rork Max and Swift. It is a question of what you shipDEADLINE — Google Play's Android 16 (API level 36) requirement lands tomorrow, August 31. One day left, and it covers new apps and updates to existing ones alikeDECISION — An extension cannot be filed once the deadline passes. So the real cutoff today is not the build itself but deciding whether to make it or to file insteadVISIBILITY — Apps you no longer update are not exempt. Anything still below API level 35 stops appearing for new users on newer Android devicesPITFALL — When a dependency has not caught up to the new API level, the local build can pass while the store pre-check stops you. Reading your own code will not surface thatEXPO — expo@57.0.17 moved React Native to 0.86.3. A pattern is emerging of small non-breaking patches between major SDK releases, which lowers the cost of keeping currentCHOICE — Shipping to Android too points at Rork proper and its React Native output; Apple-specific capabilities at the center of the spec point at Rork Max and Swift. It is a question of what you ship
Articles/App Dev
App Dev/2026-08-30Advanced

After Bumping targetSdk to 36, Which Part of Your Dependencies Should You Actually Read

I opened six real dependency AARs and counted what they contribute to my manifest. Not one declares targetSdkVersion, and twelve permissions arrive that I never wrote. Here is what to check before you submit.

Android 163targetSdkAndroidManifest2Expo190indie development37

Premium Article

Bumping targetSdkVersion to 36 and watching the build go green is the easy part. I got stuck one step later. I kept reading that a dependency which has not kept up with the new API level can pass a local build and still get stopped by the store's pre-submission checks — and I realised I had no idea what, specifically, I was supposed to look at on the dependency side.

When you carry several apps at once as an indie developer, the day before a deadline is not the day to read six changelogs. What I wanted was something mechanical: a list of what my dependencies are writing into my own manifest, produced in a couple of minutes. This is the record of getting that list.

Here is the finding that reframed the whole exercise. Dependency manifests do not declare targetSdkVersion. Across the six AARs I actually opened, not a single one did. "Audit the targetSdk of your dependencies" turns out to be a search for a value that is not there.

I opened six dependency manifests and counted

I pulled the AARs straight from Google's Maven repository — the libraries that show up in almost any Expo-based app — and read the AndroidManifest.xml inside each one. The manifest in an AAR is plain text, not binary XML, so no Android SDK and no Gradle are required. Unzip and read.

Here is what the uses-sdk line contained in each case.

Dependency (version)uses-sdk declarationtargetSdkVersion
androidx.core:core 1.13.1minSdkVersion="19"not declared
androidx.work:work-runtime 2.9.1minSdkVersion="14"not declared
androidx.media3:media3-session 1.4.1minSdkVersion="19"not declared
com.google.android.gms:play-services-ads-lite 23.3.0minSdkVersion="21"not declared
com.google.android.gms:play-services-measurement-api 22.1.2minSdkVersion="21"not declared
com.google.firebase:firebase-messaging 24.0.1minSdkVersion="21"not declared

Six out of six carry minSdkVersion and nothing else. That is not laziness or staleness on the library authors' part. It is how the platform works.

A library's targetSdkVersion has no effect on your artifact. Android applies behaviour changes per process, based on the application's targetSdkVersion. Library code runs inside that same process, so the moment your app declares 36, the library's code starts running under the rules of 36 as well. There is no mechanism by which a library gets to say "I am still a 34 library."

That reframes the actual risk. Raising your value does not leave outdated libraries alone — it drags outdated library code into the new rules. And the library's own declarations tell you nothing about whether its code is ready for that. Since the thing I wanted to inspect does not exist, I had to change what I was inspecting.

What does arrive: permissions, services, queries, and properties

targetSdkVersion never crosses the boundary. Plenty of other things do. Across the same six dependencies, counting unique entries, twelve permissions land in my merged manifest. I wrote none of them.

DependencyWhat it contributes
play-services-ads-lite 23.3.06 permissions (INTERNET / ACCESS_NETWORK_STATE / AD_ID / ACCESS_ADSERVICES_AD_ID / ACCESS_ADSERVICES_ATTRIBUTION / ACCESS_ADSERVICES_TOPICS), 1 queries block, 1 property, 1 service, 3 activities
work-runtime 2.9.14 permissions (WAKE_LOCK / ACCESS_NETWORK_STATE / RECEIVE_BOOT_COMPLETED / FOREGROUND_SERVICE), 3 services, 7 receivers
firebase-messaging 24.0.14 permissions (ACCESS_NETWORK_STATE / POST_NOTIFICATIONS / WAKE_LOCK / c2dm.permission.RECEIVE), 2 services
play-services-measurement-api 22.1.26 permissions, 1 service, 1 property
androidx.core 1.13.1Defines and uses DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION, prefixed with your applicationId
media3-session 1.4.1Nothing beyond uses-sdk

One of the six contributes nothing at all. That matters practically: you do not have to suspect every dependency, only the ones that actually write something.

The entries I had not been tracking were queries and property. A queries block declares package visibility — which other apps you are allowed to ask about. The property element here points at an AdServices configuration resource. Neither shows up if you are only skimming a permission list. I had been shipping an app with <property android:name="android.adservices.AD_SERVICES_CONFIG"> in its manifest without having thought about it once. If you monetise with AdMob, that entry is already in your Google Play build too.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You will be able to list exactly what every dependency contributes to your manifest, without installing the Android SDK
You will be able to spot the places where two dependencies cancel each other out, before the build reaches the store
You will be able to separate what a static manifest check can prove from what only a device run can confirm, and stop mixing the two
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

App Dev2026-08-26
What Android 16 ignores on tablets, and why app.json gives you no way out
Targeting API level 36 means screenOrientation is ignored on displays at least 600dp wide. Here is how to check your project without a tablet, why app.json cannot express a fix, and what the opt-out property actually restores.
App Dev2026-08-25
Put Your Live Rork App on a Spare iPhone Before iOS 27 Ships
iOS 27 arrives in September and developer beta 7 is already out. Here is how to turn an old iPhone into a beta device, what to check first, and which fixes you can ship from JavaScript without waiting for review.
App Dev2026-08-24
I Moved the Thumbnails Assuming the Shipped Build Would Keep Asking for the Old Path
Reorganizing image directories on the server does not reach the builds already installed on people's phones. Here is the two-way fallback that returns 200 for both the old and new paths, the ordering rule for images versus catalog, and the four checks I run through a CDN before calling a release live.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →