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

How do I debug Android's WifiService operation down to the driver level?

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

我决定从 WiFi 入手,尽管我当前的硬件平台 - 带有 TI 划艇的 Beaglebone Black 开发板 (Android 4.2.2) - 没有 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,我找到了这个代码片段

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插入了一个log函数,如下

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 来浏览代码,但我无法找到下面的内容 WifiService WifiManager.

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

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

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