精华内容
下载资源
问答
  • RTL8723BU WiFi—蓝牙 模块移植

    万次阅读 2018-05-17 15:28:15
    本次修改基于厂商提供的RTL8723BU_WiFi_linux_v4.3.16_14189.20150519_BTCOEX2015119-5844包 下载链接:http://download.csdn.net/detail/bhj1119/9761769 一 修改记录: 1.配置linux内核 (1)Networking supp...

    硬件:imx6q

    操作系统:Android4.4.2

     

    本次修改基于厂商提供的RTL8723BU_WiFi_linux_v4.3.16_14189.20150519_BTCOEX2015119-5844包

    下载链接:http://download.csdn.net/detail/bhj1119/9761769

    一 修改记录:
    1.配置linux内核
    (1)Networking support --->Wireless下增加802.11 协议栈的支持
    --- Wireless                                                                                                                         
    <M>   cfg80211 - wireless configuration API
    [*]     nl80211 testmode command   
    [*]     enable developer warnings                                                                                                     
    [*]     cfg80211 regulatory debugging 
    [*]     enable powersave by default
    [ ]     cfg80211 DebugFS entries
    [ ]     use statically compiled regulatory rules database  
    [*]     cfg80211 wireless extensions compatibility
      [*]   Wireless extensions sysfs files 
    -*-   Common routines for IEEE802.11 drivers
    [ ]   lib80211 debugging messages  
    [*]   Allow reconnect while already connected 
    <M>   Generic IEEE 802.11 Networking Stack (mac80211)  
    [ ]   PID controller based rate control algorithm  
    [*]   Minstrel
    [*]     Minstrel 802.11n support  
         Default rate control algorithm (Minstrel)  --->  
    [*]   Enable mac80211 mesh networking (pre-802.11s) support 
      [*]   Enable LED triggers  
    [ ]   Export mac80211 internals in DebugFS
    [ ]   Select mac80211 debugging features  ---> 
    (2) 配置Device Drivers  --->USB support  ---><*>   USB Wireless Device Management support 支持WIFI

    2.将RTL8723BU_WiFi_linux_v4.3.16_14189.20150519_BTCOEX2015119-5844/driver下的压缩包拷贝到ANDROID_SDK/kernel_imx/drivers/net/wireless下,解压,修改其Makefile,编译wifi驱动模块,修改内容如下:
    CONFIG_PLATFORM_IMX6Q = y


    ifeq ($(CONFIG_PLATFORM_IMX6Q), y)
    EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
    EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -DCONFIG_PLATFORM_ANDROID -DCONFIG_ANDROID -DCONFIG_CONCURRENT_MODE
    ARCH := arm
    CROSS_COMPILE := XXX/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
    KSRC := XXX/kernel_imx//
    MODULE_NAME := 8723bu
    endif
    如果(1)中选项没有选上,会导致加载wifi模块时报如下错误:
    rtl8723bu: no symbol version for cfg80211_ready_on_channel
    rtl8723bu: Unknown symbol cfg80211_ready_on_channel (err -22)
    rtl8723bu: Unknown symbol odm_SwAntDetectInit (err 0)
    rtl8723bu: no symbol version for __ieee80211_get_channel
    rtl8723bu: Unknown symbol __ieee80211_get_channel (err -22)
    rtl8723bu: no symbol version for cfg80211_roamed
    rtl8723bu: Unknown symbol cfg80211_roamed (err -22)
    rtl8723bu: no symbol version for wiphy_register
    rtl8723bu: Unknown symbol wiphy_register (err -22)
    原因就是:编译WiFi模块时会去KSRC所指的路径下找相应的库,若果相关的编译选项没有选上会导致某些库缺失,从而导致编出来的WiFi模块不完整。
    上述是由于编译内核时内有勾选80211协议栈导致。

    3.用厂商提供的hardware/realtek 替换hardware/realtek
    4.用厂商提供的wpa_supplicant_8_kk_4.4_rtw_r12456.20141003替换ANDROID_SDK/extern/wpa_supplicant_8,并修改文件夹的名字为wpa_supplicant_8。
    5.hardware/libhardware_legacy/wifi/Android.mk 
    修改内容如下:
    --- Android.mk  (版本 170)
    +++ Android.mk  (工作副本)
    @@ -49,15 +49,21 @@
    LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_PARAM=\"$(WIFI_DRIVER_FW_PATH_PARAM)\"
    endif


    -ifeq ($(BOARD_WLAN_DEVICE),UNITE)
    -  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_ath/wpa_supplicant/src/common
    -  LOCAL_SRC_FILES += wifi/wifi_unite.c
    -else ifeq ($(BOARD_WLAN_VENDOR), INTEL)
    -  LOCAL_SRC_FILES += wifi/wifi_intel.c
    -  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
    +#ifeq ($(BOARD_WLAN_DEVICE),UNITE)
    +#  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_ath/wpa_supplicant/src/common
    +#  LOCAL_SRC_FILES += wifi/wifi_unite.c
    +#else ifeq ($(BOARD_WLAN_VENDOR), INTEL)
    +#  LOCAL_SRC_FILES += wifi/wifi_intel.c
    +#  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
    +#else
    +#  LOCAL_SRC_FILES += wifi/wifi.c
    +#  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
    +#endif
    +
    +ifeq ($(BOARD_WIFI_VENDOR), realtek)
    +LOCAL_SRC_FILES += ../realtek/wlan/libhardware_legacy/wifi/wifi_realtek.c
    else
    -  LOCAL_SRC_FILES += wifi/wifi.c
    -  LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
    +LOCAL_SRC_FILES += wifi/wifi.c
    endif


    6.修改device/fsl/sabresd_6dq/BoardConfig.mk
    修改内容如下:
    --- BoardConfig.mk      (版本 170)
    +++ BoardConfig.mk      (工作副本)
    @@ -26,6 +26,33 @@
    TARGET_BOOTLOADER_BOARD_NAME := SABRESD
    PRODUCT_MODEL := SABRESD-MX6DQ


    +
    +BOARD_WIFI_VENDOR := realtek
    +ifeq ($(BOARD_WIFI_VENDOR), realtek)
    +WPA_SUPPLICANT_VERSION := VER_0_8_X
    +BOARD_WPA_SUPPLICANT_DRIVER := NL80211
    +CONFIG_DRIVER_WEXT :=y
    +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
    +BOARD_HOSTAPD_DRIVER := NL80211
    +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
    +#BOARD_WLAN_DEVICE := rtl8192cu
    +#BOARD_WLAN_DEVICE := rtl8192du
    +#BOARD_WLAN_DEVICE := rtl8192ce
    +#BOARD_WLAN_DEVICE := rtl8192de
    +#BOARD_WLAN_DEVICE := rtl8723as
    +#BOARD_WLAN_DEVICE := rtl8723au
    +#BOARD_WLAN_DEVICE := rtl8189es
    +#BOARD_WLAN_DEVICE := rtl8723bs
    +BOARD_WLAN_DEVICE := rtl8723bu
    +WIFI_DRIVER_MODULE_NAME := "8723bu"
    +WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/8723bu.ko"
    +WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
    +WIFI_FIRMWARE_LOADER := ""
    +WIFI_DRIVER_FW_PATH_STA := ""
    +WIFI_DRIVER_FW_PATH_AP := ""
    +WIFI_DRIVER_FW_PATH_P2P := ""
    +WIFI_DRIVER_FW_PATH_PARAM := ""
    +else
    # UNITE is a virtual device support both atheros and realtek wifi(ar6103 and rtl8723as)
    BOARD_WLAN_DEVICE            := UNITE
    WPA_SUPPLICANT_VERSION       := VER_0_8_UNITE
    @@ -39,6 +66,7 @@
    BOARD_WPA_SUPPLICANT_PRIVATE_LIB_QCOM       := lib_driver_cmd_qcwcn
    BOARD_HOSTAPD_PRIVATE_LIB_RTL               := lib_driver_cmd_rtl
    BOARD_WPA_SUPPLICANT_PRIVATE_LIB_RTL        := lib_driver_cmd_rtl
    +endif
    #for intel vendor
    ifeq ($(BOARD_WLAN_VENDOR),INTEL)
    BOARD_HOSTAPD_PRIVATE_LIB                := private_lib_driver_cmd
    @@ -118,3 +146,4 @@
    fs_use \
    untrusted_app.te \
    genfs_contexts


    上述步骤完成后,到根目录下执行make 编译整个系统。
    二 测试
    1.安装cfg80211.ko,8723bu.ko依赖此模块,缺省会报如下错误:

    8723bu: Unknown symbol cfg80211_ready_on_channel (err 0)
    8723bu: Unknown symbol __ieee80211_get_channel (err 0)
    8723bu: Unknown symbol cfg80211_roamed (err 0)
    8723bu: Unknown symbol wiphy_register (err 0)
    8723bu: Unknown symbol cfg80211_disconnected (err 0)
    8723bu: Unknown symbol cfg80211_new_sta (err 0)
    8723bu: Unknown symbol cfg80211_connect_result (err 0)
    8723bu: Unknown symbol cfg80211_inform_bss_frame (err 0)

    2.安装8723bu.ko模块,两个模块都安装好之后,执行netcfg,会看到多出wlan0和p2p0设备节点,他们是8723bu驱动创建出来的,放到sys/class/net/下。


    lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
    can0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
    can1     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
    eth0     UP                                     0.0.0.0/0   0x00001043 1e:ed:19:27:1a:b3
    wlan0    DOWN                                   0.0.0.0/0   0x00001002 7c:c7:09:30:c5:4d
    p2p0     DOWN                                   0.0.0.0/0   0x00001002 7e:c7:09:30:c5:4d




    3.执行ifconfig wlan0 up,打开wlan0


    4.执行system/bin/wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf,启动wpa_supplicant进程。
    启动过程报如下错误:
    E/wpa_supplicant( 3251): mkdir[ctrl_interface=wlan0]: Permission denied
    E/wpa_supplicant( 3251): Failed to initialize control interface 'wlan0'.
    E/wpa_supplicant( 3251): You may have another wpa_supplicant process already running or the file was
    E/wpa_supplicant( 3251): left by an unclean termination of wpa_supplicant in which case you will need
    E/wpa_supplicant( 3251): to manually remove this file before starting wpa_supplicant again.
    错误原因:wpa_supplicant进程运行时的配置文件wpa_supplicant.conf文件中的ctrl_interface的路径不对,没有匹配成功,导致进程启动失败。原来ctrl_interface的路径是/var/run/wpa_supplicant,把ctrl_interface改成/data/misc/wifi/wpa_supplicant就可以了。
    ctrl_interface在哪里?在工程下的external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.conf中。
    深入分析:
    wpa_supplicant_init_iface函数分析
    init_iface初始化的第一个工作是解析运行时配置文件。其中,wpa_s->confname的值为“/data/misc/wifi/wpa_supplicant.conf”,解析函数是wpa_config_read。
    wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);  
        if (wpa_s->ctrl_iface == NULL) {  
            wpa_printf(MSG_ERROR,  
                       "Failed to initialize control interface '%s'.\n"  
                       "You may have another wpa_supplicant process "  
                       "already running or the file was\n"  
                       "left by an unclean termination of wpa_supplicant "  
                       "in which case you will need\n"  
                       "to manually remove this file before starting "  
                       "wpa_supplicant again.\n",  
                       wpa_s->conf->ctrl_interface);  
              return -1;  
        }  

    如果是linux系统,可能没有wpa_supplicant工具,可参考wpa_supplicant-2.6交叉编译  ,移植此工具。
    5.执行system/bin/wpa_cli -p/data/misc/wifi/wpa_supplicant,配置并连接wifi热点。
    Could not connect to wpa_supplicant: wlan0 - re-trying

    wpa_cli v2.0-devel-4.4.2_rtw_r12456.20141003
    Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors


    This software may be distributed under the terms of the BSD license.
    See README for more details.


    Selected interface 'wlan0'


    Interactive mode


    1)> scan
    OK
    <3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
    <3>CTRL-EVENT-SCAN-RESULTS
    <3>WPS-AP-AVAILABLE
    <3>CTRL-EVENT-STATE-CHANGE id=-1 state=2 BSSID=00:00:00:00:00:00 SSID=
    2)> scan_results
    bssid / frequency / signal level / flags / ssid
    78:eb:14:bd:f6:9e       2412    -58     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      B1412
    bc:67:1c:41:29:4d       2437    -65     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       systec-cisco
    e0:05:c5:23:fc:52       2452    -71     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]
    30:fc:68:0b:c9:f6       2437    -71     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      gsdq
    ec:26:ca:53:ea:f1       2462    -72     [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] TP-LINK_EAF1
    00:1f:f3:bf:d0:6f       2462    -73     [WPA2-PSK-CCMP][ESS]    tcs apple
    d4:ee:07:29:9b:4a       2442    -73     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      Cherry&Filippo
    24:69:68:16:a9:1e       2462    -74     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      \xe6\xb2\x83\xe7\x95\x89
    fc:d7:33:8d:0a:36       2412    -74     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      dangyuanweixin
    b0:c0:90:3a:24:a3       2422    -74     [WPA2-PSK-CCMP][ESS]    360\xe8\xa1\x8c\xe8\xbd\xa6\xe8\xae\xb0\xe5\xbd\x95\xe4\xbb\xaa-A3
    c8:3a:35:1f:5f:88       2422    -80     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      wangzihao
    c8:3a:35:06:a9:b0       2452    -82     [WPA-PSK-CCMP][ESS]     Tenda_06A9B0
    00:3a:99:9b:9b:40       2417    -45     [WEP][ESS]      systec-AP
    00:0c:43:30:50:a0       2437    -51     [ESS]   Wii-Link_3050A0
    08:10:78:e1:27:a5       2412    -74     [ESS]   NETCORE_27A5
    3)> add_network
    0
    4)> set_network 0 ssid "systec-cisco"
    OK
    5)> set_network 0 psk "XXX"
    OK
    6)> select_network 0
    OK
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=3 BSSID=00:00:00:00:00:00 SSID=systec-cisco
    <3>CTRL-EVENT-SCAN-RESULTS
    <3>WPS-AP-AVAILABLE
    <3>Trying to associate with bc:67:1c:41:29:4d (SSID='systec-cisco' freq=2437 MHz)
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=5 BSSID=00:00:00:00:00:00 SSID=systec-cisco
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=6 BSSID=00:00:00:00:00:00 SSID=systec-cisco
    <3>Associated with bc:67:1c:41:29:4d
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=7 BSSID=bc:67:1c:41:29:4d SSID=systec-cisco
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=8 BSSID=bc:67:1c:41:29:4d SSID=systec-cisco
    <3>WPA: Key negotiation completed with bc:67:1c:41:29:4d [PTK=CCMP GTK=TKIP]
    <3>CTRL-EVENT-CONNECTED - Connection to bc:67:1c:41:29:4d completed (auth) [id=0 id_str=]
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=bc:67:1c:41:29:4d SSID=systec-cisco
    7)enable_network 0
    OK

    查看链接状态:
    > status
    bssid=bc:67:1c:41:29:4d
    ssid=systec-cisco
    id=0
    mode=station
    pairwise_cipher=CCMP
    group_cipher=TKIP
    key_mgmt=WPA2-PSK
    wpa_state=COMPLETED
    p2p_device_address=7c:c7:09:30:c5:4d
    address=7c:c7:09:30:c5:4d
    <3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=bc:67:1c:41:29:4d SSID=systec-cisco
    <3>CTRL-EVENT-CONNECTED - connection to bc:67:1c:41:29:4d completed (auth) [id=0 id_str=]



    执行dhcpcd wlan0 分配IP,此时再netcfg查看,wlan0de ip 已经变成10.0.0.118
    root@sabresd_6dq:/ # netcfg
    lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
    can0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
    can1     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
    eth0     UP                                     0.0.0.0/0   0x00001043 1e:ed:19:27:1a:b3
    wlan0    UP                                  10.0.0.118/24  0x00001043 7c:c7:09:30:c5:4d
    p2p0     DOWN                                   0.0.0.0/0   0x00001002 7e:c7:09:30:c5:4d

    ping 一下看看通不通
    root@sabresd_6dq:/ # ping 192.168.1.1
    PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
    64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=29.1 ms
    64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=15.9 ms
    64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=16.4 ms
    64 bytes from 192.168.1.1: icmp_seq=4 ttl=63 time=14.3 ms
    64 bytes from 192.168.1.1: icmp_seq=5 ttl=63 time=14.0 ms
    ^C
    --- 192.168.1.1 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4006ms
    rtt min/avg/max/mdev = 14.034/17.991/29.183/5.672 ms

    至此wifi模块移植完毕,可以实现扫描,链接,分配IP

    延伸阅读:关于SDIO接口WiFi模块的调试经验
     

    展开全文
  • 1, 明确让BU指出来是哪个数据对不上,差别多大,让BU 把他用来核对的数据发送出来; 2,在自己pull数据的任何一个步骤,保证你的逻辑是没有问题的,数据pull出来之后,找个最权威的report check好自己的数据;这样...

    BU 那你的A数据,与其他B数据对比,发现数据对不上:

    1, 明确让BU指出来是哪个数据对不上,差别多大,让BU 把他用来核对的数据发送出来;

    2,自己做任何request,pull数据的任何一个步骤,保证你的逻辑是没有问题的,数据pull出来之后,找个最权威的report check好自己的数据;这样后面你可以潇洒滴说,我的数据没有问题。

    3,确定自己的数据没有问题之后,让BU 把负责B数据的人联系方式给你。了解B数据是从哪些table,用什么逻辑拖出来的;

    4,找出原因;

    展开全文
  • OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是后台运行的进程)都被杀死时,系统会调用OnLowMemory。系统提供的回调有: Application.onLowMemory() ...

    新手开发者,也就是我这种的基本上就是对android的基础还凑合,觉得自己已经能独立的开发app,但是往往忽略了对于android 内存使用的优化,总是觉得想用就用,等到应用OOM的时候才开始向要优化,想想以前经常遇到的好多问题,感觉确实是让自己进步了很多。

    说的有点乱,android对于内存优化其实做了很多,其中就有onLowMemory& onTrimMemory

    这是俩个我们在程序中可以进行操作的俩个方法:

    在内存紧张的时候,会回调OnLowMemory/OnTrimMemory,需要在回调方法中编写释放资源的代码。
    可以在资源紧张的时候,释放UI 使用的资源资:Bitmap、数组、控件资源。

    OnLowMemory

    OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。系统提供的回调有:
    Application.onLowMemory()
    Activity.OnLowMemory()
    Fragement.OnLowMemory()
    Service.OnLowMemory()
    ContentProvider.OnLowMemory()
    除了上述系统提供的API,还可以自己实现ComponentCallbacks,通过API注册,这样也能得到OnLowMemory回调。例如:
    public static class MyCallback implements ComponentCallbacks {
    @Override
    public void onConfigurationChanged(Configuration arg) {
    }

    @Override
    public void onLowMemory() {
    //do release operation
    }
    }
    然后,通过Context.registerComponentCallbacks ()在合适的时候注册回调就可以了。通过这种自定义的方法,可以在很多地方注册回调,而不需要局限于系统提供的组件。
    onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。


    OnTrimMemory

    OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。系统提供的回调有:
    Application.onTrimMemory()
    Activity.onTrimMemory()
    Fragement.OnTrimMemory()
    Service.onTrimMemory()
    ContentProvider.OnTrimMemory()
    OnTrimMemory的参数是一个int数值,代表不同的内存状态:
    TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
    TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
    TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
    TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。 
    以上4个是4.0增加
    TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存
    TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存
    TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存 
    以上3个是4.1增加
    系统也提供了一个ComponentCallbacks2,通过Context.registerComponentCallbacks()注册后,就会被系统回调到。

    OnLowMemory和OnTrimMemory的比较

    1,OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。
    2,OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
    3,通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。

    不管是在activity,Fragment,Application,Service,ContentProvider中我们都可以通过这俩个方法来保证自己的应用程序尽量不被杀掉,让手机的更多资源来服务我们的程序。

    android的程序优化比较多,这只是其中的一点。

    展开全文
  • 一般是: scard0:系统内部存储 scard1:外插的sd卡 也有特例。。 分别获取路径的方法: package com.main; import java.lang.reflect.Method; import android.app....import android.os.Bu...

    一般是:

    scard0:指系统内部存储

    scard1:指外插的sd卡

    也有特例。。

    分别获取路径的方法:

    package com.main;
    
    import java.lang.reflect.Method;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.os.storage.StorageManager;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	TextView tv1;
    	TextView tv2;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		tv1 = (TextView) findViewById(R.id.tv1);
    		tv2 = (TextView) findViewById(R.id.tv2);
    		String str1 = getPrimaryStoragePath();
    		String str2 = getSecondaryStoragePath();
    		tv1.setText(str1);
    		tv2.setText(str2);
    
    	}
    
    	private static final String TAG = "PhoneStatusBarPolicy";
    
    	public String getPrimaryStoragePath() {
    		try {
    			StorageManager sm = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    			Method getVolumePathsMethod = StorageManager.class.getMethod(
    					"getVolumePaths", null);
    			String[] paths = (String[]) getVolumePathsMethod.invoke(sm, null);
    			// first element in paths[] is primary storage path
    			return paths[0];
    		} catch (Exception e) {
    			Log.e(TAG, "getPrimaryStoragePath() failed", e);
    		}
    		return null;
    	}
    
    	public String getSecondaryStoragePath() {
    		try {
    			StorageManager sm = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    			Method getVolumePathsMethod = StorageManager.class.getMethod(
    					"getVolumePaths", null);
    			String[] paths = (String[]) getVolumePathsMethod.invoke(sm, null);
    			// second element in paths[] is secondary storage path
    			return paths[1];
    		} catch (Exception e) {
    			Log.e(TAG, "getSecondaryStoragePath() failed", e);
    		}
    		return null;
    	}
    
    	public String getStorageState(String path) {
    		try {
    			StorageManager sm = (StorageManager) getSystemService(STORAGE_SERVICE);
    			Method getVolumeStateMethod = StorageManager.class.getMethod(
    					"getVolumeState", new Class[] { String.class });
    			String state = (String) getVolumeStateMethod.invoke(sm, path);
    			return state;
    		} catch (Exception e) {
    			Log.e(TAG, "getStorageState() failed", e);
    		}
    		return null;
    	}
    }
    
    红米手机的效果:
    效果:


    展开全文
  • 总结PeolpleSoft中BU、SetId、Record ...也有点纠结,下来自己看了一些文档,问了一些搞Ps的GGJJMMDD,有些是原话,总结如下:(肯定有一些我理解失误的的地方,望看到的GGJJMMDD出来。   BU
  • (领域建模能力在蚂蚁金服的某BU,是作为应用架构高P的考核标准之一) 所以做好领域建模,不止是提升开发人员的综合素质能力,也是设计出可以低成本维护的可持续发展的稳定系统的必备要素。而领域模型到系统模型这一...
  • 就比如我在第一道题里边的update_key, move_head两个函数没有标记成私有,面试官就耐心的出来了。 包括ide自动出来的不规范的地方也尽量改过来,这样可以给面试官一个良好的印象。 不得不说华为面试安排的还是...
  • 【内推码】opbper(投递简历时填写内推码即可) 【投递方式】 PC端 ...点击筛选“ TCL实业 -泛智屏BU-研发中心” 进行...TCL电子泛智屏BU研发中心 主要负责TV产品、智能家居产品、商用产品等产品设计、开发、集成实现..
  • 尝试用 vue 实现灭霸打响英雄消失的效果 demo

    万次阅读 多人点赞 2019-05-05 00:23:15
    灭霸打响的消失效果。效果来源于 Google 搜索“灭霸” 或者 “thanos”。算是蹭热度的一个 Feature, 我通过 F12 试图去查看是如何实现的,也抠了一些音频、图片资源下来。后来在 github 上找到了一个现有的项目 ...
  • (领域建模能力在蚂蚁金服的某BU,是作为应用架构高P的考核标准之一) 所以做好领域建模,不止是提升开发人员的综合素质能力,也是设计出可以低成本维护的可持续发展的稳定系统的必备要素。而领域模型到系统模型这一...
  • 未确认交易限制是对一笔未确认交易的转账次数进行限制,这为了防止零确认交易情况下出现回滚或者双花的风险。BCH的未确认交易限制是25,也就意味着一笔未确认交易最多只能在10分钟的时间内连续转账25次,多出的...
  • 在很多外企中,会经常说到一些专有名词,比如 各BU,某BP。你知道这两个英文简写的含义吗?来看今天这些外企常用的表达吧。 BU = Business Unit,业务单元 一般公司里都会有不同的部门, 如教育公司会有中小学事业...
  • Offer 07. 重建二叉树 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }...
  • offer 61. 扑克牌中的顺子 题目描述 解题思路 参考题解:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solution/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/ class Solution ...
  • Offer—位运算

    2021-08-17 10:30:37
    Offer—位运算位运算的基本操作位操作习题eg1 J15 [二进制中1的个数](https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/)eg2 J65 [不用加减乘除做加法]...)eg3 J56-I [数组中数字出现的次数]...
  • https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题意: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 题解: 利用python里的字典...
  • 题目 写一个函数,求两个整数之...链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 需要注意的地方 题目
  • https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。提示:s.length <= 40000,...
  • Offer21

    2021-09-24 23:14:07
    Offer第二十一天 位运算(简单) 题1:二进制中1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 public class ...
  • 题号:剑 Offer 48 题目名:最长不含重复字符的子字符串 原题URL:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题目描述 请从字符串中找出一个最长的不包含重复字符...
  • Offer 26. 树的子结构 二叉树匹配类问题总结 B 属于 A 的一部分也可以,没必要一直匹配到叶子节点 递归解法 recur的返回条件: 当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true ; 当节点 ...
  • 在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定...从第二个字符起rw-是说用户apple有读、写权,没有运行权,接着的r--表示用户组users只有读权限,没有运行权,最后的r--其他
  • tags: 剑offer categories: LeetCode题解 · 题目描述 题目来自LeetCode : https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是...
  • Offer 65. 不用加减乘除做加法题目描述解题过程解题思路总结 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a = 1, b = 1 输出: 2 ...
  • 不用加减乘除做加法](https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/)题目分析初始解答:学习他人:方法一:方法二:方法三:总结 刷题日期:下午7:44 2021年5月27日星期四 个人...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,009
精华内容 3,203
关键字:

bu指的什么