Skip to content

Doppel 2.3

Latest

Choose a tag to compare

@akano12 akano12 released this 06 Nov 17:07
· 83 commits to master since this release

Doppel 2.3: support for Android 17, a new Read languages group, far fewer details that fingerprint a device, ids of device makers, commands refused instead of rewritten, and search on the screen of an app.

Read this first if you used 2.2:

  • The fake boot time of 2.2 is removed. Hooks on SystemClock.elapsedRealtime do not reach compiled app code on Android 12 and later, so apps got a mix of fake and real times, like WhatsApp voice notes 35 minutes long, and could still work out the real boot time.
  • Commands of restricted apps are refused, no longer rewritten. A restricted app runs no program, like one which may not run (Cannot run program: error=13, Permission denied), so no shell trick reaches the data the other hooks fake. Programs in the app's own native library folder still run. This applies to Run commands and to the groups whose values commands could read. Allowed commands and Allowed command lines in Fake values are gone.
  • Custom scripts: scripts now only get the base, bit32, math, string, table, os (time, date, clock, difftime) and luajava libraries. io, coroutine, package, dofile, loadfile, string.dump and luajava.loadLib are gone, so a definition of your own using them stops working.
  • The fake id of SD cards is removed: it hid nothing, since paths keep the real one, and it broke apps using it.

Android 17

  • Apps targeting Android 17 get the fake Build fields too.
  • Definitions for Android 17 hook the advertising id and identifier services again, after ServiceDispatcher.doConnected changed.
  • Files.exists sees hidden files as gone again, also for VPN interfaces.

Privacy

  • Read languages, a new group: fakes the device languages from one setting (Languages in Fake values, default en-US) through the default locale, locale list, ICU and properties, and keeps the language chosen for the app. New groups are off, so turn it on where you want it.
  • Device fingerprints: codec names without the chip vendor, OpenGL ES and EGL extensions without those of vendors, GPU renderer and vendor unknown, 8 processors, /proc/cpuinfo and /proc/meminfo reduced to what kernels print, fonts of device makers left out, memory limits rounded, plain thermal, audio output and vibrator details, and display density which agrees with the screen.
  • Device makers: identifier services of Xiaomi, OPPO (HeyTap), Samsung, Huawei, Honor, Nubia and MSA are denied, also when they reuse a known Binder interface, with their id providers and ids in settings.
  • Fake DRM id: comes from the fake Android ID, so it is per app and new each boot. It was zeros, one id which never changed, which libraries use as a device id. The Widevine system id stays real, since DRM apps like Netflix verify the device with it.
  • Photos and videos: no location in EXIF, original media and video metadata. Do not restrict Get location for camera, gallery and photo editing apps.
  • Network: the local IP of sockets, /proc/net and network commands are hidden, and a request for VPN networks finds none.
  • Hidden apps: left out of many more lookups, like install sessions, network and storage statistics, device admins, account types, sync adapters, sticky broadcasts, intent selectors, AppOps checks and the live wallpaper.
  • Files: hidden files stay hidden by File.getCanonicalPath, through paths like /./, //, .., /proc/self/root and /proc/self/cwd, and in their sizes, times and folder listings. More hardware, root and Magisk files are hidden.
  • Tracking: the User-Agent of OkHttp and HttpURLConnection is reduced like WebView, Amazon APS, Google Analytics and Firebase consent are off through their own opt-outs, and hooks install in apps shrunk by R8, like OkHttp in LinkedIn. More SDKs are covered, like Umeng and Unity Ads.
  • Security: the Doppel app of another user or a work profile no longer reads the data of the owner, only the owner changes definitions, the framework service is accepted only from root or system, and release builds no longer log setting values.

Interface

  • Search on the screen of an app, in groups and hooks.
  • Open the app with a button in the toolbar of its screen. View log is now View activity, like the tab.
  • Screens offer Retry when loading fails and show an error when the service did not answer, instead of a false Saved or an empty list. Backups no longer come out empty.
  • A notification tells when the service cannot load its data, since restricted apps start without hooks then.
  • The editor asks before replacing a definition, and imports and restores ask before replacing built-in definitions. A restore names the definitions of a backup, whose scripts run inside the apps they restrict.
  • Better screen reader support, colors, spacing, RTL and shorter labels.

Speed

  • Scripts of definitions go only to the screens which need them, instead of 4.8 MB of shared scripts.
  • Usage reports are sent and written in batches, and each boot resets only what needs it.

Fixes

  • Apps with Read VPN restricted no longer crash when a VPN connects, or when they copy or parcel its network info.
  • unbindService no longer crashes an app after a refused bind to a hidden app.
  • Links open in a visible app when a hidden app is the default browser.
  • Media rows of Android 8.1 and 9 keep exact dates.
  • An app reinstalled with its data keeps its restrictions, and an archived app added again keeps them too.
  • A restore leaves out what it cannot read instead of stopping halfway, and checks that scripts compile.
  • A corrupt database opens again without a reboot.

Downloads

  • FCM lookups are per thread and only of Play services, with no real values in the log.
  • New: WallpaperManager.getDrawable/which hides the wallpaper from getDrawable(int) of Android 14 and later.
  • All definitions now start at Android 8.1, with their versions raised, so Downloads shows them as updates.

Installing

  • Requires Android 8.1 or later, and LSPosed (or a compatible fork) or Xposed. See Installation.
  • Updating from 2.2: install over it, then reboot (not just a soft restart), so LSPosed loads the new version.
  • In LSPosed, enable Doppel with System Framework and the apps to restrict in its scope, or use the In LSPosed scope toggle.
  • Coming from XPrivacyLua: uninstall XPrivacyLua first. Doppel is a separate app (sk.akano12.doppel) that uses the same service, so the two cannot be active side by side.

Verifying the download

Signing certificate SHA-256:

A0:F2:1E:B3:95:12:FA:90:4F:04:6C:F1:66:E7:86:07:F5:95:4F:00:F1:43:00:2D:35:89:EA:71:FD:EA:71:F4

APK SHA-256:

ae85d99b99dd306e66c85e73c6bb4e2dcc65f19a95e800d483864fd54d9162aa

Check the certificate with apksigner verify --print-certs Doppel-v2.3-203-release.apk.