Android wpa_supplicant源码分析--conf配置文件
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配置文件相关推荐
- wpa_supplicant 源码分析 --conf 配置文件
原文:wpa_supplicant源码分析--conf配置文件 | Winddoing's Notes 解析 wpa_supplicant 的配置文件,一般叫做 wpa_supplicant.conf ...
- Android wpa_supplicant源码分析---nl80211内核通信Generic Netlink
代码位置: kernel/net/netlink/genetlink.c kernel/include/net/genetlink.h GENL简介 netlink仅支持32种协议类型,这在实际应用中 ...
- Android wpa_supplicant源码分析--启动之全局初始化
1. wpa_supplicant简介 wpa_supplicant是用来用来支持无线中各种加密方式的,包括WEP.WPA/WPA2和WAPI(中国特有).EAP(8021x).wpa_s通过sock ...
- Android wpa_supplicant源码分析--bss扫描结果
1 扫描方式 手机扫描结果的获取有两种方式:被动和主动 1,AP隔固定时间会发送Beacon帧,Beacon帧中有AP的SSID BSSID等基本信息,手机接收到Beacon帧就认为搜索到该AP创建的 ...
- 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析
[Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...
- 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序
[Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...
- Android 音频源码分析——AudioTrack设备选择
Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...
- Android HandlerThread 源码分析
HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我们又有一 个耗时任务需要执行,我们不得不重新创建 ...
- Android ADB 源码分析(三)
前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 ...
最新文章
- 阿里云:国际化是云计算技术能力的照妖镜
- ACL2020 | 无监督?无监督!你没试过的BERT的全新用法
- linux下mysql主从同步是主从i/o线程显示为no_mysql主从同步IO线程NO
- 揭秘阿里机器翻译团队:拿下5项全球冠军,每天帮商家翻译7.5亿次
- 泛型系列3:获取泛型的类型
- Robot Framework中经常用的第三方库的安装方法
- 3.0-rsync格式
- 《程序员的数学》读后感
- jdk chm右边文档打不开的问题
- 什么是运维工程师?运维工程师应该具备的素质
- 学习关于 2D 和 3D 姿势估计的知识
- Android常用颜色对照表
- VUE中V-IF条件判断改变元素的样式
- threejs正方体六面贴图
- 使用gdal的ogr创建shapefile文件(c++)
- Trino 本地编译搭建 standalone 模式
- Sign function
- CTF-AWD入门手册
- Qt中 gui 模块和 widgets 模块的区别
- 【转】压缩感知测量矩阵之有限等距性质(Restricted Isometry Property, RIP)
热门文章
- 时序分析寄存器到寄存器
- matlab弹幕抓取,B站某视频弹幕抓取
- 计算机数据恢复试题,数据恢复半期考试试题答案.doc
- win10计算机本地连接属性在哪里,分享Win10电脑系统打开本地连接属性的步骤
- 什么是ThreadLocal?ThreadLocal基本使用
- Linux文件系统体系结构
- FTP 错误 550 Failed to change directory 记录贴
- 淘宝MySQL数据库高可用实现方案
- audio: /dev/dsp: No such file or directory madplay
- 微信小程序—自定义相机