RORK LABJP
EVENT — Apple holds its Surprise and Shine event today, September 9, starting at 10:00 Pacific. That lands in the small hours of September 10 in JapanEXPECT — Expected are the iPhone 18 Pro and Pro Max, a foldable, the 2nm A20 Pro chip, and release dates for iOS 27 and its sibling updatesWAIT — As this is written the event has not happened yet. Rumor-stage writing and post-announcement writing look identical once they are mixed togetherMAX — Since Rork Max generates native Swift, Apple news is not somebody else's problem. Worth repeating that the standard product still writes React NativeSIMULATOR — Rork Max compiles on cloud Macs and lets you check the result in a streaming iOS simulator inside the browser, with no Xcode and no Mac hardwareSEASON — A new OS is when automated build pipelines wobble most. An article selling convenience owes its readers a word about that wobbleEVENT — Apple holds its Surprise and Shine event today, September 9, starting at 10:00 Pacific. That lands in the small hours of September 10 in JapanEXPECT — Expected are the iPhone 18 Pro and Pro Max, a foldable, the 2nm A20 Pro chip, and release dates for iOS 27 and its sibling updatesWAIT — As this is written the event has not happened yet. Rumor-stage writing and post-announcement writing look identical once they are mixed togetherMAX — Since Rork Max generates native Swift, Apple news is not somebody else's problem. Worth repeating that the standard product still writes React NativeSIMULATOR — Rork Max compiles on cloud Macs and lets you check the result in a streaming iOS simulator inside the browser, with no Xcode and no Mac hardwareSEASON — A new OS is when automated build pipelines wobble most. An article selling convenience owes its readers a word about that wobble
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 164targetSdkAndroidManifest2Expo203indie development40

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.
Business2026-08-31
After the Google Play deadline: which dormant Android apps to raise, and which to leave at 35
Apps you have stopped updating are governed by a different bar than apps you still ship. Here is how to inventory effective targetSdk across your builds and decide which apps to raise, hold, or retire.
App Dev2026-09-02
Leave image out of eas.json and an SDK bump moves your Xcode and pnpm too
If eas.json has no image field, your builds run on the auto alias. Move one SDK alias and Xcode, Node.js, pnpm and fastlane all change together. Here is how to read the image name out of your last green build and decide whether to pin it before Xcode 27 lands.
📚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