http://blog.csdn.net/cuijiyue/article/details/51428835

1 配置文件

conf文件作为wpa_supplicant的配置文件,一般叫做 wpa_supplicant.conf 。其中存储着wpa_supplicant的运行参数和以保存的网络列表。
conf文件的路径,通过启动wpa_supplicant时的 –c 参数传入,初始化过程中赋值到wpa_s->confname,然后将数据读入wpa_s->conf中。

wpa_supplicant的所有参数都定义在struct wpa_config中

struct wpa_config {//config文件中,存储所有network节点的链表struct wpa_ssid *ssid;//按照priority排列的network节点struct wpa_ssid **pssid;//*pssid的长度int num_prio;/*** cred - Head of the credential list** This is the head for the list of all the configured credentials.*/struct wpa_cred *cred;//EAP版本,WPAS支持到2int eapol_version;//1---wpas负责扫描和选择网络//0、2---驱动负责扫描和连接int ap_scan;//bgscan - Background scan and roaming parameters or %NULL if nonechar *bgscan;//disable_scan_offload - Disable automatic offloading of scan requests//驱动可以自行sche_scan,设置为1,disable驱动的功能int disable_scan_offload;// ctrl_interface - Parameters for the control interface//结构名称例如wlan0char *ctrl_interface;//ctrl_interface_group - Control interface group (DEPRECATED)char *ctrl_interface_group;//fast_reauth - EAP fast re-authentication (session resumption)//默认是1 disable,设置为0 disable该功能,int fast_reauth;//opensc_engine_path - Path to the OpenSSL engine for opensc    char *opensc_engine_path;//pkcs11_engine_path - Path to the OpenSSL engine for PKCS#11char *pkcs11_engine_path;//pkcs11_module_path - Path to the OpenSSL OpenSC/PKCS#11 modulechar *pkcs11_module_path;//pcsc_reader - PC/SC reader name prefixchar *pcsc_reader;// pcsc_pin - PIN for USIM, GSM SIM, and smartcardschar *pcsc_pin;//external_sim - Use external processing for SIM/USIM operationsint external_sim;//driver_param - Driver interface parameters//如果有的话,通过struct wpa_driver_ops::set_param()执行char *driver_param;//dot11RSNAConfigPMKLifetime - Maximum lifetime of a PMKunsigned int dot11RSNAConfigPMKLifetime;// dot11RSNAConfigPMKReauthThreshold - PMK re-authentication thresholdunsigned int dot11RSNAConfigPMKReauthThreshold;//dot11RSNAConfigSATimeout - Security association timeoutunsigned int dot11RSNAConfigSATimeout;//update_config - Is wpa_supplicant allowed to update configuration/int update_config;//blobs - Configuration blobsstruct wpa_config_blob *blobs;// uuid - Universally Unique IDentifier (UUID; see RFC 4122) for WPSu8 uuid[16];//device_name - Device Name (WPS)char *device_name;//manufacturer - Manufacturer (WPS)//The manufacturer of the device (up to 64 ASCII characters)char *manufacturer;// model_name - Model Name (WPS)//Model of the device (up to 32 ASCII characters)char *model_name;//model_number - Model Number (WPS)//Additional device description (up to 32 ASCII characters)char *model_number;//serial_number - Serial Number (WPS)//Serial number of the device (up to 32 characters)char *serial_number;//device_type - Primary Device Type (WPS)u8 device_type[WPS_DEV_TYPE_LEN];//config_methods - Config Methods(WPS)char *config_methods;//os_version - OS Version (WPS)//4-octet operating system version numberu8 os_version[4];//country - Country code(ISO/IEC alpha2)char country[2];/*** wps_cred_processing - Credential processing**   0 = process received credentials internally*   1 = do not process received credentials; just pass them over*  ctrl_iface to external program(s)*   2 = process received credentials internally and pass them over*  ctrl_iface to external program(s)*/int wps_cred_processing;#define MAX_SEC_DEVICE_TYPES 5/*** sec_device_types - Secondary Device Types (P2P)*/u8 sec_device_type[MAX_SEC_DEVICE_TYPES][WPS_DEV_TYPE_LEN];int num_sec_device_types;int p2p_listen_reg_class;int p2p_listen_channel;int p2p_oper_reg_class;int p2p_oper_channel;int p2p_go_intent;char *p2p_ssid_postfix;int persistent_reconnect;int p2p_intra_bss;unsigned int num_p2p_pref_chan;struct p2p_channel *p2p_pref_chan;struct wpa_freq_range_list p2p_no_go_freq;int p2p_add_cli_chan;int p2p_ignore_shared_freq;int p2p_optimize_listen_chan;struct wpabuf *wps_vendor_ext_m1;//wps_vendor_ext - Vendor extension attributes in WPS//MAX_WPS_VENDOR_EXT = 10struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXT];// p2p_group_idle - Maximum idle time in seconds for P2P group//超过该时间(秒),将关闭数据int p2p_group_idle;//p2p_passphrase_len - Passphrase length (8..63) for P2P GO//GO产生的随机秘钥的长度(8~63)unsigned int p2p_passphrase_len;//bss_max_count - Maximum number of BSS entries to keep in memory//存储的bss最大个数unsigned int bss_max_count;//bss_expiration_age - BSS entry age after which it can be expired//bss超期时间秒(bss 被remnove后的时间),unsigned int bss_expiration_age;//bss_expiration_scan_count - Expire BSS after number of scans//bss经过几次扫描不到,被removeunsigned int bss_expiration_scan_count;//filter_ssids - SSID-based scan result filtering//0--disable, 1--enableint filter_ssids;//filter_rssi - RSSI-based scan result filtering//0--disable, -n--去掉scan_res中<-ndb的bssint filter_rssi;//max_num_sta - Maximum number of STAs in an AP/P2P GOunsigned int max_num_sta;// freq_list - Array of allowed scan frequencies or %NULL for all//允许扫描的频率列表int *freq_list;//scan_cur_freq - Whether to scan only the current channel,只扫描当前频率int scan_cur_freq;//changed_parameters - Bitmap of changed parameters since last updateunsigned int changed_parameters;//disassoc_low_ack - Disassocicate stations with massive packet loss//因丢包导致关联失败的station个数int disassoc_low_ack;//interworking - Whether Interworking (IEEE 802.11u) is enabledint interworking;//access_network_type - Access Network Type//interworking=1时,该项起作用,取值0~15int access_network_type;//hessid - Homogenous ESS identifier 80211u相关u8 hessid[ETH_ALEN];//hs20 - Hotspot 2.0int hs20;//pbc_in_m1 - AP mode WPS probing workaround for PBC with Windows 7int pbc_in_m1;//autoscan - Automatic scan parameters or %NULL if none,文档中有介绍//<autoscan module name>:<module parameters>char *autoscan;//NFC相关int wps_nfc_pw_from_config;int wps_nfc_dev_pw_id;struct wpabuf *wps_nfc_dh_pubkey;struct wpabuf *wps_nfc_dh_privkey;struct wpabuf *wps_nfc_dev_pw;/*** ext_password_backend - External password backend or %NULL if none** format: <backend name>[:<optional backend parameters>]*/char *ext_password_backend;/** p2p_go_max_inactivity - Timeout in seconds to detect STA inactivity** This timeout value is used in P2P GO mode to clean up* inactive stations.* By default: 300 seconds.*/int p2p_go_max_inactivity;struct hostapd_wmm_ac_params wmm_ac_params[4];// auto_interworking - Whether to use network selection automaticallyint auto_interworking;//p2p_go_ht40 - Default mode for HT40 enable when operating as GO.int p2p_go_ht40;// p2p_go_vht - Default mode for VHT enable when operating as GOint p2p_go_vht;int p2p_disabled;//p2p_no_group_iface - Whether group interfaces can be usedint p2p_no_group_iface;//okc - Whether to enable opportunistic key caching by defaultint okc;//pmf - Whether to enable/require PMF by default。默认值为0//ieee80211w=1 or ieee80211w=2 parameter. pmf=1/2 can be used to changeenum mfp_options pmf;//sae_groups - Preference list of enabled groups for SAEint *sae_groups;// dtim_period - Default DTIM period in Beacon intervalsint dtim_period;// beacon_int - Default Beacon interval in TUint beacon_int;//ap_vendor_elements: Vendor specific elements for Beacon/ProbeRespstruct wpabuf *ap_vendor_elements;//ignore_old_scan_res - Ignore scan results older than requestint ignore_old_scan_res;//sched_scan_interval -  schedule scan intervalunsigned int sched_scan_interval;//tdls_external_control - External control for TDLS setup requestsint tdls_external_control;u8 ip_addr_go[4];u8 ip_addr_mask[4];u8 ip_addr_start[4];u8 ip_addr_end[4];//osu_dir - OSU provider information directorychar *osu_dir;//wowlan_triggers - Wake-on-WLAN triggerschar *wowlan_triggers;//p2p_search_delay - Extra delay between concurrent search iterationsunsigned int p2p_search_delay;//key_mgmt_offload - Use key managment offloadint key_mgmt_offload;
};

2. network节点

conf文件中每一个network节点都是一个保存的网络,在Android手机扫描结果界面中可以直接点击连接该网络,形式如下
network={
ssid=”ASUS”
psk=”**
key_mgmt=WPA-PSK
priority=6
}
上述节点中存储了网络的名称(ssid),密码(psk),加密方式(WPA_PSK),优先级(priority)
WIFI网络有多种加密方式,每种加密方式(wpa_psk,wep,open,wapi,各种eap等)的节点书写方式都不同,具体可以参考源代码中wpa_supplicant.conf文件
wpa_supplicant.conf

每一个network节点解析后会生成一个struct wpa_ssid,结构体中顶一个多种字段,以满足不同加密方式的需求。

//wpa_supplicant.conf中的网络节点都会生成一个wps_ssid的结构体
struct wpa_ssid{//链表指针,链表头存放在struct wpa_config->ssidstruct wpa_ssid *next;//按照priority组成的链表,链表头在struct wpa_config->pssidstruct wpa_ssid *pnext;//每个网络节点都会有一个id,当通过control interface创建时,通过config文件读取时,都会赋予一个idint id;//每个network初始的priority的值是0,当select该bss时,priority会升高//收到扫描结果时,按照priority由高到低匹配,//当priority相同时,会按照安全协议,信号强度匹配//注意:AP采用scan_ssid=1 和 ap_scan=2 时,按照config文件中的顺序(wpa_config->ssid)匹配int priority;//网络标识,可以包含任何字符,u8 *ssid;size_t ssid_len;//如果有该值,是该bssid的AP关联时会用到//如果disabled == 2,该值为GO的macu8 bssid[ETH_ALEN];//对于该network,bssid是否被配置int bssid_set;//GO的mac地址u8 go_p2p_dev_addr[ETH_ALEN];//psk - WPA pre-shared key (256 bits)通过passphrase项的sha生成u8 psk[32];//Whether PSK field is configuredint psk_set;//如果包含该项,那么连接时采用ssid和passphrase,长度为8~63字符char *passphrase;//存储PSK的文件路径char *ext_psk;//pairwise_cipher - Bitfield of allowed pairwise ciphers, WPA_CIPHER_*int pairwise_cipher;//group_cipher - Bitfield of allowed group ciphers, WPA_CIPHER_*int group_cipher;//Bitfield of allowed key management protocols WPA_KEY_MGMT_*int key_mgmt;//背景扫描的间隔(秒),0----disable, -1----使用驱动中默认值int bg_scan_period;//Bitfield of allowed protocols, WPA_PROTO_*int proto;//Bitfield of allowed authentication algorithms(算法)WPA_AUTH_ALG_*int auth_alg;//放BSS设置为隐藏时,使用该项值写入到Probe Requests,//当某些驱动不支持扫描隐藏网络时,设置ap_mode=2int scan_ssid;**EAP相关//Bit field of IEEE 802.1X/EAPOL options (EAPOL_FLAG_*)int eapol_flags;//eap - EAP peer configuration for this networkstruct eap_peer_config eap;**WEP相关//wep密码 NUM_WEP_KEYS=4 MAX_WEP_KEY_LEN=16u8 wep_key[NUM_WEP_KEYS][MAX_WEP_KEY_LEN];size_t wep_key_len[NUM_WEP_KEYS];//wep_tx_keyidx - Default key index for TX frames using WEPint wep_tx_keyidx;//什么是proactive key caching?//1---使能, 0--禁用//与 PMK, PMKSA, RSN有关int proactive_key_caching;/*** mixed_cell - Whether mixed cells are allowed** This option can be used to configure whether so called mixed cells,* i.e., networks that use both plaintext and encryption in the same* SSID, are allowed. This is disabled (0) by default. Enable by* setting this to 1.*/int mixed_cell;#ifdef IEEE8021X_EAPOL//leap - Number of EAP methods using LEAP//LEAP是一种EAP认证,android wifi界面不支持int leap;//non_leap - Number of EAP methods not using LEAPint non_leap;//eap_workaround - EAP workarounds enabled//跳过关联失败的eap serverunsigned int eap_workaround;
#endif /* IEEE8021X_EAPOL *///WPAS模式enum wpas_mode { WPAS_MODE_INFRA = 0,                //征程station模式 WPAS_MODE_IBSS = 1,                 //IBSS网络,只用station不需要AP组成 WPAS_MODE_AP = 2,                   //AP, softapWPAS_MODE_P2P_GO = 3,               //P2P GOWPAS_MODE_P2P_GROUP_FORMATION = 4,  //不能通过config文件设置} mode;//0---该network可用//1---该network不可用,可通过 ctrl_iface启用//2---该network包含P2P参数int disabled;//WPS网络连接之前,设置该值disable,连接完,取消,int disabled_for_connect;/*** peerkey -  Whether PeerKey handshake for direct links is allowed** This is only used when both RSN/WPA2 and IEEE 802.11e (QoS) are* enabled.** 0 = disabled (default)* 1 = enabled*/int peerkey;//id_str - Network identifier string for external scriptschar *id_str;#ifdef CONFIG_IEEE80211W//ieee80211w - Whether management frame protection is enabledenum mfp_options ieee80211w;{ NO_MGMT_FRAME_PROTECTION = 0, MGMT_FRAME_PROTECTION_OPTIONAL = 1, MGMT_FRAME_PROTECTION_REQUIRED = 2,};
#endif /* CONFIG_IEEE80211W */int frequency;int ht40;int vht;//wpa_ptk_rekey - Maximum lifetime for PTK in seconds//PSK生存时间int wpa_ptk_rekey;//该network的扫描频率,如果设置了该值,对于该network,只扫描该频率int *scan_freq;//bgscan 背景扫描设置,参数格式://<bgscan module name>:<module parameters>char *bgscan;//wpas 在 AP模式时,设置隐藏SSID//0--disable, 1--beacon中ssid长度为0,不对probe request做回应, 2 beacon中ssid内容为‘0’,不对probe request做回应int ignore_broadcast_ssid;//如果设置了该项,当接收到扫描结果时,如果频率列表不配皮,不在select该bssint *freq_list;//p2p_client_list - List of P2P Clients in a persistent group (GO)//GC的mac地址列表u8 *p2p_client_list;//num_p2p_clients - Number of entries in p2p_client_listsize_t num_p2p_clients;#define P2P_MAX_STORED_CLIENTS 100//struct psk_list_entry) 链表头struct dl_list psk_list;struct psk_list_entry {struct dl_list list;u8 addr[ETH_ALEN];u8 psk[32];u8 p2p;};//p2p_group - Network generated as a P2P group (config文件不可配置)int p2p_group;//p2p_persistent_group - Whether this is a persistent groupint p2p_persistent_group;//temporary - Whether this network is temporary and not to be savedint temporary;//export_keys - Whether keys may be exportedint export_keys;#ifdef CONFIG_HT_OVERRIDES//disable_ht - Disable HT (高吞吐率模式)(IEEE 802.11n) for this networkint disable_ht;//disable_ht40 - Disable HT40 for this networkint disable_ht40;//disable_sgi - Disable SGI(帧间隔) (Short Guard Interval) for this networkint disable_sgi;//disable_ldpc - Disable LDPC(一种编码方式) for this networkint disable_ldpc;//ht40_intolerant(不容许) - Indicate 40 MHz intolerant for this networkint ht40_intolerant;//disable_max_amsdu - Disable MAX A-MSDU//MSDU一个报文,disable该项,amsdu为3839B,enable则为7935B,//-1则不做任何设置int disable_max_amsdu;//ampdu_factor - Maximum A-MPDU Length Exponen//Value: 0-3, see 7.3.2.56.3 in IEEE Std 802.11n-2009.int ampdu_factor;/* ampdu_density - Minimum A-MPDU Start Spacing* Value: 0-7, see 7.3.2.56.3 in IEEE Std 802.11n-2009.*/int ampdu_density;/* ht_mcs - Allowed HT-MCS rates, in ASCII hex: ffff0000...* By default (empty string): Use whatever the OS has configured.*/char *ht_mcs;
#endif /* CONFIG_HT_OVERRIDES */#ifdef CONFIG_VHT_OVERRIDES/* disable_vht - Disable VHT (束波成型)(IEEE 802.11ac) for this network*/int disable_vht;//vht_capa - VHT capabilities to useunsigned int vht_capa;//vht_capa_mask - mask for VHT capabilitiesunsigned int vht_capa_mask;int vht_rx_mcs_nss_1, vht_rx_mcs_nss_2,vht_rx_mcs_nss_3, vht_rx_mcs_nss_4,vht_rx_mcs_nss_5, vht_rx_mcs_nss_6,vht_rx_mcs_nss_7, vht_rx_mcs_nss_8;int vht_tx_mcs_nss_1, vht_tx_mcs_nss_2,vht_tx_mcs_nss_3, vht_tx_mcs_nss_4,vht_tx_mcs_nss_5, vht_tx_mcs_nss_6,vht_tx_mcs_nss_7, vht_tx_mcs_nss_8;
#endif /* CONFIG_VHT_OVERRIDES *//* ap_max_inactivity - Timeout in seconds to detect STA's inactivity* This timeout value is used in AP mode to clean up inactive stations.* By default: 300 seconds. */int ap_max_inactivity;AP模式/* dtim_period - DTIM period in Beacon intervals* dtim,间隔多个beacon帧中包含tim信息,tim用于通知station AP有其暂存帧* By default: 2 */int dtim_period;//beacon_int - Beacon interval (default: 100 TU)int beacon_int;//auth_failures - Number of consecutive authentication failuresunsigned int auth_failures;// disabled_until - Network block disabled until this time if non-zerostruct os_reltime disabled_until;void *parent_cred;int macsec_policy;//HS20相关,int update_identifier;unsigned int wps_run;
}

3. 操作方法

在conf文件中,可以定义3种节点,
wpa_ssid 对应 network ={ }节点:
wpa_cred 对应 cred = { }节点
wpa_config_blob 对应参数blob-base64-,
主要介绍wpas_ssid(network ={ })的作用,其余两个android还没见过
在conf文件中,是按照 项=值 的对应关系对应的,
network ={ }中的项和值得对应关系存储在全局变量数组ssid_fields中
其余的全局设置项存储在global_fields中

3.1 wpa_config_read读取参数

//name----conf文件的路径
//cfgp----之前的config数据
//有两个全局数组比较重要, ssid_fields存放network节点的所有可设置值, global_fields存放搜有conf中全局的可设置项
struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
{   //buf存放conf中一行的数据,最长不能超过512char buf[512], *pos;//生成一个空的config结构体,里面有一些参数提前设置好默认值struct wpa_config *config = wpa_config_alloc_empty(NULL, NULL);//打开文件FILE *f = fopen(name, "r");//循环获取文件中一行while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) {//network={if (os_strcmp(pos, "network={") == 0) {//检测到"network={",进一步读取网络节点的内容struct wpa_ssid *ssid = wpa_config_read_network(f, &line, id++);{//设置网络节点中一些参数的默认值wpa_config_set_network_defaults(ssid);//获取每一行的内容,通过‘=’匹配,前面是项名称,后是值while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) {//int wpa_config_set(struct wpa_ssid *ssid, const char *var, const char *value, int line)//ssid中对应项的值,ssid_fields全局数组中,定义了每一项的name,获取值方式wpa_config_set(ssid, pos, pos2, *line)}//获取完一个network,对内部的信息进行升级//1.如果设置了passphrase和psk_set,利用sha1生成wpa pskwpa_config_validate_network(ssid, *line);}           //将生成的ssid加入到conf->pssid链表中wpa_config_add_prio_network(config, ssid)} //cred={else if (os_strcmp(pos, "cred={") == 0) {cred = wpa_config_read_cred(f, &line, cred_id++);}//blob-base64-else if (os_strncmp(pos, "blob-base64-", 12) == 0) {if (wpa_config_process_blob(config, f, &line, pos + 12)}//获取conf中的全局参数,存储在全局数组global_fieldselse if (wpa_config_process_global(config, pos, line) < 0) {}}
}

3.2 wpa_config_write写入参数

int wpa_config_write(const char *name, struct wpa_config *config)
{FILE *f;//写入全局项wpa_config_write_global(f, config);//写入cred节点for (cred = config->cred; cred; cred = cred->next) {wpa_config_write_cred(f, cred);}//存储network节点for (ssid = config->ssid; ssid; ssid = ssid->next) {if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary)continue; /* do not save temporary networks */if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set && !ssid->passphrase)continue; /* do not save invalid network */wpa_config_write_network(f, ssid);}//写入blob值for (blob = config->blobs; blob; blob = blob->next) {ret = wpa_config_write_blob(f, blob);}
}

3.3 wpa_config_add_network添加网络

调用该函数后,会返回一个预先设置好id的ssid指针

struct wpa_ssid * wpa_config_add_network(struct wpa_config *config)
{//遍历得到config->ssid中最大的id + 1//生成一个空的ssid节点,并添加到config->ssid链表中ssid->id = id;//更新pssid链表wpa_config_update_prio_list(config);return ssid;
}
  • wpa_config_get_network获取一个network节点

通过id值获取conf->ssid链表的中network元素

struct wpa_ssid * wpa_config_get_network(struct wpa_config *config, int id)
{   struct wpa_ssid *ssid = config->ssid;while (ssid) {if (id == ssid->id)break;
}

3.4wpa_config_remove_network删除一个network节点

通过id值删除network

int wpa_config_remove_network(struct wpa_config *config, int id)
{//通过获取config->ssid链表中id值匹配的ssid元素struct wpa_ssid *ssid = config->ssid;while (ssid) {if (id == ssid->id)break;}//从链表中删除//更新pssid列表wpa_config_update_prio_list(config);//释放空间wpa_config_free_ssid(ssid);
}

3.5wpa_config_set设置network中某项的值

//由外部控制 framework或者wpa_cli
int wpa_config_set(struct wpa_ssid *ssid, const char *var, const char *value, int line);

Android wpa_supplicant源码分析--conf配置文件相关推荐

  1. wpa_supplicant 源码分析 --conf 配置文件

    原文:wpa_supplicant源码分析--conf配置文件 | Winddoing's Notes 解析 wpa_supplicant 的配置文件,一般叫做 wpa_supplicant.conf ...

  2. Android wpa_supplicant源码分析---nl80211内核通信Generic Netlink

    代码位置: kernel/net/netlink/genetlink.c kernel/include/net/genetlink.h GENL简介 netlink仅支持32种协议类型,这在实际应用中 ...

  3. Android wpa_supplicant源码分析--启动之全局初始化

    1. wpa_supplicant简介 wpa_supplicant是用来用来支持无线中各种加密方式的,包括WEP.WPA/WPA2和WAPI(中国特有).EAP(8021x).wpa_s通过sock ...

  4. Android wpa_supplicant源码分析--bss扫描结果

    1 扫描方式 手机扫描结果的获取有两种方式:被动和主动 1,AP隔固定时间会发送Beacon帧,Beacon帧中有AP的SSID BSSID等基本信息,手机接收到Beacon帧就认为搜索到该AP创建的 ...

  5. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  6. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  7. Android 音频源码分析——AudioTrack设备选择

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  8. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我们又有一 个耗时任务需要执行,我们不得不重新创建 ...

  9. Android ADB 源码分析(三)

    前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 ...

最新文章

  1. 阿里云:国际化是云计算技术能力的照妖镜
  2. ACL2020 | 无监督?无监督!你没试过的BERT的全新用法
  3. linux下mysql主从同步是主从i/o线程显示为no_mysql主从同步IO线程NO
  4. 揭秘阿里机器翻译团队:拿下5项全球冠军,每天帮商家翻译7.5亿次
  5. 泛型系列3:获取泛型的类型
  6. Robot Framework中经常用的第三方库的安装方法
  7. 3.0-rsync格式
  8. 《程序员的数学》读后感
  9. jdk chm右边文档打不开的问题
  10. 什么是运维工程师?运维工程师应该具备的素质
  11. 学习关于 2D 和 3D 姿势估计的知识
  12. Android常用颜色对照表
  13. VUE中V-IF条件判断改变元素的样式
  14. threejs正方体六面贴图
  15. 使用gdal的ogr创建shapefile文件(c++)
  16. Trino 本地编译搭建 standalone 模式
  17. Sign function
  18. CTF-AWD入门手册
  19. Qt中 gui 模块和 widgets 模块的区别
  20. 【转】压缩感知测量矩阵之有限等距性质(Restricted Isometry Property, RIP)

热门文章

  1. 时序分析寄存器到寄存器
  2. matlab弹幕抓取,B站某视频弹幕抓取
  3. 计算机数据恢复试题,数据恢复半期考试试题答案.doc
  4. win10计算机本地连接属性在哪里,分享Win10电脑系统打开本地连接属性的步骤
  5. 什么是ThreadLocal?ThreadLocal基本使用
  6. Linux文件系统体系结构
  7. FTP 错误 550 Failed to change directory 记录贴
  8. 淘宝MySQL数据库高可用实现方案
  9. audio: /dev/dsp: No such file or directory madplay
  10. 微信小程序—自定义相机