<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: orange black</title>
    <description>The latest articles on DEV Community by orange black (@orange_black_1c98182920bb).</description>
    <link>https://dev.to/orange_black_1c98182920bb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3931265%2Fb0dcbd27-545e-462a-bde1-32888cfa1a63.jpg</url>
      <title>DEV Community: orange black</title>
      <link>https://dev.to/orange_black_1c98182920bb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orange_black_1c98182920bb"/>
    <language>en</language>
    <item>
      <title>How to find out what SDKs, ad networks, and APIs a competitor's Android app uses</title>
      <dc:creator>orange black</dc:creator>
      <pubDate>Thu, 17 Sep 2026 11:55:14 +0000</pubDate>
      <link>https://dev.to/orange_black_1c98182920bb/how-to-find-out-what-sdks-ad-networks-and-apis-a-competitors-android-app-uses-4obk</link>
      <guid>https://dev.to/orange_black_1c98182920bb/how-to-find-out-what-sdks-ad-networks-and-apis-a-competitors-android-app-uses-4obk</guid>
      <description>&lt;h1&gt;
  
  
  How to find out what SDKs, ad networks, and APIs a competitor's Android app uses
&lt;/h1&gt;

&lt;p&gt;You can install an app in ten seconds and still have no idea how it makes money. That's the gap this post is about.&lt;/p&gt;

&lt;p&gt;Below is the whole workflow — from a Play Store URL to a list of SDKs, ad networks, and API endpoints — using only free tools, plus three findings from real teardowns to show what the output actually looks like. Everything here works on a Mac or Linux box; no rooted device required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One honest prerequisite:&lt;/strong&gt; you need the APK. Download it from a mirror you trust (APKMirror, APKPure, or &lt;code&gt;bundletool&lt;/code&gt; from the developer's own bundle), and keep it local. Don't redistribute it — you're analyzing, not republishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0 — Pull the manifest first (30 seconds, no decompiler)
&lt;/h2&gt;

&lt;p&gt;An APK is a ZIP. Before you install anything, get the facts that are cheap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unzip &lt;span class="nt"&gt;-l&lt;/span&gt; app.apk | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;          &lt;span class="c"&gt;# what's in the package&lt;/span&gt;
unzip &lt;span class="nt"&gt;-p&lt;/span&gt; app.apk AndroidManifest.xml &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; manifest.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the manifest (readable once you run it through &lt;code&gt;aapt2 dump&lt;/code&gt; or &lt;code&gt;apktool&lt;/code&gt;) you already get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;permissions&lt;/strong&gt; — a surprising amount of monetization intent is visible here (&lt;code&gt;AD_ID&lt;/code&gt;, &lt;code&gt;ACCESS_FINE_LOCATION&lt;/code&gt;, &lt;code&gt;POST_NOTIFICATIONS&lt;/code&gt;, &lt;code&gt;BILLING&lt;/code&gt;, &lt;code&gt;RECEIVE_BOOT_COMPLETED&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;declared services and receivers&lt;/strong&gt; — ad SDKs register background components with recognisable names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;meta-data&amp;gt;&lt;/code&gt; blocks&lt;/strong&gt; — attribution SDKs (Adjust, AppsFlyer, Facebook) put their app IDs here in plain text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;minSdk / targetSdk&lt;/strong&gt; — a fast signal of how actively the app is maintained&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Half the questions people ask ("does this app use X?") are answered at this step alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Decompile, don't reverse
&lt;/h2&gt;

&lt;p&gt;You are not rebuilding the app. You want strings, class names, and dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apktool d app.apk &lt;span class="nt"&gt;-o&lt;/span&gt; out/            &lt;span class="c"&gt;# resources, manifest, smali&lt;/span&gt;
jadx &lt;span class="nt"&gt;-d&lt;/span&gt; jadx-out app.apk             &lt;span class="c"&gt;# Java-ish source, greppable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;jadx&lt;/code&gt; output is imperfect — obfuscated apps rename everything — but SDK integration code is almost never obfuscated, because the SDK vendors ship their own class names and those names are what the app has to call.&lt;/p&gt;

&lt;p&gt;Then grep for the cohort:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.google.android.gms.ads"&lt;/span&gt; jadx-out/     &lt;span class="c"&gt;# AdMob&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.facebook.ads"&lt;/span&gt; jadx-out/                &lt;span class="c"&gt;# Meta Audience Network&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.applovin"&lt;/span&gt; jadx-out/                    &lt;span class="c"&gt;# AppLovin / MAX&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.unity3d.ads"&lt;/span&gt; jadx-out/                 &lt;span class="c"&gt;# Unity Ads&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.ironsource"&lt;/span&gt; jadx-out/                  &lt;span class="c"&gt;# ironSource / LevelPlay&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.vungle&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;com.chartboost&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;com.adcolony"&lt;/span&gt; jadx-out/
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.adjust.sdk&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;com.appsflyer&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;com.kochava"&lt;/span&gt; jadx-out/   &lt;span class="c"&gt;# attribution&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rIl&lt;/span&gt; &lt;span class="s2"&gt;"com.amplitude&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;com.mixpanel&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;app.cash.turbine&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;io.sentry"&lt;/span&gt; jadx-out/  &lt;span class="c"&gt;# analytics/crash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details that separate a real answer from a grep hit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A class name is not a running network.&lt;/strong&gt; Finding &lt;code&gt;com.applovin&lt;/code&gt; proves the SDK is &lt;em&gt;bundled&lt;/em&gt;. Whether it's &lt;em&gt;initialized&lt;/em&gt; is a different question — look for the init call and for a mediation config (&lt;code&gt;applovin_settings&lt;/code&gt;, &lt;code&gt;MAX_Ad_Unit&lt;/code&gt;, or a remote config key).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check &lt;code&gt;assets/&lt;/code&gt;.&lt;/strong&gt; Some SDKs ship as a hidden DEX loaded at runtime, so they never appear in the main &lt;code&gt;classes.dex&lt;/code&gt; grep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Count the adapters, not the SDKs.&lt;/strong&gt; Mediation adapters (&lt;code&gt;com.applovin.mediation.adapters.*&lt;/code&gt;, &lt;code&gt;com.google.ads.mediation.*&lt;/code&gt;) are what tell you which networks actually compete for your impression.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2 — Find the API surface
&lt;/h2&gt;

&lt;p&gt;Two cheap passes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# hardcoded hosts in resources and code&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rhoE&lt;/span&gt; &lt;span class="s2"&gt;"https?://[a-zA-Z0-9._-]+"&lt;/span&gt; out/res jadx-out &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s|https\?://||'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;/ &lt;span class="nt"&gt;-f1&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then separate them into &lt;strong&gt;first-party&lt;/strong&gt; (the vendor's own gateway) and &lt;strong&gt;third-party&lt;/strong&gt; (SDK endpoints). The first-party list is where the interesting structure lives — and it's also where people accidentally leave things they shouldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;Three findings from teardowns we've published, chosen because they're the kind of thing you can't see from the outside:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Six ad networks running simultaneously, with hybrid header bidding + waterfall.&lt;/strong&gt; Not "the app has ads" — six mediation adapters, with a server-controlled configuration (&lt;code&gt;ScannerRewardRatio.xml&lt;/code&gt;, a remote endpoint) that lets the vendor re-weight networks without shipping an update. If you're building a mediation stack, this is the reference architecture for the productivity category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Facebook Audience Network shipped as a hidden DEX in &lt;code&gt;assets/&lt;/code&gt;.&lt;/strong&gt; &lt;code&gt;audience_network.dex&lt;/code&gt;, ~5 MB, loaded at runtime rather than linked at build time. That's a deliberate cold-start trade: you pay a few hundred ms later to keep the base APK small. It also means a naive &lt;code&gt;classes.dex&lt;/code&gt; grep misses it entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Staging endpoints left in production.&lt;/strong&gt; Six sandbox/staging hosts hardcoded alongside the live ones. Not a vulnerability by itself, but it tells you how the team ships — and it's a reminder to grep for &lt;code&gt;-dev&lt;/code&gt;, &lt;code&gt;-staging&lt;/code&gt;, &lt;code&gt;-test&lt;/code&gt; before you ship.&lt;/p&gt;

&lt;p&gt;Other things that fall out of the same workflow: which authentication providers an app supports (we found seven, including region-specific ones), whether API responses are encrypted at the transport layer or above it, and which privacy APIs (Topics, Attribution, Ad ID) are actually wired up versus merely declared in the manifest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow, condensed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Where the answer is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What does it monetize with?&lt;/td&gt;
&lt;td&gt;manifest permissions + mediation adapters in &lt;code&gt;jadx&lt;/code&gt; output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which ad networks?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;com.*mediation.adapters&lt;/code&gt; classes + remote config keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which attribution/analytics?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;meta-data&amp;gt;&lt;/code&gt; in the manifest + SDK class names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What are its backends?&lt;/td&gt;
&lt;td&gt;hostname histogram from &lt;code&gt;res/&lt;/code&gt; and code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is it native, hybrid, or Flutter?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lib/*.so&lt;/code&gt;, &lt;code&gt;flutter_assets/&lt;/code&gt;, &lt;code&gt;classes.dex&lt;/code&gt; count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How actively maintained?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;targetSdk&lt;/code&gt;, SDK versions bundled, release cadence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Two caveats worth stating out loud
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version drift.&lt;/strong&gt; Everything is a snapshot of one APK version. Record the version code and date next to every finding, or the analysis rots silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled ≠ used.&lt;/strong&gt; For anything that decides a business decision, confirm the SDK is initialized and reachable, not merely present.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  If you want the worked examples
&lt;/h2&gt;

&lt;p&gt;We publish full teardowns at &lt;a href="https://appxray.blackorange.org/" rel="noopener noreferrer"&gt;appxray.blackorange.org&lt;/a&gt; — two are free and complete, no signup: &lt;a href="https://appxray.blackorange.org/case/camscanner.html" rel="noopener noreferrer"&gt;CamScanner&lt;/a&gt; (306 MB XAPK, 27 split APKs, six-network mediation) and &lt;a href="https://appxray.blackorange.org/case/duolingo.html" rel="noopener noreferrer"&gt;Duolingo&lt;/a&gt; (hybrid monetization, education category). Both include the SDK list, ad network breakdown, API endpoints, and architecture — the same output as the workflow above, minus the four hours.&lt;/p&gt;

&lt;p&gt;If you'd rather not spend the evening in &lt;code&gt;jadx&lt;/code&gt;, that's what we do: send a Play Store link, get the report in about two hours, &lt;strong&gt;$29 per app&lt;/strong&gt; (or $19 each for three or more). No account needed — the &lt;a href="https://appxray.blackorange.org/#pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; explains what's in it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: this post is written by the team that sells that service. The methodology above is free and complete — you can run it yourself today, and the two sample reports are public so you can judge the output before paying anything.&lt;/em&gt;&lt;/p&gt;







&lt;p&gt;&lt;strong&gt;More teardowns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/how-does-duolingo-monetize-i-decompiled-the-android-app-v6795-5bmn"&gt;How Does Duolingo Monetize? I Decompiled the Android App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/i-reverse-engineered-camscanner-heres-whats-inside-3nec"&gt;What Ad Networks Does CamScanner Use? I Decompiled the APK to Find Out&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>showdev</category>
      <category>mobile</category>
      <category>monetization</category>
    </item>
    <item>
      <title>How Does Duolingo Monetize? I Decompiled the Android App (v6.79.5)</title>
      <dc:creator>orange black</dc:creator>
      <pubDate>Tue, 26 May 2026 07:05:46 +0000</pubDate>
      <link>https://dev.to/orange_black_1c98182920bb/how-does-duolingo-monetize-i-decompiled-the-android-app-v6795-5bmn</link>
      <guid>https://dev.to/orange_black_1c98182920bb/how-does-duolingo-monetize-i-decompiled-the-android-app-v6795-5bmn</guid>
      <description>&lt;p&gt;I wanted to know how Duolingo makes money on Android -- ads vs Super subscription, which SDKs they use, and how aggressive the free tier is. So I decompiled &lt;strong&gt;Duolingo 6.79.5&lt;/strong&gt; (164 MB APK, 11 DEX files, 242 activities).&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IronSource mediation&lt;/strong&gt; sits at the center -- Unity Ads, Vungle, Moloco, AdMob, Facebook, and Pangle all plug in around it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook Audience Network&lt;/strong&gt; ships as a &lt;strong&gt;5 MB hidden DEX&lt;/strong&gt; in assets (same trick as CamScanner)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7+ ad networks&lt;/strong&gt; for free users; &lt;strong&gt;Google Play Billing&lt;/strong&gt; for Super/Plus (no RevenueCat found)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kotlin + Jetpack Compose&lt;/strong&gt; for the main app; &lt;strong&gt;Unity&lt;/strong&gt; for some game modules (chess, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging APIs&lt;/strong&gt; (&lt;code&gt;android-api-stage&lt;/code&gt;, &lt;code&gt;goals-api-stage-*&lt;/code&gt;) are hardcoded in the production build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adjust&lt;/strong&gt; + &lt;strong&gt;Sentry&lt;/strong&gt; (+ Firebase) for attribution and crashes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Duolingo Makes Money
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Subscriptions (Super / Plus)
&lt;/h3&gt;

&lt;p&gt;Duolingo uses &lt;strong&gt;Google Play Billing&lt;/strong&gt; directly -- &lt;code&gt;ProxyBillingActivity&lt;/code&gt;, &lt;code&gt;PlusPurchaseFlowActivity&lt;/code&gt;, strings for gems and family plans. Deep links hit &lt;code&gt;duolingo.com/settings/super&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I did &lt;strong&gt;not&lt;/strong&gt; find RevenueCat or Superwall in the DEX. Subscription logic appears first-party on top of Google's billing library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ads (free tier)
&lt;/h3&gt;

&lt;p&gt;Free users hit a &lt;strong&gt;mediation-heavy&lt;/strong&gt; stack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IronSource&lt;/td&gt;
&lt;td&gt;Mediation hub (most SDK surface area)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unity Ads&lt;/td&gt;
&lt;td&gt;Mediated demand + game ad units&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google AdMob&lt;/td&gt;
&lt;td&gt;Google demand, MRAID native templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facebook AN&lt;/td&gt;
&lt;td&gt;Hidden &lt;code&gt;audience_network.dex&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pangle (TikTok)&lt;/td&gt;
&lt;td&gt;Rewarded, interstitial, app open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vungle&lt;/td&gt;
&lt;td&gt;Video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moloco&lt;/td&gt;
&lt;td&gt;Programmatic / MRAID / VAST&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Duolingo-owned ad screens include &lt;code&gt;CustomNativeAdActivity&lt;/code&gt;, &lt;code&gt;FullscreenNetworkNativeAdActivity&lt;/code&gt;, and &lt;code&gt;PlusPromoVideoActivity&lt;/code&gt; -- ads show up at &lt;strong&gt;session end&lt;/strong&gt; and league flows, not random webviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  The hidden Facebook DEX (again)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assets/audience_network.dex  ~5 MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meta's SDK is not fully embedded in the main multidex load. It is loaded from assets when needed -- a common pattern to protect cold start on huge apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack (what they built with)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Kotlin + Jetpack Compose&lt;/strong&gt; (thousands of references)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Games&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Unity&lt;/strong&gt; (&lt;code&gt;UnityActivity&lt;/code&gt;, chess promo assets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;OkHttp, Retrofit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media&lt;/td&gt;
&lt;td&gt;ExoPlayer, Lottie, Rive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attribution&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Adjust&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crashes&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Sentry&lt;/strong&gt; (&lt;code&gt;duolingo-sentry.sentry.io&lt;/code&gt;) + Firebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Min SDK &lt;strong&gt;29&lt;/strong&gt; -- they have dropped pre-Android 10 devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staging servers in production
&lt;/h2&gt;

&lt;p&gt;Same class of mistake as other big apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;android-api-stage.duolingo.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;goals-api-stage.duolingo.com&lt;/code&gt; (+ stage-2, stage-3)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;infra-edge-gateway-stage-cf.duolingo.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful if you are researching API behavior; risky if those hosts expose looser auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Duolingo vs CamScanner (quick compare)
&lt;/h2&gt;

&lt;p&gt;I &lt;a href="https://appxray.blackorange.org/case/camscanner.html" rel="noopener noreferrer"&gt;decompiled CamScanner earlier&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;CamScanner&lt;/th&gt;
&lt;th&gt;Duolingo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mediation lead&lt;/td&gt;
&lt;td&gt;AdMob + PubMatic bidding&lt;/td&gt;
&lt;td&gt;IronSource + Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;Native + Flutter&lt;/td&gt;
&lt;td&gt;Compose + Unity games&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad networks&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;7+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden Meta DEX&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Education apps and utility apps converge on the same playbook: &lt;strong&gt;many networks, one mediator, lazy-load Meta&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I left out of this post
&lt;/h2&gt;

&lt;p&gt;The full report includes 60+ first-party API hosts, complete permission breakdown, schools/DET endpoints, and module-level Activity mapping. This post is the highlights.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;I run &lt;a href="https://appxray.blackorange.org" rel="noopener noreferrer"&gt;AppXray&lt;/a&gt;&lt;/strong&gt; -- send any Google Play link, get a full reverse-engineering report (PDF + Markdown) in ~2 hours. $29 for one app, $19/app for batches.&lt;/p&gt;

&lt;p&gt;Free samples: &lt;a href="https://appxray.blackorange.org/case/camscanner.html" rel="noopener noreferrer"&gt;CamScanner teardown&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions about Duolingo's stack? Comment below.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More teardowns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/how-to-find-out-what-sdks-ad-networks-and-apis-a-competitors-android-app-uses-4obk"&gt;How to find out what SDKs, ad networks, and APIs a competitor's Android app uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/i-reverse-engineered-camscanner-heres-whats-inside-3nec"&gt;What Ad Networks Does CamScanner Use? I Decompiled the APK to Find Out&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>mobile</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>What Ad Networks Does CamScanner Use? I Decompiled the APK to Find Out</title>
      <dc:creator>orange black</dc:creator>
      <pubDate>Thu, 14 May 2026 12:47:03 +0000</pubDate>
      <link>https://dev.to/orange_black_1c98182920bb/i-reverse-engineered-camscanner-heres-whats-inside-3nec</link>
      <guid>https://dev.to/orange_black_1c98182920bb/i-reverse-engineered-camscanner-heres-whats-inside-3nec</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://appxray.blackorange.org/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappxray.blackorange.org%2Fog-appxray.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://appxray.blackorange.org/" rel="noopener noreferrer" class="c-link"&gt;
            Android App Reverse Engineering Report | APK Teardown — AppXray
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Send a Google Play link. Get a full APK teardown — architecture, APIs, SDKs, ad networks, permissions. Delivered in 2 hours.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fappxray.blackorange.org%2Ffavicon.svg" width="32" height="32"&gt;
          appxray.blackorange.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I wanted to know what ad networks CamScanner uses and how they monetize a 100M+ download scanning app. So I reverse-engineered the APK.&lt;/p&gt;

&lt;p&gt;Here's what I found inside CamScanner v7.16.5 (306 MB, 12 DEX files, 369 activities).&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6 ad networks&lt;/strong&gt; running at the same time&lt;/li&gt;
&lt;li&gt;Header bidding + waterfall hybrid — not just AdMob&lt;/li&gt;
&lt;li&gt;Facebook Audience Network loaded as a &lt;strong&gt;hidden DEX file&lt;/strong&gt; at runtime&lt;/li&gt;
&lt;li&gt;6 staging/test servers &lt;strong&gt;exposed in the production build&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Hybrid Flutter + Native architecture using Alibaba's FlutterBoost&lt;/li&gt;
&lt;li&gt;34 third-party SDKs total&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Ad Stack: 6 Networks Running Simultaneously
&lt;/h2&gt;

&lt;p&gt;Most indie apps use AdMob alone. CamScanner runs &lt;strong&gt;six ad networks in parallel&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google AdMob&lt;/td&gt;
&lt;td&gt;Primary SDK, all ad formats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pangle (ByteDance/TikTok)&lt;/td&gt;
&lt;td&gt;Secondary — 14 Activity classes registered, big in Asia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facebook Audience Network&lt;/td&gt;
&lt;td&gt;Loaded dynamically as a separate DEX at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PubMatic OpenBid&lt;/td&gt;
&lt;td&gt;Header bidding via OpenRTB 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vungle&lt;/td&gt;
&lt;td&gt;Video ads (rewarded + interstitial)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Ad Manager&lt;/td&gt;
&lt;td&gt;DoubleClick — for premium/direct-sold inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The interesting part isn't the list — it's &lt;strong&gt;how they combine them&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Header Bidding + Waterfall Hybrid
&lt;/h3&gt;

&lt;p&gt;PubMatic runs real-time auctions (OpenRTB 2.5) &lt;strong&gt;in parallel&lt;/strong&gt; with AdMob's waterfall. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AdMob waterfall handles most impressions&lt;/li&gt;
&lt;li&gt;PubMatic bids in real-time, winning when its CPM beats the waterfall floor&lt;/li&gt;
&lt;li&gt;Result: higher effective eCPM than either method alone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're only running AdMob, you're leaving 30-50% of ad revenue on the table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hidden DEX Loading for Facebook Ads
&lt;/h3&gt;

&lt;p&gt;This one surprised me. Facebook Audience Network isn't bundled in the main APK. Instead, there's a file called &lt;code&gt;audience_network.dex&lt;/code&gt; (5 MB) sitting in the &lt;code&gt;assets/&lt;/code&gt; folder, loaded at runtime via DexClassLoader.&lt;/p&gt;

&lt;p&gt;Why? Cold start optimization. CamScanner avoids loading 5 MB of Facebook ad code on every app launch — it only loads when a Facebook ad placement is triggered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server-Controlled Ad Config
&lt;/h3&gt;

&lt;p&gt;Two remote config sources control ad behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cs8.intsig.net/ad&lt;/code&gt; — likely controls placement logic and frequency&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ScannerRewardRatio.xml&lt;/code&gt; hosted remotely — controls rewarded ad payout ratios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means they can A/B test ad strategies, change placements, and adjust frequency caps &lt;strong&gt;without shipping an app update&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's CamScanner Built With?
&lt;/h2&gt;

&lt;p&gt;The tech stack is a hybrid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core app&lt;/strong&gt;: Native Android (Java/Kotlin) — scanning, document management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New features&lt;/strong&gt;: Flutter via Alibaba's FlutterBoost — AI chat, document processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCR&lt;/strong&gt;: Google ML Kit (on-device)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash monitoring&lt;/strong&gt;: Sentry + ByteDance APMPlus (dual monitoring for global + China)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribution&lt;/strong&gt;: AppsFlyer (they're running paid user acquisition)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt;: Firebase Analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Flutter + Native hybrid with FlutterBoost is worth noting — it's Alibaba's framework that lets you mix Flutter screens with native Activities seamlessly. If you're considering adding Flutter to an existing native app, this is a proven pattern at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Security Mistake: Staging Servers in Production
&lt;/h2&gt;

&lt;p&gt;I found &lt;strong&gt;6 staging/sandbox API endpoints hardcoded in the release build&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api-cs-sandbox.intsig.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api-center-sandbox.intsig.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api-algo-sandbox.camscanner.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ai-cn-sandbox.camscanner.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cs1-sandbox.intsig.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;b103-sandbox.camscanner.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are internal test servers that should have been stripped from the production build. They could potentially expose debug interfaces or less-secured services. Don't make this mistake in your own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total size&lt;/td&gt;
&lt;td&gt;306 MB (27 split APKs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEX files&lt;/td&gt;
&lt;td&gt;12 (85.5 MB bytecode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activities&lt;/td&gt;
&lt;td&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party SDKs&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad networks&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth providers&lt;/td&gt;
&lt;td&gt;7+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported languages&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I Didn't Include Here
&lt;/h2&gt;

&lt;p&gt;The full report goes deeper: complete API endpoint list (18 first-party + 14 third-party), full SDK breakdown by category, permission-by-permission analysis with risk levels, build configuration details, and technical implementation specifics like the dynamic DEX loading mechanism.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;I do this as a service.&lt;/strong&gt; Send me any Google Play link and I'll send you a full reverse-engineering report (PDF + Markdown) within 2 hours. $29 for one app, $19/each for 3-10 apps.&lt;/p&gt;

&lt;p&gt;Free sample report (CamScanner full version): &lt;a href="https://appxray.blackorange.org" rel="noopener noreferrer"&gt;appxray.blackorange.org&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about what I found? Drop a comment — happy to discuss.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More teardowns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/how-to-find-out-what-sdks-ad-networks-and-apis-a-competitors-android-app-uses-4obk"&gt;How to find out what SDKs, ad networks, and APIs a competitor's Android app uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/orange_black_1c98182920bb/how-does-duolingo-monetize-i-decompiled-the-android-app-v6795-5bmn"&gt;How Does Duolingo Monetize? I Decompiled the Android App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>security</category>
      <category>adtech</category>
    </item>
  </channel>
</rss>
