如何将 Android 的 WifiService 操作调试到驱动程序级别?

Posted

技术标签:

【中文标题】如何将 Android 的 WifiService 操作调试到驱动程序级别?【英文标题】:How do I debug Android's WifiService operation down to the driver level? 【发布时间】:2015-03-07 11:15:13 【问题描述】:

我需要了解消息是如何从服务级别到驱动程序调用遍历 android 系统的。

我决定从 WiFi 入手,尽管我当前的硬件平台 - 带有 TI 的 Rowboat (Android 4.2.2) 的 Beaglebone Black 板 - 没有 WiFi 功能。

我的计划是在源代码中插入日志函数调用,并通过 am 程序向 WifiService 发送 Intent 以触发向驱动程序发送消息。

我发现,在init.rc中,ServiceManager是通过以下代码启动的

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical                  
    onrestart restart zygote                                           
    onrestart restart media                       
    onrestart restart surfaceflinger
    onrestart restart drm

此外,从 frameworks/base/services/java/com/android/server/SystemServer.java,我找到了这段代码 sn-p

try 
    Slog.i(TAG, "Wi-Fi Service");
    wifi = new WifiService(context);
    ServiceManager.addService(Context.WIFI_SERVICE, wifi);
 catch (Throwable e) 
    reportWtf("starting Wi-Fi Service", e);

我相信它会启动 WifiService

但是,我无法确定 SystemServer 是如何启动的。

除此之外,我还设法在frameworks/base/wifi/java/android/net/wifi/WifiManager.java插入了一个日志函数,如下

public WifiManager(Context context, IWifiManager service) 
    mContext = context;
    mService = service;
    Log.i(TAG, "WiFiManager Created. Calling init()"); // inserted log
    init();

我可以看到它通过使用logcat -s WifiManager 起作用,结果是

I/WifiManager(  317): WiFiManager Created. Calling init()
I/WifiManager(  396): WiFiManager Created. Calling init()
I/WifiManager(  968): WiFiManager Created. Calling init()

但是,我无法确定为什么它会被调用 3 次或调用来自哪里。

至于C代码,我希望通过dmesg看到它的日志信息。

我已将 cscopectags 配置为浏览代码,但我无法找到 WifiServiceWifiManager。

看来我还有很长的路要走,所以任何帮助都将不胜感激。

【问题讨论】:

【参考方案1】:

此演示文稿中的幻灯片 8 可能能够回答您的几个问题

WifiService 和 WifiController 的来源也可能会有所帮助,您可以在 frameworks/base/services/java/com/android/server/wifi 中找到它们。还要检查那里的README.txt

【讨论】:

这在理论上可以回答这个问题,但最好将答案的基本部分包含在此处以供将来的用户使用,并提供链接以供参考。 Link-dominated answers 可以通过link rot 失效。 @Mogsdad 我很清楚,并且真的很想这样做,但我不允许包含图像:( 也许你可以这样做?this 是 URL 完成...但您仍然可以提供文字来解释与问题的相关性。 谢谢,@aaahaaap。我的研究基于“marakana”的幻灯片。由于已经一年了,我不记得我是否能够找到所有的电话。如果我找到自己的幻灯片,我会在这里发布。非常感谢!

以上是关于如何将 Android 的 WifiService 操作调试到驱动程序级别?的主要内容,如果未能解决你的问题,请参考以下文章

怎样从C++代码直接訪问android framework层的WifiService

Android WIFI 模块解析

android wifi 信息

Android WIFI 启动流程

android 2.2 模拟器 -- 无法加载 Wi-Fi 驱动程序

如何将 Android 图像导入 SDK?