Android-WIFI笔记整理(一)

本文详细介绍了Android设备的网络配置、版本管理、关键API使用、HIDL接口实践、蓝牙/WiFi MAC地址设置,以及蓝牙和Wi-Fi日志获取方法。适合开发者深入理解Android系统内部工作原理。

    1、验证SSID和密码配置文件功能:
        手动在setting中添加网络,必须有SSID配置,如xxx,保存后进行如下adb操作
        adb shell
        cd /data/misc/wifi
        grep xxx WifiConfigStore.xml
        在该配置文件中找到包含该xxx字符的行,即表示添加网络并保存成功
    2、通过ifconfig命令可查看IPv4/IPv6地址(如果支持IPv6的话)
    3、查看android源码版本号,可以在文件(build\core\version_defaults.mk)中找到,如:
        PLATFORM_VERSION := 4.0.4
        PLATFORM_SDK_VERSION := 15
        下面为android 4以上的对照表:
            平台版本                   SDK版本    版本名称
            Android 10.0                29    Android 10
            Android 9.0                    28    Pie/P    
            Android 8.1                    27    Oreo/O_MR1
            Android 8.0                      26    Oreo
            Android 7.1                      25    Nougat
            Android 7.0                      24    Nougat
            Android 6.0                      23    Marshmallow
            Android 5.1                      22    Lollipop
            Android 5.0                      21    Lollipop
            Android 4.4                      19    KITKAT
            Android 4.3                      18    JELLY_BEAN_MR2
            Android 4.2, 4.2.2            17    JELLY_BEAN_MR1
            Android 4.1, 4.1.1            16    JELLY_BEAN
            Android 4.0.3, 4.0.4        15    ICE_CREAM_SANDWICH_MR1
            Android 4.0, 4.0.1, 4.0.2    14    ICE_CREAM_SANDWICH
        注意:Android 10即代表android Q版本
    4、android上一些有固定键值的keycode
        键名                   描述         键值
        KEYCODE_MENU        菜单键         82
        KEYCODE_HOME         按键Home     3
        KEYCODE_BACK         返回键         4
        KEYCODE_POWER         电源键         26
        KEYCODE_SEARCH         搜索键         84
        KEYCODE_CAMERA         拍照键         27
        KEYCODE_VOLUME_UP     音量增加键     24
        KEYCODE_VOLUME_DOWN 音量减小键     25
        注意:
            Android利用命令“adb shell input keyevent <键值>”可以实现自动化。例如“adb shell input keyevent 3”就可以按下Home键。
            getevent:显示当前有那些输入设备,数量与 /dev/input 目录下相同
    5、通过aidl添加服务函数
        1.在/frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl中添加新服务方法声明,如:void dhxAIDLTest();
        2.在/frameworks/base/wifi/java/android/net/wifi/WifiManager.java中添加封装调用新服务方法的API函数,如:
            public void dhxAIDLTest(){    //此封装方法名可与新服务方法名不同
                try {
                Log.d(TAG,"WifiManagerdhxAIDLTest is starting");
                    mService.dhxAIDLTest();     //此处为调用新服务方法的地方
                    Log.d(TAG,"WifiManagerdhxAIDLTest is end");
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
            }   
            注意:此处封装时,最好采用try-catch的格式,以防止编译出现错误
                编译完成后会在/frameworks/base/api/current.txt中添加此封装方法名的声明,如:method public void dhxAIDLTest();
            然后把此API函数放在该文件在或其他地方要调用的方法中即可
        3.在/frameworks/base/wifi/java/com/android/server/wifi/BaseWifiService.java中添加新服务方法的一次简单实现,如:
            @Override
            public void dhxAIDLTest(){
                throw new UnsupportedOperationException();
            }
        注意:WifiServiceImpl继承了BaseWifiService,故
        4.在/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java中添加添加新服务方法的二次真正实现,如:
            @Override
            public void dhxAIDLTest(){
                Log.d(TAG, "this is WifiService dhxAIDLTest");
            }
    6、通过RSSI限制wifi扫描列表的显示数量
        1.在/frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java中添加判断RSSI的新方法,如;
            /** Return true if the current RSSI is less than -70, and false otherwise. */
            public boolean isDisplayable() {
                return mRssi >= -70;   //即只显示RSSI大于等于-70的AP
            }
        2.在/packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java->updateAccessPointPreferences中添加对新方法的调用
            if (accessPoint.isReachable() && accessPoint.isDisplayable())
    7、Android手机中热点配置文件保存路径
        热点配置文件在手机中保存路径:/data/misc/wifi/softap.conf
        VPN配置文件在手机中保存路径:/data/misc/keystore/user_0
    8、如何添加Dialog(必要前提:该类中必须已引入context变量)
        1.先引入如下与Dialog相关的类
            import android.app.Dialog;
            import android.app.AlertDialog;
            import android.app.AlertDialog.Builder;
            import android.content.DialogInterface;
        2.建立触发Dialog的API函数(注意OnClickListener()监听器必须要添加!),如:
            public void click(){
                AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

                builder.setTitle("warning");
                builder.setMessage("Pls do not use W52/W53 5GHz band outside");
                builder.setPositiveButton("Positive",new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which){
                        Log.d(TAG, "Positive");//此处日志只是为了方便验证结果
                    }
                });
                final Dialog dialog = builder.create();
                dialog.show();
            }
        3.编译完成后会在.../api/current.txt下生成相应的方法声明,如:
            method public void click();
        4.在需要弹出此Dialog的地方调用此API函数即可
    9、adb写入蓝牙和wifi的mac地址(即写死,若不写即为:00:00:00:00:00:00 此时系统是随即生成mac地址并分配  两者是互斥的!)
        1.蓝牙写入:
            adb shell audioelectric start                                    拉起audioelectric服务
            adb shell audioelectric setbtmac 18:DC:56:90:3B:89               写入BT的mac地址,成功后返回success
            adb shell audioelectric getbtmac                                 读取验证BT的mac地址,成功后返回success
        2.wifi写入:
            adb shell audioelectric start                                    拉起audioelectric服务
            adb shell audioelectric setwifimac 18:DC:56:90:3B:88             写入wifi的mac地址,成功后返回success
            adb shell audioelectric getwifimac                               读取验证wifi的mac地址,成功后返回success
        补充:如何读取BT和wifi的mac地址
            adb shell audioelectric start
            adb shell audioelectric getwifimac
            adb shell audioelectric getbtmac
    10、remount方式  若某次remount不成功时使用,执行如下:
        adb shell setprop sys.verity 1
        adb disable-verity        (若此处执行无效,则应该是adb版本太低,待验证!)
        adb reboot
        adb root
        adb remount  
        一般出现如下提示时表示remount成功:
            [libfs_mgr]dt_fstab: Skip disabled entry for partition vendor
            [libfs_mgr]dt_fstab: Skip disabled entry for partition vendor
            [libfs_mgr]dt_fstab: Skip disabled entry for partition vendor
            [libfs_mgr]dt_fstab: Skip disabled entry for partition vendor
            remount succeeded
    11、adb devices时出现offline,找不到adb设备的一个处理方式,执行如下:
        adb kill-server     终止adb服务
        adb start-server    启动adb服务
        adb remount
        adb reboot
    12、获取或查看软件版本号(其中包含modem、wlan等等的版本号,一般提case时直接把modem的版本号贴上去即可)
        方法1:
            直接从源码目录中找到类似about.html的文件即可(类似路径:/AMSS/RELEASE.NOTES/about.html)
        方法2:
            直接从手机查看或者获取
            adb shell cat /vendor/firmware_mnt/verinfo/ver_info.txt
            adb pull /vendor/firmware_mnt/verinfo/ver_info.txt .
    13、蓝牙btsnoop日志获取方法
        1.Turn off bluetooth
        2.adb shell setprop persist.bluetooth.btsnoopenable true (O/P) and adb shell setprop persist.bluetooth.btsnooplogmode full(Q)
        3.Turn on bluetooth
        btsnoop log will be saved into /data/misc/bluetooth/logs/hci_snoopXXXXXXXXXXXXXX.cfa
    14、//蓝牙logcat日志获取方法(仅供参考!)
        1.Turn off bluetooth
        2.adb root and adb remount
        3.adb pull /etc/bluetooth/bt_stack.conf
        4.set all trace levels to 6
        5.Enable new C++ logs by modifying as below
        LoggingV=--v=0
        LoggingVModule=--vmodule=*/btm/*=1,btm_ble_multi*=2,*/bta/gatt/*=1,*/stack/gatt/*=1,*/stack/smp/*=1,btif_ble*=1
        6.adb push back bt_stack.conf
        7.logcat -b all -v threadtime > Logcat_All.log &
        8.Turn on bluetooth(进行相关的bug复现操作)
    15、一个完整的 HIDL 接口的实现(此处以WiFi获取 MacAddress 为例)
        1./frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
            public String getMacAddress(@NonNull String ifaceName) {
                return mSupplicantStaIfaceHal.getMacAddress(ifaceName);
            }
        2./frameworks/opt/net/wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
            public String getMacAddress(@NonNull String ifaceName) {
                synchronized (mLock) {
                    final String methodStr = "getMacAddress";
                    ISupplicantStaIface iface = checkSupplicantStaIfaceAndLogFailure(ifaceName, methodStr);
                    if (iface == null) return null;
                    Mutable<String> gotMac = new Mutable<>();
                    try {
                        iface.getMacAddress((SupplicantStatus status,
                                byte[/* 6 */] macAddr) -> {
                            if (checkStatusAndLogFailure(status, methodStr)) {
                                gotMac.value = NativeUtil.macAddressFromByteArray(macAddr);
                            }
                        });
                    } catch (RemoteException e) {
                        handleRemoteException(e, methodStr);
                    }
                    return gotMac.value;
                }
            }
        3./hardware/interfaces/wifi/supplicant/1.0/ISupplicantStaIface.hal
            getMacAddress()
                generates (SupplicantStatus status, MacAddress macAddr);
        4./external/wpa_supplicant_8/wpa_supplicant/hidl/1.0/sta_iface.cpp
            Return<void> StaIface::getMacAddress(getMacAddress_cb _hidl_cb)
            {
                return validateAndCall(
                    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
                    &StaIface::getMacAddressInternal, _hidl_cb);
            }
            StaIface::getMacAddressInternal()
            {
                struct wpa_supplicant *wpa_s = retrieveIfacePtr();
                std::vector<char> cmd(
                    kGetMacAddress, kGetMacAddress + sizeof(kGetMacAddress));
                char driver_cmd_reply_buf[4096] = {};
                int ret = wpa_drv_driver_cmd(
                    wpa_s, cmd.data(), driver_cmd_reply_buf,
                    sizeof(driver_cmd_reply_buf));
                // Reply is of the format: "Macaddr = XX:XX:XX:XX:XX:XX"
                std::string reply_str = driver_cmd_reply_buf;
                if (ret < 0 || reply_str.empty() ||
                    reply_str.find("=") == std::string::npos) {
                    return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
                }
                // Remove all whitespace first and then split using the delimiter "=".
                reply_str.erase(
                    remove_if(reply_str.begin(), reply_str.end(), isspace),
                    reply_str.end());
                std::string mac_addr_str =
                    reply_str.substr(reply_str.find("=") + 1, reply_str.size());
                std::array<uint8_t, 6> mac_addr;
                if (hwaddr_aton(mac_addr_str.c_str(), mac_addr.data())) {
                    return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
                }
                return {{SupplicantStatusCode::SUCCESS, ""}, mac_addr};
            }

<think> 首先,用户的问题是:“我想查找拯救者Y7000连接不到隐藏WiFi的解决方案 请问拯救者Y7000连接隐藏WiFi失败的解决办法”。这看起来是关于联想拯救者Y7000笔记本电脑无法连接到隐藏WiFi网络的问题。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 主要记录联想拯救者Y7000如何实现通电自启和有线网自动拨号。 - 引用[2]: 关于WiFi网络连接问题,1-2小时后无法使用,但ping外网正常。 - 引用[3]: 关于键盘故障。 - 引用[4]: Android应用的Java代码。 用户的问题是关于连接隐藏WiFi失败,所以引用[2]似乎相关,因为它提到了WiFi问题。引用[2]描述了个不同的问题:WiFi使用1-2小时后无法使用,但ping正常,应用程序无法连接。这可能是个网络配置或驱动问题,但不是直接关于隐藏WiFi。 用户的问题聚焦在“隐藏WiFi”,意思是SSID被隐藏的WiFi网络。解决方案通常涉及手动添加网络、确保SSID和密码正确等步骤。 我的回答需要: 1. **结构清晰**:逐步解决问题。 2. **真实可靠**:基于般知识和可能的引用。 3. **使用中文**。 4. **生成相关问题**:在末尾添加相关问题。 5. **添加引用标识**:如果引用内容。 从引用中: - 引用[2]提到WiFi问题,但不是特定于隐藏WiFi。它描述的问题可能与驱动或系统设置相关。 - 其他引用不直接相关。 我应该基于般知识构建回答,因为引用没有提供直接解决方案。用户是询问“拯救者Y7000连接隐藏WiFi失败的解决办法”,所以我需要针对这个型号提供建议。 通用解决方案: - 确保WiFi适配器启用。 - 手动添加隐藏网络:在Windows中,进入网络设置,添加新网络,输入SSID和密码。 - 检查密码和网络设置。 - 更新WiFi驱动程序。 - 检查路由器设置。 - 排除干扰。 针对拯救者Y7000: - 这是个特定型号,所以建议检查联想支持网站是否有驱动更新。 - 引用[2]提到用户有WiFi问题,但不是隐藏WiFi。我可以参考它作为可能的相关问题。 回答结构: 1. **引言**:确认问题并概述步骤。 2. **步骤**:逐步解决连接隐藏WiFi的失败。 - 步骤1:手动添加隐藏网络。 - 步骤2:检查SSID和密码。 - 步骤3:更新驱动程序。 - 步骤4:其他故障排除。 3. **引用相关部分**:如果适用。 4. **结束**:建议如果问题持续。 5. **生成相关问题**:添加相关问题部分。 添加引用: - 引用[2]提到WiFi问题,我可以说类似问题可能由驱动引起,但需要谨慎引用。 - 例如:“类似问题如引用[2]中所述,可能由驱动程序或系统设置导致。” LaTeX:用户问题中没有数学内容,所以可能不需要。但指令说“所有行内数学表达式”,如果没有,就不需要。 生成相关问题: - 基于主题:WiFi连接问题、驱动更新、联想拯救者支持等。 - 例如: 1. 如何更新联想拯救者Y7000的WiFi驱动程序? 2. Windows 10中如何解决WiFi连接问题? 3. 隐藏WiFi网络的安全性如何? 确保回答真实可靠:提供般性建议,鼓励用户检查官方支持。 完整回答框架: - 开头:理解问题。 - 步骤: 1. 检查WiFi开关和设置。 2. 手动添加隐藏网络。 3. 验证SSID和密码。 4. 更新网络驱动程序。 5. 重启路由器和电脑。 6. 检查Windows网络诊断。 - 如果问题持续,联系联想支持。 - 引用[2]作为参考:类似问题可能由驱动引起。 - 相关问题部分。 </think>### 拯救者Y7000连接隐藏WiFi失败的解决方案 针对联想拯救者Y7000笔记本电脑无法连接到隐藏WiFi网络的问题,我为您整理了分步解决方案。隐藏WiFi(SSID未广播的网络)需要手动配置,常见失败原因包括驱动问题、网络设置错误或系统冲突。以下步骤基于常见故障排除方法,并结合类似问题(如引用[2]中提到的WiFi连接异常)进行优化。请按顺序操作,确保操作前保存所有工作。 #### 步骤1: 手动添加隐藏WiFi网络 - **操作说明**: 1. 打开Windows设置(Win + I),进入“网络和Internet” > “WiFi” > “管理已知网络”。 2. 点击“添加新网络”,输入隐藏WiFi的确切SSID(区分大小写)、安全类型(如WPA2-Personal)和密码。 3. 勾选“即使此网络未广播也连接”,然后保存。 4. 重启电脑并尝试连接。 - **注意**: 如果SSID或密码错误,连接会失败。建议从路由器后台核对信息。路由器设置方法通常需在浏览器输入192.168.1.1(具体地址参考路由器手册)。 #### 步骤2: 更新或回滚WiFi驱动程序 - **原因分析**: 驱动程序过时或损坏是常见问题(类似引用[2]中描述的WiFi异常)。拯救者Y7000常使用Intel或Realtek无线网卡,驱动兼容性需优先检查。 - **操作说明**: 1. 右键点击“开始菜单”,选择“设备管理器” > “网络适配器”,找到无线网卡(如“Intel Wireless-AC 9560”)。 2. 右键选择“更新驱动程序”,使用自动搜索更新。 3. 如果更新后问题依旧,尝试“回滚驱动程序”:在驱动属性中选择“回滚驱动程序”(仅当之前更新过)。 4. 或从联想官网下载最新驱动: - 访问[联想支持网站](https://support.lenovo.com),输入Y7000型号,下载对应无线驱动。 - 安装后重启电脑。 - **引用支持**: 类似驱动问题可能导致间歇性故障[^2]。 #### 步骤3: 检查系统和网络设置 - **操作说明**: 1. **运行网络诊断**: - 在任务栏右键点击WiFi图标,选择“疑难解答”。Windows会自动检测问题(如IP冲突或协议错误)。 2. **重置网络栈**: - 以管理员身份打开命令提示符(Win + X > “命令提示符(管理员)”),依次输入: ``` netsh winsock reset netsh int ip reset ipconfig /release ipconfig /renew ``` 完成后重启电脑。 3. **禁用省电模式**: - 在“设备管理器”中找到无线网卡,右键选择“属性” > “电源管理”,取消勾选“允许计算机关闭此设备以节约电源”。 #### 步骤4: 排除路由器和环境干扰 - **操作说明**: 1. **重启路由器**: 拔掉路由器电源30秒后重新插上,等待重启完成。 2. **检查频段和信道**: - 登录路由器后台,确保隐藏WiFi使用2.4GHz频段(兼容性更好),避免拥挤信道(如1、6、11)。 - 暂时关闭路由器的“MAC地址过滤”或“防火墙”测试。 3. **减少干扰**: 将电脑靠近路由器,避开微波炉、蓝牙设备等干扰源。 #### 步骤5: 其他高级方案 - **使用系统还原**: 如果问题近期出现,尝试还原到之前正常的状态(设置 > 更新和安全 > 恢复 > 系统还原)。 - **联系联想支持**: 如果以上步骤无效,可能是硬件故障(如网卡损坏)。参考拯救者Y7000的保修服务,或提供设备日志给联想技术支持。 ### 总结 多数隐藏WiFi连接问题可通过手动添加网络、更新驱动或重置网络解决。如果您的设备出现类似引用[2]中的长时间使用后故障,优先更新驱动[^2]。若问题持续,建议备份数据并联系联想官方支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值