背景:客户应用需要获取WiFi-Mac地址,因此修复系统隐藏api开启第三方APP通过反射隐藏api的方式来获取
修改代码:
1.移除@hide限制,移除@SystemApi限制,移除NETWORK_SETTINGS权限限制
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
--- a/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
+++ b/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
@@ -5336,11 +5336,8 @@ public class WifiManager {
* Gets the factory Wi-Fi MAC addresses.
* @return Array of String representing Wi-Fi MAC addresses sorted lexically or an empty Array
* if failed.
- * @hide
*/
@NonNull
- @SystemApi
- @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public String[] getFactoryMacAddresses() {
try {
return mService.getFactoryMacAddresses();
2.移除调用UID的checkNetworkSettingsPermission权限检查
--- a/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -3912,11 +3912,11 @@ public class WifiServiceImpl extends BaseWifiService {
*/
@Override
public String[] getFactoryMacAddresses() {
- final int uid = Binder.getCallingUid();
+ /*final int uid = Binder.getCallingUid();
if (!mWifiPermissionsUtil.checkNetworkSettingsPermission(uid)) {
throw new SecurityException("App not allowed to get Wi-Fi factory MAC address "
+ "(uid = " + uid + ")");
- }
+ }*/
String result = mWifiThreadRunner.call(mClientModeImpl::getFactoryMacAddress, null);
// result can be empty array if either: WifiThreadRunner.call() timed out, or
// ClientModeImpl.getFactoryMacAddress() returned null.
3.make update-api
4.刷机
5.第三方app调用方式:
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
try {
Class<?> wifiManagerClass = Class.forName("android.net.wifi.WifiManager");
Method getFactoryMacAddresses = wifiManagerClass.getMethod("getFactoryMacAddresses");
getFactoryMacAddresses.setAccessible(true);
String[] strs = (String[]) getFactoryMacAddresses.invoke(wifiManager);
for (String str: strs){
Log.d("wifi mac:", str);//TODO
}
} catch (Exception e) {
e.printStackTrace();
}
END