EMULE reacted to
Staff in Eddie Android edition 4.0.0 preview available
...
Hello!
We're very glad to announce that Eddie Android edition 4.0.0 preview is available
2026-11-28: Eddie Android edition 4.0.0 Beta 1 is available
2026-01-14: Eddie Android edition 4.0.0 Beta 2 is available
2026-03-04: Eddie Android edition 4.0.0 Beta 3 is available
This is a major update: for the first time Eddie Android edition features AmneziaWG complete support.
Eddie Android edition is a fully integrated with AirVPN, free and open source client allowing comfortable connections to AirVPN servers and generic VPN servers offering compatible protocols. Eddie 4.0.0 aims primarily at adding, besides the already available OpenVPN and WireGuard, a thorough and comfortable AmneziaWG support.
AmneziaWG is a free and open source fork of WireGuard by Amnezia inheriting the architectural simplicity and high performance of the original implementation, but eliminating the identifiable network signatures that make WireGuard easily detectable by Deep Packet Inspection (DPI) systems. It can operate in several different ways, including a fallback, "compatibility mode" with WireGuard featuring anyway various obfuscation techniques.
What's new in Eddie 4.0.0
AmneziaWG support
Amnezia WireGuard API
stronger anti-blocking logic:
ability to log in to the service and download AirVPN infrastructure and user data while connected through a profile with a specific option on the left pane
ability to read and use local user data when bootstrap servers are unreachable
new "Open with..." option on top of the usual "Share" option to manage and export comfortably generated profiles on any Android version with any suitable application
updated AmneziaWG parameters allowed ranges
support of latest AmneziaWG padding features
vastly improved NetworkMonitor and Tile Service
updated OpenSSL, OpenVPN3-AirVPN and WireGuard libraries
full compatibility from Android 5.1 to Android 16, including Android TV
bug fixes
see the complete changelog below
AmneziaWG overview
From the official documentation: https://docs.amnezia.org/documentation/amnezia-wg AmneziaWG offers:
Dynamic Headers for All Packet Types (compatibility with WireGuard: YES)
During tunnel initialization, the library generates a set of random constants applied to each of the four WireGuard packet formats: Init, Response, Data, Under‑Load. These constants:
As a result, no two clients have identical headers, making it impossible to write a universal DPI rule.
Replace predictable WireGuard packet identifiers;
Shift offsets of Version/Type fields;
Modify reserved bits.
Handshake Length Randomization and message padding (compatibility with WireGuard: NO)
In WireGuard, the Init packet is exactly 148 bytes, and the Response packet is exactly 92 bytes. AmneziaWG adds message paddings:
S1: int - padding of handshake initial message
S2: int - padding of handshake response message
S3: int - padding of handshake cookie message
S4: int - padding of transport messages
Offsets of the remaining fields are automatically adjusted, and MAC tags are recalculated accordingly. In order to keep backward compatibility with WireGuard, S1, S2, S3 and S4 must be set to 0.
Obfuscation Packets I1-I5 (Signature Chain) & CPS (Custom Protocol Signature) (compatibility with WireGuard: partial, with fallback)
Before initiating a "special" handshake (every 120 seconds), the client may send up to five different UDP packets fully described by the user in the CPS format. In this way AmneziaWG can mimic perfectly QUIC, DNS and other protocols adding powerful methods to circumvent blocks. QUIC is particularly interesting as HTTP/3 is built on it and currently, from Chrome and other compatible browsers, 50% of traffic to/from Google is QUIC traffic. Therefore, blocking QUIC may have major disruptions for any ISP.
Junk‑train (Jc) (compatibility with WireGuard: YES)
Immediately following the sequence of I-packets, a series Jc of pseudorandom packets with lengths varying between Jmin and Jmax is sent. These packets blur the timing and size profile of the session start, significantly complicating handshake detection.
Under‑Load Packet (compatibility with WireGuard: YES)
In WireGuard, a special keep-alive packet (“Under-Load”) is used to bypass NAT timeouts. AmneziaWG replaces its fixed header with a randomized one, the value of which can be set manually. This prevents DPI from filtering short ping packets, ensuring stable tunnel connections, especially on mobile networks.
How to use Eddie with AmneziaWG
To enable AmneziaWG mode, just tap the connection mode available in the main and other views. It will rotate between WireGuard, AmneziaWG and OpenVPN. Set it to AmneziaWG. In its default AmneziaWG mode, Eddie will use all the possible obfuscation, except protocol mimicking, that keeps WireGuard compatibility, thus allowing connections to AirVPN servers. The default settings choice was possible thanks to the invaluable support of persons living in countries where VPN blocks are widespread. Such settings have been tested as working and capable to bypass the current blocking methods in various countries. You may consider to modify them if they are ineffective to bypass "your" specific blocks.
In Settings > Advanced, you will find, at the bottom of the page, a new "Custom Amnezia WG directives" item. By tapping it you will summon a dialog that will let you customize any possible AmneziaWG parameter.
You can maintain backward compatibility with WireGuard in the dialog WireGuard section, or enable the full AmneziaWG support in the Amnezia section, which is not compatible (at the moment) with AirVPN WireGuard servers. This mode will be mostly valuable in a not distant future, when AirVPN servers will start to support AmneziaWG natively. You may also enable QUIC or DNS mimicking for additional obfuscation efficacy.
In order to maintain WireGuard backward compatibility, with or without QUIC or DNS mimicking, you must set:
S1 = S2 = S3 = S4 = 0
Hn ∈ {1, 2, 3, 4}
H1 ≠ H2 ≠ H3 ≠ H4
Furthermore, do not exceed the valid limit of the J parameters (anyway Eddie will not let you do it). In this preview version, Eddie's formal control of the input data is based on the following document. We strongly recommend you read it if you need to modify manually parameters:
https://github.com/amnezia-vpn/amneziawg-linux-kernel-module?tab=readme-ov-file#configuration
Please do not modify In parameters if you don't know exactly what you're doing.
Eddie implements QUIC and DNS mimicking and obfuscation packets for each specific "I" parameter (by using the corresponding "Generate" button). You can enable them with a tap on the proper buttons. You may mimic QUIC and DNS even to connect to WireGuard based servers.
When you enable QUIC mimicking and you maintain WireGuard backward compatibility, you add a powerful tool against blocks, because the first packets will be actual QUIC packets. AmneziaWG will fall back to WireGuard compatibility very soon. However, when DPI and SPI tools, and demultiplexers in general, identify the initial QUIC flow, most of them will be unable to detect a WireGuard flow for several minutes. This has been tested thoroughly with deep packet inspection on Linux and FreeBSD based machines by AirVPN staff.
Therefore, in different blocking scenarios the QUIC mimicking increases likelihood of successful block bypass. NOTE: the same does not happen with DNS mimicking. In this case DPI / SPI tools identify the stream initially as DNS, but are much quicker (just in a few dozens of packets) to identify the stream as WireGuard's, after the initial DNS identification.
How to use Eddie in network where the "bootstrap" servers can not be reached
Eddie downloads user and infrastructure data, essential to use the service, from special "bootstrap servers" through an encrypted flow inside HTTP. If the bootstrap servers are blocked or the underlying protocol to port 80 is filtered out, Eddie is unable to proceed. Starting from this Eddie 4 version, the ability to retrieve such data locally has been added. Whenever bootstrap servers are unreachable, Eddie can read the latest available local data to connect to a VPN server. Once connected the bootstrap servers are again reachable and the local data are immediately updated for future usage. The local data remain valid as long as you don't need to change user.
On top of all of the above, Eddie can now retrieve such data through the login procedure that now can be started even when a connection to a VPN server was previously established via a profile. Therefore, when you are in a restrictive network that blocks access to bootstrap servers, you can connect through a profile generated by AirVPN web site Configuration Generator. After this first connection, log your account in to the service by selecting the specific option on the left pane, enter your AirVPN account credentials as usual and make sure that Remember me checkbox is ticked: Eddie will download all the necessary files and store them locally.
This procedure is "once and for all", at least as long as you don't need to change account. After this initial connection, Eddie will be able to log your account in to the infrastructure, retrieve servers data and establish connections without profiles and without bootstrap servers, offering again full AirVPN integration even when bootstrap servers are unreachable. Only If you change account you must repeat the procedure.
Download link, checksum and changelog
https://eddie.website/repository/Android/4.0.0-Beta3/EddieAndroid-4.0.0-Beta-3.apk
This is a build debug package and side load is mandatory.
If you decide to test, please report at your convenience any bug and problem in this thread. If possible generate a report from the app in a matter of seconds: by tapping the paper plane icon on the Log view bar rightmost side you will generate a full system report which will include both log and logcat and have it sent to our servers. Then you just need to send us the link the app shows you (open a ticket if you prefer to do it in private).
$ sha256sum EddieAndroid-4.0.0-Beta-3.apk
3bec464d23c7e4f208d7428066037a4f360b3e99aa94682cf629300d13e8a223 EddieAndroid-4.0.0-Beta-3.apk
Changelog 4.0.0 (VC 37)
Beta 3 (2026-03-04)
Changelog 4.0.0 beta 3 (VC 37) Release date: 4 March 2026 by ProMIND
Native Library
[ProMIND] removed obsoleted Google's breakpad dependency
[ProMIND] removed files breakpad.cpp and breakpad.h (bye bye mister!)
[ProMIND] api.h: removed LR_BREAKPAD_INITIALIZATION_ERROR from LibResult enum (bye bye mister!)
[ProMIND] api.cpp init(): removed calls to breakpad code (bye bye mister!)
[ProMIND] api.cpp cleanup(): removed calls to breakpad code (bye bye mister!)
[ProMIND] updated to OpenVPN-AirVPN 3.12 (20260206)
[ProMIND] updated to OpenSSL version 3.6.1
amnezia_custom_settings_dialog.xml
[ProMIND] removed random amnezia values button
[ProMIND] added S3 and S4 input fields
AirVPNManifest.java
[ProMIND] added method loadStoredManifest()
AirVPNServerProvider.java
[ProMIND] added members useServerWhitelists, useCountryWhitelists, useServerBlacklists and useCountryBlacklists
[ProMIND] added methods isUsingServerWhitelists(), setUseServerWhitelists(), isUsingServerBlacklists(), setUseServerBlacklists(), isUsingCountryWhitelists(), setUseCountryWhitelists(), isUsingCountryBlacklists() and setUseCountryBlacklists()
AirVPNTileService.java
[ProMIND] implemented NetworkMonitorListener
[ProMIND] added boolean isBusy member
[ProMIND] onClick(): prevent multiple execution in case the service is busy
[ProMIND] setTileStatus(): removed network connection case
[ProMIND] setTileStatus() renamed to setTileVpnStatus()
[ProMIND] added method setTileNetworkStatus()
ConnectAirVPNServerFragment.java
[ProMIND] createVpnProfile(): in case of country connection, properly set AirVPNServerProvider's white and black list usage
[ProMIND] exportVPNProfile(): protocol and port number is now correctly added to the profile name
ConnectVpnProfileFragment.java
[ProMIND] added enum AddVPNProfileResult
[ProMIND] addVPNProfile(): now returns AddVPNProfileResult
[ProMIND] addVPNProfile(): check profile validity before importing by calling VPNProfileDatabase's checkOpenVPN3Profile() and checkWireGuardProfile()
[ProMIND] addVPNProfile(): profile import result is now sent to the logger
[ProMIND] selectVPNProfile(): in case of errors or warnings during import, shows a dialog to the user
BootVPNConnector.java
[ProMIND] startConnection(): "remember me" is set, do local login and load locally stored manifest
EddieLibraryResult.java
[ProMIND] removed BREAKPAD_INITIALIZATION_ERROR
LogActivity.java
[ProMIND] added method redactProfile()
[ProMIND] createExportLog(): in case the app is using a custom profile, call redactProfile()
MainActivity.java
[ProMIND] onNetwork* events are now sent to the log
NetworkMonitor.java
[ProMIND] added member registeredNetworks
[ProMIND] notifyStatusToListener(): updated to the new NetworkMonitorListener.onNetworkNotConnected() interface
[ProMIND] getNetworkDescription(): it now takes Network object as argument
[ProMIND] added method getActiveNetworkDescription()
[ProMIND] subscribeListener(): it now sends a network staus event to the listener upon registration
NetworkMonitorListener.java
[ProMIND] Added networkDescription argument to method onNetworkNotConnected()
QuickConnectFragment.java
[ProMIND] onCreate(): in case "remember me" is set, after loading the locally stored user instance, call AirVPNManifest.loadStoredManifest()
SettingsActivity.java
[ProMIND] selectAirVPNDefaultVPNType(): Added AmneziaWG label to WireGuard VPN type
[ProMIND] ameziaSettingsDialog(): added S3 and S4 support and management
[ProMIND] ameziaSettingsDialog(): removed member btnGenerateRandomAmneziaWG
SettingsManager.java
[ProMIND] added Amnezia S3 and S4 settings and methods
VPN.java
[ProMIND] enum Status: added FATAL_ERROR
VPNManager.java
[ProMIND] added method isVpnFatalError()
VPNProfileDatabase.java
[ProMIND] added methods checkOpenVPN3Profile() and checkWireGuardProfile()
VPNService.java
[ProMIND] onNetwork* events are not sent to the log anymore
[ProMIND] startForegroundVPNService() is now called in onCreate()
WireGuardClient.java
[ProMIND] generateRamdonAmneziaSettings renamed to generateRamdonAmneziaSettingsForWireguard()
Beta 2 (2026-01-14)
LogActivity.java
[ProMIND] added View log button (open with...)
MainActivity.java
[ProMIND] method startAirVPNManifestRefresh() renamed to startAirVPNDocumentRefresh()
[ProMIND] method stopAirVPNManifestRefresh() renamed to stopAirVPNDocumentRefresh()
[ProMIND] member timerAirVPNManifestRefresh renamed to timerAirVPNDocumentRefresh
[ProMIND] onCreate(): do exported files cleanup
[ProMIND] onDestroy(): do exported files cleanup
[ProMIND] drawer: added login item
[ProMIND] drawer: changed login and logout icons
[ProMIND] navigationViewItemSelected(): added code for AirVPN login
[ProMIND] onResume(): show proper drawer's login/logout item
QuickConnectFragment.java
[ProMIND] onCreate(): removed AirVPN autologin (superseeded by extended "remember me" local login)
[ProMIND] onCreate(): in case "remember me" is set, do local login by using locally stored user instance
SettingsActivity.java
[ProMIND] ameziaSettingsDialog(): fixed formal check for jc
[ProMIND] removed AirVPN Autologin option (superseeded by extended "remember me" local login)
SettingsManager.java
[ProMIND] removed added SYSTEM_AIRVPN_AUTOLOGIN and SYSTEM_AIRVPN_AUTOLOGIN_DEFAULT (superseeded by extended "remember me" local login)
[ProMIND] removed methods isAirVPNAutologinEnabled() and setAirVPNAutologin()
SupportTools.java
[ProMIND] added enum ShareMode
[ProMIND] sharePlainText(): added argument share mode
[ProMIND] sharePlainText(): the code is now compliant to all supported Android versions
[ProMIND] sharePlainText(): exclude "myself" from helper apps
[ProMIND] removeShareFile() renamed to removeShareFiles()
[ProMIND] sharePlainText(): share/view files are now removed on app exit
Beta 1 (2026-11-25)
Native Library
[ProMIND] updated to version 4.0.0, API 10
[ProMIND] added Amnezia WireGuard API
[ProMIND] updated to OpenVPN-AirVPN 3.12 (20251126)
AirVPNUser.java
[ProMIND] getWireGuardProfile(): added Amnezia support
ConnectAirVPNServerFragment.java
[ProMIND] showConnectionInfo(): added AmneziaWG logo display
[ProMIND] onCreateContextMenu(): added AmneziaWG items
[ProMIND] onContextItemSelected(): added AmneziaWG items
[ProMIND] added method loadVPNProfile()
ConnectVpnProfileFragment.java
[ProMIND] added Amnezia support
EddieLibraryResult.java
[ProMIND] added Amnezia WireGuard API
QuickConnectFragment.java
[ProMIND] onCreateView(): added AmneziaWG logo display
[ProMIND] updateStatusBox(): added AmneziaWG logo display
SettingsActivity.java
[ProMIND] added "Custom AmneziaWG directives" setting
SettingsManager.java
[ProMIND] added Amnezia specific settings and methods
SupportTools.java
[ProMIND] removed method getVPNProfile()
VPN.java
[ProMIND] added methods enableAmneziaWireGuard() and isWireGuardAmneziaEnabled()
VPNManager.java
[ProMIND] added method isWireGuardAmneziaEnabled()
VPNProfileDatabase.java
[ProMIND] added AMNEZIA type
WebViewerActivity.java
[ProMIND] EddieWebViewClient.shouldOverrideUrlLoading(): it now properly opens android asset files
WireGuardClient.java
[ProMIND] added WireGuard tunnel node to constructor
[ProMIND] added methods for generating Amnezia's junk settings
WireGuardTunnel.java
[ProMIND] added support for Amnezia WireGuard
[ProMIND] added Mode enum
[ProMIND] added tunnel node to constructor
EddieLibrary.java
[ProMIND] added Amnezia WireGuard API
Kind regards & datalove
AirVPN Staff