Application security feature

Mobile code obfuscation

Otukan obfuscates code, strings, control flow, resources and native libraries in mobile apps, keeps runtime lookups working and your crash reports readable.

  • Android
  • iOS
  • Flutter
  • React Native
Decompiled business logic is met at the build-time transforms boundary before it reaches the appDecompiled business logicBuild-time transformsYour app
  • More than renaming

    Otukan protects identifiers, strings, control flow, resources and native code, each with a technique built for it. Your logic stops explaining itself.

  • Your app keeps working

    Names that reflection, serialisation and SDKs look up at run time are kept on purpose, and every protected build is regression-tested.

  • Crashes stay readable

    Each protected release comes with a private mapping, so your team still reads stack traces from users' devices.

What obfuscation takes away from attackers

Pick a threat to see how Otukan counters it, what changes for the attacker and what your team keeps.

Decompiled logic

  1. Detect

    Decompilation happens offline, so Otukan acts first: meaningful class, method and field names become short meaningless ones.

  2. Respond

    Decompiled output no longer explains what the code does, and each function has to be worked out by hand.

  3. Report

    Your team keeps the mapping, so its own debugging is unaffected.

String and endpoint extraction

  1. Detect

    Otukan stores endpoints, messages and lookup keys in protected form, decoded only when the code needs them.

  2. Respond

    A text search of the package no longer maps your backend, feature flags or error paths.

  3. Report

    Protected strings are listed per release, so you know what is covered.

Following sensitive logic

  1. Detect

    Control-flow obfuscation reshapes the order and branching of the code you choose, such as scoring or anti-fraud checks.

  2. Respond

    The sequence of checks and decisions becomes slow and costly to trace.

  3. Report

    You decide where heavier transforms apply and see the effect measured on your devices.

Native library analysis

  1. Detect

    Otukan strips symbols from and transforms compiled C and C++ code that bytecode tools leave untouched.

  2. Respond

    Algorithms in native libraries lose the names and structure that guide an analyst.

  3. Report

    Native symbols stay available privately to your team for crash analysis.

Removing protection checks

  1. Detect

    Obfuscation hides integrity and runtime checks, and anti-tampering notices when protected code is altered.

  2. Respond

    A modified copy triggers the response you set, from recording the event to ending the session.

  3. Report

    A tamper signal reaches your backend with the request it concerns.

What Otukan obfuscates

Each kind of material gets its own technique, applied where it protects most.

  • Identifier renaming

    Replaces meaningful class, method and field names with meaningless ones, so decompiled code no longer explains itself.

  • String protection

    Keeps endpoints, lookup keys and messages in protected form, decoded only at the moment the code needs them.

  • Control-flow obfuscation

    Restructures the order and branching of your most sensitive code so its logic is hard to follow.

  • Resource and asset protection

    Protects configuration files, bundled scripts and assets that would otherwise be readable straight from the package.

  • Native library hardening

    Strips symbols from and transforms compiled C and C++ code, which bytecode tools do not reach.

  • Framework code protection

    Protects Dart code in Flutter apps and JavaScript or Hermes bytecode bundles in React Native apps.

How it works

  1. Map what matters

    We identify the logic, strings and assets an attacker would most want to read.

  2. Set the keep list

    Names used by reflection, serialisation and SDKs are kept, so behaviour stays intact.

  3. Protect each release

    Obfuscation runs inside your existing build and release pipeline; your signing keys stay with you.

  4. Verify and ship

    Compare decompiled output, run your regression suite and confirm crash traces map back correctly.

Free for app publishers

Check your app's exposure

A passive review of your published app by an Otukan engineer. No files, no access to your systems. Findings go by email to the verified publisher.

You finish the request on the next page.

Almost all of your app can be obfuscated, and Otukan does it while keeping your app’s behaviour intact. It renames your own classes and methods, protects the strings your app carries, reshapes the order of your most sensitive logic, and hardens bundled resources, native libraries and Flutter or React Native framework code. Names stay unchanged only where the app or its libraries look them up while running, such as classes used through reflection, fields read by serialisation and entry points that SDKs call. Those go on a keep list. The result is code that takes much more time and skill to understand, with crash reports your team can still read.

For combined static and runtime protection, see mobile app shielding.

Protected material

An app holds several kinds of material, and each needs its own technique. Otukan treats them separately and applies the heaviest protection where an attacker gains the most.

MaterialWhat an analyst reads without protectionAndroid notesiOS notesWhat Otukan applies
Code identifiersClass, method and field names that explain the codeDEX bytecode decompiles to near-source Java or Kotlin; R8 renames identifiers when minification is enabledObjective-C class and method names stay in the binary for the runtime; Swift keeps type metadataIdentifier renaming beyond the platform baseline
StringsEndpoints, error messages, feature flags, lookup keysVisible in the DEX string pool and resourcesVisible in the Mach-O string sectionsString protection, decoded only when needed
Control flowThe sequence of checks and decisions in sensitive logicReadable in decompiled bytecodeReadable in disassembly and decompiler outputControl-flow obfuscation on the code you choose
Resources and assetsConfiguration files, bundled scripts, certificates, modelsStored in the package’s resources and assetsStored in the app bundle alongside the executableResource and asset protection
Native librariesAlgorithms written in C or C++Shared libraries per ABI; not touched by R8Compiled into the executable or embedded frameworksSymbol stripping and native transforms

Proprietary scoring logic and anti-fraud checks justify heavier protection than screens and layouts, and Otukan lets you set that balance. Private keys and other secrets belong on your server rather than in the app; obfuscation protects the code and data that have to ship.

For iOS detail, see iOS code obfuscation.

Compatibility

Obfuscation breaks apps in predictable places, and Otukan handles each one by design.

Reflection and dynamic lookup

Code that finds a class or method by name at run time fails if that name changes. On Android this includes reflection, dependency injection frameworks and classes named in the manifest. On iOS it includes selectors, key-value coding and classes named in storyboards. Otukan keeps those names and protects the code around them.

Serialisation

Libraries that map JSON or stored data to fields by name read the wrong keys if field names change. Otukan keeps the names of those model classes, or works with the explicit key annotations your code already uses.

Third-party SDKs

SDKs arrive already built, and many publish their own keep rules. Otukan leaves vendor code as shipped, respecting the vendor’s terms, and protects your own code that calls it. If you ship an SDK of your own, mobile SDK protection covers protecting it inside other companies’ apps.

Cross-platform code

Flutter compiles Dart ahead of time into a native library and offers its own symbol obfuscation option. React Native ships a JavaScript or Hermes bytecode bundle that platform tools do not transform. In both cases most of your logic lives in framework code, so Otukan protects that code directly rather than only the native shell. Framework notes are on Flutter app security and React Native app security.

Release support

An obfuscated app still has to be supported in production. Stack traces from users’ devices show the new names, so Otukan pairs each protected build with its mapping.

  1. Each release build produces a private mapping alongside the platform’s own files (R8 mapping files on Android, dSYM files on iOS).
  2. Your team stores it with the build, under the same access control as your release artefacts.
  3. Your crash reporting service receives it, so stack traces are translated automatically.
  4. A test crash confirms the translated trace points to the right line before the build ships.

Build the protected release the same way every time: a mapping belongs to one build, and reproducible builds keep crash analysis reliable across releases.

Proving it on your app

Otukan verifies obfuscation with your team on your own build. Together we decompile the protected build with common public tools and compare it with the unprotected one, then run install, update, sign-in and your sensitive flows on real devices, recording size and launch time for both. For performance testing, see mobile app protection performance. A longer method is in the mobile code obfuscation guide.

For the wider protection model, return to mobile app security. If your app is already published, start with a free App Exposure Check of the public store release.

Common questions

  • Is R8 enough for an Android app?

    With minification enabled, R8 shrinks the app and renames identifiers, a useful baseline at low cost. It does not protect strings, restructure control flow, transform native libraries or cover framework bundles. Otukan adds those layers on top, so the parts of your app an attacker most wants to read are protected, not only its names.

  • Can obfuscation break our app?

    The usual cause is renaming a name the app looks up at run time, and Otukan's keep list is built to prevent exactly that. Reflection, serialisation libraries, dependency injection and some third-party SDKs are the usual cases. We set the keep list with your team and run a full regression on the protected build, so success means working behaviour, not just a successful compile.

  • How do we read crash reports from an obfuscated app?

    Each protected build comes with a private mapping that links the new names back to the original ones. Your team stores it with the release and gives it to your crash reporting service, so stack traces are translated automatically. Because each mapping belongs to one build, reproducible builds keep crash analysis reliable across releases.

  • Does obfuscation affect performance?

    Renaming has little effect and can reduce size. String protection and control-flow obfuscation add work at run time, so Otukan lets you apply them to the code that matters most and keep the rest light. We measure launch time and key journeys against the unprotected build on your devices before release.

On the mobile engineering team?

How protection fits your build, signing and release, platform by platform.

Keep your code yours

Tell us the platform, the framework, the third-party SDKs you ship and which logic or data you most want to keep from being read. We do not ask for source code, binaries, signing keys or production credentials.

Or request a technical demo