README.md
Connecting things to your VPN made simple. Share your VPN connection over hotspot or repeater. (root required)
This app is useful for:
P.S. You can also do the similar on Windows, Mac, and iOS. I don't know about you but I can't get my stupid Windows 10 to work with hosted network now that they introduced this Mobile hotspot.
The following features in the app requires it to be installed under /system/priv-app since some restricted permissions are required.
One way to do this is to use App systemizer for Magisk.
android.permission.OVERRIDE_WIFI_CONFIG: Read/write system Wi-Fi hotspot configuration. (#117)Installing as system app also has the side benefit of launching root daemon less frequently due to having privileged permissions listed below.
android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKSandroid.permission.LOCAL_MAC_ADDRESSandroid.permission.MANAGE_USBandroid.permission.OVERRIDE_WIFI_CONFIGandroid.permission.READ_WIFI_CREDENTIALandroid.permission.TETHER_PRIVILEGEDandroid.permission.WRITE_SECURE_SETTINGSWhenever you install an app update, if there was a new protected permission addition (last updated in v2.17.1), you should update the app installed in system as well to make the system grant the privileged permission.
Default settings are picked to suit general use cases and maximize compatibility but it might not be optimal for battery life.
none (or a^ or other similarly invalid entries) to suppress tethering VPN.none (or a^ or other similarly invalid entries) to forbid falling back.
Put other interface name if you feel like it.VpnManager/Ikev2VpnProfile
profiles may need a compatibility workaround. VPN Hotspot updates the live IPv4 tunnel forwarding policy in
place while sharing and relies on Android to recreate the stock policy when that tunnel is rebuilt.Search the issue tracker for more.
This could caused by the Wi-Fi channel you selected is no longer available, due to:
For maximum stability, you need to set channel = 0 so that your device will pick a channel automatically. You can also use WPS to connect your 2.4GHz-only device to force the repeater to switch from 5GHz to 2.4GHz for this time.
a.k.a. things that can go wrong if this app doesn't work.
This is a list of stuff that might impact this app's functionality if unavailable.
This is only meant to be an index.
You can read more in the source code.
API restrictions are updated up to SHA-256 checksum 9102af02fe6ab68b92464bdff5e5b09f3bd62c65d1130aaf85d3296f17d38074.
Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded or implicitly used)
Landroid/net/ConnectivityManager;->getLastTetherError(Ljava/lang/String;)I,max-target-rLandroid/net/ConnectivityManager;->EXTRA_ACTIVE_LOCAL_ONLY:Ljava/lang/String;,lo-prio,max-target-oLandroid/net/ConnectivityManager;->EXTRA_ACTIVE_TETHER:Ljava/lang/String;,max-target-rLandroid/net/ConnectivityManager;->EXTRA_AVAILABLE_TETHER:Ljava/lang/String;,max-target-rLandroid/net/ConnectivityManager;->ACTION_TETHER_STATE_CHANGED:Ljava/lang/String;,max-target-rLandroid/net/ConnectivityManager;->EXTRA_ERRORED_TETHER:Ljava/lang/String;,max-target-rLandroid/net/ConnectivityModuleConnector;->IN_PROCESS_SUFFIX:Ljava/lang/String;Landroid/net/INetd$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetd;Landroid/net/INetd;->firewallRemoveUidInterfaceRules([I)VLandroid/net/INetd;->ipSecUpdateSecurityPolicy(IIILjava/lang/String;Ljava/lang/String;IIII)VLandroid/net/IIntResultListener$Stub;-><init>()V,blockedLandroid/net/IIntResultListener;->onResult(I)V,blockedLandroid/net/ITetheringConnector;->stopTethering(ILjava/lang/String;Landroid/net/IIntResultListener;)V,blockedLandroid/net/ITetheringConnector;->stopTethering(ILjava/lang/String;Ljava/lang/String;Landroid/net/IIntResultListener;)V,blockedLandroid/net/TetheringManager$ConnectorConsumer;->onConnectorAvailable(Landroid/net/ITetheringConnector;)V,blockedLandroid/net/TetheringManager$TetheringEventCallback;->onTetherableInterfaceRegexpsChanged(Landroid/net/TetheringManager$TetheringInterfaceRegexps;)V,blockedLandroid/net/TetheringManager$TetheringEventCallback;->onSupportedTetheringTypes(Ljava/util/Set;)V,blockedLandroid/net/TetheringManager;->TETHER_ERROR_*:I,blockedLandroid/net/TetheringManager;->TETHERING_VIRTUAL:I,blockedLandroid/net/IpSecManager;->DIRECTION_FWD:I,blockedLandroid/net/IpSecManager;->INVALID_SECURITY_PARAMETER_INDEX:I,blockedLandroid/net/connectivity/android/net/BpfNetMapsConstants;->IIF_MATCH:J,blockedLandroid/net/connectivity/android/net/BpfNetMapsConstants;->LOCKDOWN_VPN_MATCH:J,blockedLandroid/net/connectivity/android/net/BpfNetMapsConstants;->UID_OWNER_MAP_PATH:Ljava/lang/String;,blockedLandroid/net/wifi/SoftApCapability;->getCountryCode()Ljava/lang/String;,blockedLandroid/net/wifi/SoftApConfiguration$Builder;->setRandomizedMacAddress(Landroid/net/MacAddress;)Landroid/net/wifi/SoftApConfiguration$Builder;,blockedLandroid/net/wifi/SoftApConfiguration;->BAND_TYPES:[I,blockedLandroid/net/wifi/SoftApInfo;->getApInstanceIdentifier()Ljava/lang/String;,blockedLandroid/net/wifi/WifiClient;->getApInstanceIdentifier()Ljava/lang/String;,blockedLandroid/net/wifi/WifiConfiguration$KeyMgmt;->FT_PSK:I,lo-prio,max-target-oLandroid/net/wifi/WifiConfiguration$KeyMgmt;->WPA_PSK_SHA256:I,blockedLandroid/net/wifi/WifiConfiguration;->AP_BAND_2GHZ:I,lo-prio,max-target-oLandroid/net/wifi/WifiConfiguration;->AP_BAND_5GHZ:I,lo-prio,max-target-oLandroid/net/wifi/WifiConfiguration;->AP_BAND_ANY:I,lo-prio,max-target-oLandroid/net/wifi/WifiConfiguration;->apBand:I,unsupportedLandroid/net/wifi/WifiConfiguration;->apChannel:I,unsupportedLandroid/net/wifi/WifiContext;->ACTION_RESOURCES_APK:Ljava/lang/String;,blockedLandroid/net/wifi/WifiManager$SoftApCallback;->onNumClientsChanged(I)V,greylist-max-oLandroid/net/wifi/WifiManager;->cancelLocalOnlyHotspotRequest()V,unsupportedLandroid/net/wifi/p2p/WifiP2pConfig$Builder;->MAC_ANY_ADDRESS:Landroid/net/MacAddress;,blockedLandroid/net/wifi/p2p/WifiP2pConfig$Builder;->mNetworkName:Ljava/lang/String;,blockedLandroid/net/wifi/p2p/WifiP2pGroup;->interfaceAddress:[B,unsupportedLandroid/net/wifi/p2p/WifiP2pManager;->startWps(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/WpsInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V,unsupportedLandroid/provider/Settings$Global;->SOFT_AP_TIMEOUT_ENABLED:Ljava/lang/String;,lo-prio,max-target-oLandroid/service/quicksettings/TileService;->mToken:Landroid/os/IBinder;,lo-prio,max-target-oLcom/android/internal/R$array;->config_tether_bluetooth_regexs:I,max-target-qLcom/android/internal/R$array;->config_tether_usb_regexs:I,max-target-qLcom/android/internal/R$array;->config_tether_wifi_regexs:I,max-target-qLcom/android/internal/R$bool;->config_wifi_p2p_mac_randomization_supported:I,blacklistLcom/android/internal/R$integer;->config_wifi_framework_soft_ap_timeout_delay:I,greylist-max-oLcom/android/internal/R$string;->config_ethernet_iface_regex:I,lo-prio,max-target-oLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->ANONYMIZED_DEVICE_ADDRESS:Ljava/lang/String;Lcom/android/server/SystemServer;->TETHERING_CONNECTOR_CLASS:Ljava/lang/String;Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;,unsupportedLdalvik/system/DexPathList;->nativeLibraryDirectories:Ljava/util/List;,unsupportedLjava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V,unsupportedLjava/lang/invoke/MethodHandles$Lookup;->ALL_MODES:I,lo-prio,max-target-oLjava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;,core-platform-api,max-target-pLandroid/bluetooth/BluetoothPan;->isTetheringOn()Z,sdk,system-api,test-apiLandroid/bluetooth/BluetoothProfile;->PAN:I,sdk,system-api,test-apiLandroid/net/ConnectivityManager$OnStartTetheringCallback;-><init>()V,sdk,system-api,test-apiLandroid/net/ConnectivityManager$OnStartTetheringCallback;->onTetheringFailed()V,sdk,system-api,test-apiLandroid/net/ConnectivityManager$OnStartTetheringCallback;->onTetheringStarted()V,sdk,system-api,test-apiLandroid/net/ConnectivityManager;->startTethering(IZLandroid/net/ConnectivityManager$OnStartTetheringCallback;Landroid/os/Handler;)V,sdk,system-api,test-apiLandroid/net/ConnectivityManager;->stopTethering(I)V,sdk,system-api,test-apiLandroid/net/LinkAddress;->getDeprecationTime()J,sdk,system-api,test-apiLandroid/net/LinkAddress;->getExpirationTime()J,sdk,system-api,test-apiLandroid/net/LinkProperties;->getAllInterfaceNames()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/LinkProperties;->getAllRoutes()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/TetheredClient$AddressInfo;->getAddress()Landroid/net/LinkAddress;,sdk,system-api,test-apiLandroid/net/TetheredClient$AddressInfo;->getHostname()Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheredClient;->getAddresses()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/TetheredClient;->getMacAddress()Landroid/net/MacAddress;,sdk,system-api,test-apiLandroid/net/TetheredClient;->getTetheringType()I,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onClientsChanged(Ljava/util/Collection;)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onError(Ljava/lang/String;I)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onError(Landroid/net/TetheringInterface;I)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onLocalOnlyInterfacesChanged(Ljava/util/Set;)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onOffloadStatusChanged(I)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onTetherableInterfacesChanged(Ljava/util/List;)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onTetherableInterfacesChanged(Ljava/util/Set;)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onTetheringSupported(Z)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringEventCallback;->onUpstreamChanged(Landroid/net/Network;)V,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringRequest$Builder;->setExemptFromEntitlementCheck(Z)Landroid/net/TetheringManager$TetheringRequest$Builder;,sdk,system-api,test-apiLandroid/net/TetheringManager$TetheringRequest$Builder;->setShouldShowEntitlementUi(Z)Landroid/net/TetheringManager$TetheringRequest$Builder;,sdk,system-api,test-apiLandroid/net/TetheringManager;->ACTION_TETHER_STATE_CHANGED:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheringManager;->EXTRA_ACTIVE_LOCAL_ONLY:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheringManager;->EXTRA_ACTIVE_TETHER:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheringManager;->EXTRA_AVAILABLE_TETHER:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheringManager;->EXTRA_ERRORED_TETHER:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_BLUETOOTH:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_ETHERNET:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_NCM:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_USB:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_WIFI_P2P:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHERING_WIGIG:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHER_HARDWARE_OFFLOAD_FAILED:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHER_HARDWARE_OFFLOAD_STARTED:I,sdk,system-api,test-apiLandroid/net/TetheringManager;->TETHER_HARDWARE_OFFLOAD_STOPPED:I,sdk,system-api,test-apiLandroid/net/wifi/DeauthenticationReasonCode;->REASON_*:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->SOFTAP_FEATURE_BAND_24G_SUPPORTED:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->SOFTAP_FEATURE_BAND_5G_SUPPORTED:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->SOFTAP_FEATURE_BAND_60G_SUPPORTED:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->SOFTAP_FEATURE_BAND_6G_SUPPORTED:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->SOFTAP_FEATURE_*:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->areFeaturesSupported(J)Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->getMaxSupportedClients()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApCapability;->getSupportedChannelList(I)[I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;-><init>(Landroid/net/wifi/SoftApConfiguration;)V,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setAllowedAcsChannels(I[I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setAllowedClientList(Ljava/util/List;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setAutoShutdownEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setBand(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setBlockedClientList(Ljava/util/List;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setBridgedModeOpportunisticShutdownEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setBridgedModeOpportunisticShutdownTimeoutMillis(J)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setBssid(Landroid/net/MacAddress;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setChannel(II)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setClientControlByUserEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setClientIsolationEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setHiddenSsid(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setIeee80211axEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setIeee80211beEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setMacRandomizationSetting(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setMaxChannelBandwidth(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setMaxNumberOfClients(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setPassphrase(Ljava/lang/String;I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setShutdownTimeoutMillis(J)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setSsid(Ljava/lang/String;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setVendorElements(Ljava/util/List;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration$Builder;->setWifiSsid(Landroid/net/wifi/WifiSsid;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->BAND_2GHZ:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->BAND_5GHZ:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->BAND_60GHZ:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->BAND_6GHZ:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->BAND_*:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->DEFAULT_TIMEOUT:J,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->RANDOMIZATION_NONE:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->RANDOMIZATION_NON_PERSISTENT:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->RANDOMIZATION_PERSISTENT:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getAllowedAcsChannels(I)[I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getAllowedClientList()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getBand()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getBlockedClientList()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getBridgedModeOpportunisticShutdownTimeoutMillis()J,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getChannel()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getChannels()Landroid/util/SparseIntArray;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getMacRandomizationSetting()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getMaxChannelBandwidth()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getMaxNumberOfClients()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getPersistentRandomizedMacAddress()Landroid/net/MacAddress;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getShutdownTimeoutMillis()J,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->getVendorElements()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isAutoShutdownEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isBridgedModeOpportunisticShutdownEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isClientControlByUserEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isClientIsolationEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isIeee80211axEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isIeee80211beEnabled()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApConfiguration;->isUserConfiguration()Z,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->CHANNEL_WIDTH_*:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->CHANNEL_WIDTH_AUTO:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->CHANNEL_WIDTH_INVALID:I,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getAutoShutdownTimeoutMillis()J,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getBandwidth()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getBssid()Landroid/net/MacAddress;,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getFrequency()I,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getMldAddress()Landroid/net/MacAddress;,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getVendorData()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/wifi/SoftApInfo;->getWifiStandard()I,sdk,system-api,test-apiLandroid/net/wifi/WifiClient;->getDisconnectReason()I,sdk,system-api,test-apiLandroid/net/wifi/WifiClient;->getMacAddress()Landroid/net/MacAddress;,sdk,system-api,test-apiLandroid/net/wifi/WifiConfiguration$KeyMgmt;->WPA2_PSK:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onBlockedClientConnecting(Landroid/net/wifi/WifiClient;I)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onCapabilityChanged(Landroid/net/wifi/SoftApCapability;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onClientsDisconnected(Landroid/net/wifi/SoftApInfo;Ljava/util/List;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onConnectedClientsChanged(Ljava/util/List;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onInfoChanged(Landroid/net/wifi/SoftApInfo;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onInfoChanged(Ljava/util/List;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager$SoftApCallback;->onStateChanged(II)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_FAILURE_REASON:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_INTERFACE_NAME:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_STATE:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->SAP_CLIENT_BLOCK_REASON_CODE_*:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->SAP_START_FAILURE_*:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_CHANGED_ACTION:Ljava/lang/String;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLED:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLING:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLED:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLING:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->WIFI_AP_STATE_FAILED:I,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->getSoftApConfiguration()Landroid/net/wifi/SoftApConfiguration;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration;,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->isApMacRandomizationSupported()Z,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->registerSoftApCallback(Ljava/util/concurrent/Executor;Landroid/net/wifi/WifiManager$SoftApCallback;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->setSoftApConfiguration(Landroid/net/wifi/SoftApConfiguration;)Z,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->setWifiApConfiguration(Landroid/net/wifi/WifiConfiguration;)Z,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->startLocalOnlyHotspot(Landroid/net/wifi/SoftApConfiguration;Ljava/util/concurrent/Executor;Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;)V,sdk,system-api,test-apiLandroid/net/wifi/WifiManager;->unregisterSoftApCallback(Landroid/net/wifi/WifiManager$SoftApCallback;)V,sdk,system-api,test-apiLandroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/List;,sdk,system-api,test-apiLandroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;->onPersistentGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroupList;)V,sdk,system-api,test-apiLandroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V,sdk,system-api,test-apiLandroid/net/wifi/p2p/WifiP2pManager;->requestPersistentGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;)V,sdk,system-api,test-apiLandroid/net/wifi/p2p/WifiP2pManager;->setWifiP2pChannels(Landroid/net/wifi/p2p/WifiP2pManager$Channel;IILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V,sdk,system-api,test-apiLandroid/os/SystemProperties;->getBoolean(Ljava/lang/String;Z)Z,sdk,system-api,test-apiLandroid/os/SystemProperties;->getLong(Ljava/lang/String;J)J,sdk,system-api,test-apiLandroid/provider/Settings$Global;->TETHER_OFFLOAD_DISABLED:Ljava/lang/String;,sdk,system-api,test-apiNonexported system resources:
@com.android.networkstack.tethering:array/config_tether_bluetooth_regexs@com.android.networkstack.tethering:array/config_tether_ncm_regexs@com.android.networkstack.tethering:array/config_tether_usb_regexs@com.android.networkstack.tethering:array/config_tether_wifi_p2p_regexs@com.android.networkstack.tethering:array/config_tether_wifi_regexs@com.android.networkstack.tethering:array/config_tether_wigig_regexs@com.android.wifi.resources:bool/config_wifi_p2p_mac_randomization_supported@com.android.wifi.resources:integer/config_wifiFrameworkSoftApShutDownIdleInstanceInBridgedModeTimeoutMillisecond@com.android.wifi.resources:integer/config_wifiFrameworkSoftApShutDownTimeoutMillisecondsOther:
com.android.settings/.Settings$TetherSettingsActivity is assumed to be exported./apex/com.android.tethering/javalib/service-connectivity.jar.android.net.INetd* and
android.net.BpfNetMapsConstants, may be jarjar-relocated under the optional prefixes
android.net.connectivity or com.android.connectivity.TetheringEventCallback.onLocalOnlyInterfacesChanged is present, AOSP dispatches
startup tether-state callbacks from one executor.execute { ... } block in onCallbackStarted,
and later tether-state updates from one executor.execute { ... } block in
onTetherStatesChanged.mUidOwnerMap is located at /sys/fs/bpf/netd_shared/map_netd_uid_owner_map and is consistent with AOSP usages.For ip rule priorities, RULE_PRIORITY_SECURE_VPN and RULE_PRIORITY_TETHERING is assumed to be 12000 (or higher) and 18000 respectively;
DHCP server like dnsmasq is assumed to run and send DHCP packets as root.
Undocumented system binaries are all bundled and executable:
iptables-save, ip6tables-save;echo;/system/bin/ip (address link monitor neigh rule unreachable);ndc (ipfwd nat network);iptables, ip6tables (with correct version corresponding to API level, -nvx -L <chain>);sh;su.Wi-Fi driver wpa_supplicant:
/data/vendor/wifi/wpa/p2p_supplicant.conf or /data/misc/wifi/p2p_supplicant.conf and have reasonable format;wpa_supplicant after it terminates.