为什么80%的码农都做不了架构师?>>>
log内容:setWifiEnabled:true pid=1556,uid=1000
看这log,基本就是应用程序中调用了wifiManager.setWifiEnabled(true),去framework中查找去吧。
frameworks/services/java/com/android/server/wifi/WifiService.java
这里查看到LOG输出的地方:
public synchronized boolean setWifiEnabled(boolean enable) {
enforceChangePermission();
Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid());
if (DBG) {
Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
}
/*
* Caller might not have WRITE_SECURE_SETTINGS,
* only CHANGE_WIFI_STATE is enforced
*/
long ident = Binder.clearCallingIdentity();
try {
if (! mSettingsStore.handleWifiToggled(enable)) {
// Nothing to do if wifi cannot be toggled
return true;
}
} finally {
Binder.restoreCallingIdentity(ident);
}
mWifiController.sendMessage(CMD_WIFI_TOGGLED);
return true;
}
当前不需要注意他是如何实现的,我们的目的获取到入口应用的包名,在WifiService.java中扫一眼,没看到啥能下手的地方。转眼就去了WifiManager.java里面瞅瞅:
public WifiManager(Context context, IWifiManager service) {
好了,看到这里我想大家就豁然开朗了吧。
我们可以拿context做好多事情,譬如getPackageName()、getPackageName()和getPackageName()~
接下来就在下文的setWifiEnabled()中把获取的包名输出。重新编译了下framework,将生成的framework2.jar、framework2jar、ext.jar push 到手机里面,并自己写了一个wifi开关的小例子查看LOG,简单的改动就实现了谁调这接口就输出谁的包名。
手动点击设置里面的wifi开关也能获取到包名哦!
05-19 14:08:01.102 E/WifiManager( 1333): the_package name is com.android.settings
05-19 14:08:01.102 D/WifiService( 989): setWifiEnabled: false pid=1333, uid=1000
完!