Hidden SDKs in Your App Binary Can Cause Store Rejection
9 Feb 2026 · 4 min read · Erik van Kammen
You wrote the code. You chose the dependencies. You ran the build. But do you know what ended up inside your compiled binary?
For most teams, the answer is incomplete.
The app you submit to Apple or Google is not a direct reflection of your source code. It's a compiled artifact. The difference matters.
Source code analysis shows what you intended to include. Binary analysis shows what actually shipped. The difference is significant because transitive dependencies, bundled resources, and build-time changes can all add components you didn't track.
When you add an SDK, you're not only adding that package. You're also adding its dependencies, their dependencies, and bundled resources. This is the transitive dependency chain.
Your source files and lockfiles give a partial view. The compiled binary shows the full result after code merging, optimization, resource bundling, and metadata embedding. App stores review the binary, not your source.
| Signal | Visible in Source | Visible in Binary | Risk if Missed |
|---|---|---|---|
| Direct dependencies | Yes | Yes | Low |
| Transitive dependencies | Partially (lock files) | Yes | High |
| Embedded fonts | No | Yes | Legal exposure |
| Privacy-relevant APIs | No (runtime) | Yes (symbols) | Store rejection |
| Bundled certificates | No | Yes | Security risk |
Some SDKs bundle font files. These fonts are included in your binary and may require a license for embedding.
If a commercial font is shipped without proper licensing, this creates legal risk.
Some SDKs collect data by default or enable telemetry automatically.
Examples:
This becomes a problem when your privacy policy doesn't reflect it or your store disclosures are incomplete.
SDKs may use APIs that are deprecated, restricted, or discouraged.
Not all deprecated APIs cause rejection. But certain categories, such as private or removed APIs, can trigger review issues.
Some SDKs declare permissions you don't actively use.
Example: voice-related permissions in a mapping SDK.
On Android this is more visible at install time. On iOS this typically appears when permission prompts are triggered.
Both platforms are increasing enforcement.
Apple:
Google:
In both cases, you're responsible for everything in your binary. SDK behavior counts as your behavior.
Don't rely only on your Podfile, build.gradle, or package.json. Inspect the IPA, APK, or AAB. This is what users install and what stores evaluate.
For each SDK:
Compare this with your privacy policy and store declarations.
Look for fonts, images, and config files. These can introduce licensing issues or hidden functionality.
Don't stop at direct dependencies. Include transitive libraries and bundled frameworks.
SDK contents change over time. Updates, new dependencies, and build changes can all introduce issues. This requires continuous checks in your CI/CD pipeline, not one-time audits.
Most teams make decisions based on source code.
But source shows intent. Binary shows reality.
If you don't inspect the binary, you're working with incomplete information.
A reliable approach is:
AppCompliance automates this by scanning IPA, APK, and AAB files and surfacing SDK inventory, embedded fonts, API usage, and data collection signals.
No tool is perfect. Manual validation is still needed for edge cases. But without binary-level visibility, issues are easy to miss.
Teams that treat binary analysis as part of their build process have fewer surprises during review and fewer compliance risks.
Everything technical in this post is checkable from the build itself, and that is exactly what AppCompliance does: upload an iOS or Android build, and minutes later you have every issue that would get it rejected, with the exact fix next to it.
One email when we open the doors. No spam, just the launch.