顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2014年7月14日 星期一

Android連結WiFi

1. wpa_supplicant -Dwext -iwlan0 -C/data/system/wpa_supplicant
    -c/data/misc/wifi/wpa_supplicant.conf
2. wpa_cli -p/data/system/wap_supplicant -iwlan0
    使用下面command設置WiFi
    scan
    scan_results
    add_network
    set_network <network id> <variable> <value>
    enable_network <network id>
    disable_network <network id>

Android查看service狀態



getprop|grep xxx.svc

2014年3月20日 星期四

Android Intel CedarTrail整合MTK MT7610U USB WiFi Dongle

1. 首先拿到WiFi driver,看一下driver的Makefile
  • 看來這driver並非Kernel driver,可以直接丟到driver下並透由menuconfig選擇。
  • 這driver是可以直接在Linux PC環境下編譯的。
P.S. 因為改成Kernel driver很麻煩,所以改了一下Android.mk的描述,儘量不改driver。

2. 將driver放到Kernel底下
  • 如果直接編譯driver,會出現沒有.config的設定。
  • 也非Kernel driver所用的makefile,無法跟著Kernel一起編譯。

3. 修改Kernel底下的Android.mk,增加WiFi driver路徑描述
    $(mk_kernel) oldnoconfig
    $(mk_kernel) $(KERNEL_TARGET) $(if $(MOD_ENABLED),modules)
    $(hide) $(ACP) -fp $(BUILT_KERNEL_TARGET) $@
    $(if $(FIRMWARE_ENABLED),$(mk_kernel) ... ... ...
    $(mk_kernel) -C XXXu
    cp $(CURDIR)/kernel/XXXu/MODULE/os/linux/XXXu_sta.ko     
    $(KBUILD_OUTPUT)/drivers/net/
    cp $(CURDIR)/kernel/XXXu/NETIF/os/linux/XXXu_sta_net.ko
    $(KBUILD_OUTPUT)/drivers/net/
    cp $(CURDIR)/kernel/XXXu/UTIL/os/linux/XXXu_sta_util.ko
    $(KBUILD_OUTPUT)/drivers/net/

  • 改完後,在Kernel編譯完後,會自動編譯WiFi driver。
  • 編譯完後會將WiFi driver拷貝到output driver路徑下。

4. 將所有的drivers拷貝到Platform目錄下

5. 在Platform/Platform.mk修改mk檔,將driver及wpa_supplicant.conf包進image
    PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/XXXu_sta.ko:system/XXXu_sta.ko \
    $(LOCAL_PATH)/XXXu_sta_util.ko:system/XXXu_sta_util.ko \
    $(LOCAL_PATH)/XXXu_sta_net.ko:system/XXXu_sta_net.ko \
    $(LOCAL_PATH)/XXXSTA.dat:system/XXXSTA.dat \
    $(LOCAL_PATH)/wpa_supplicant.conf:data/wpa_supplicant.conf \


6. wpa_supplicant.conf寫法如下
    update_config=1
    ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
    eapol_version=1
    ap_scan=1
    fast_reauth=1


7. 在BoardConfig.mk修改WiFi設定如下
    # This enables the wpa wireless driver
    #BOARD_WPA_SUPPLICANT_DRIVER := NL80211
    BOARD_WPA_SUPPLICANT_DRIVER := WEXT
    #BOARD_WPA_SUPPLICANT_PRIVATE_LIB ?= private_lib_driver_cmd
    WPA_SUPPLICANT_VERSION := VER_0_5_X

P.S. Driver是搭配WPA_SUPPLICANT VER_0_5_X版本

8. 在platform_defconfig設定相關所需要用到的config,如wext

9. 在init.rc載入driver module
    insmod system/XXXu_sta_util.ko
    insmod system/XXXu_sta.ko
    insmod system/XXXu_sta_net.ko


    mkdir /data/misc 01771 system misc
    # give system access to wpa_supplicant.conf for backup and restore
    mkdir /data/misc/wifi 0770 wifi wifi
    mkdir /data/misc/wifi/sockets 0770 wifi wifi
    mkdir /data/system 0771 system system
    mkdir /data/system/wpa_supplicant 0771 wifi wifi
    chmod 0771 /data/system/wpa_supplicant
    chown wifi wifi /data/misc/wifi/wpa_supplicant.conf   
    chmod 0660 /data/misc/wifi/wpa_supplicant.conf
    chown wifi wifi /data/wpa_supplicant.conf   
    chmod 0660 /data/wpa_supplicant.conf

10. 因為WiFi driver是走libhardware_legacy架構,wifi.c需要做對應修改
  • 修正相關檔案路徑
static const char SUPP_CONFIG_FILE[]    = "/data/wpa_supplicant.conf";
  • 因為已在init.rc載入driver,所以直接return 1
int is_wifi_driver_loaded() {
... ... ...
... ... ...
... ... ...
#ifdef WIFI_DRIVER_MODULE_PATH
... ... ...
... ... ...
... ... ...
#else
    return 1;
#endif

}
  • 已經定義了ctrl_interface=,所以code裡拿掉
int update_ctrl_interface(const char *config_file) {
... ... ...
... ... ...
... ... ...

    if (!strcmp(config_file, SUPP_CONFIG_FILE)) {
        property_get("wifi.interface", ifc, WIFI_TEST_INTERFACE);
    } else {
        strcpy(ifc, CONTROL_IFACE_PATH);
    }
#if 0
    if ((sptr = strstr(pbuf, "ctrl_interface="))) {
        char *iptr = sptr + strlen("ctrl_interface=");
        int ilen = 0;
        int mlen = strlen(ifc);
        int nwrite;
        if (strncmp(ifc, iptr, mlen) != 0) {
            LOGE("ctrl_interface != %s", ifc);
            while (((ilen + (iptr - pbuf)) < nread) && (iptr[ilen] != '\n'))
                ilen++;
            mlen = ((ilen >= mlen) ? ilen : mlen) + 1;
            memmove(iptr + mlen, iptr + ilen + 1, nread - (iptr + ilen + 1 - pbuf));
            memset(iptr, '\n', mlen);
            memcpy(iptr, ifc, strlen(ifc));
            destfd = open(config_file, O_RDWR, 0660);
            if (destfd < 0) {
                LOGE("Cannot update \"%s\": %s", config_file, strerror(errno));
                free(pbuf);
                return -1;
            }
            write(destfd, pbuf, nread + mlen - ilen -1);
            close(destfd);
        }
    }
#endif

    free(pbuf);
    return 0;
}

11. 利用dmesg、logcat、netcfg、wpa_supplicant及wpa_cli觀看並除錯

12. WiFi正常運作了

P.S. 如果在Android看不到WiFi選項,請做下面的步驟
  • 在裝置的/system/etc/permissions中會列出裝置支援的設備
  • 相關設備支援檔案放在本機的frameworks/base/data/etc
  • 要支援WiFi,
將本機frameworks/base/data/etc下的android.hardware.wifi.xml
放置到裝置/system/etc/permissions

2014年2月26日 星期三

Android WiFi架構

1. wpa_supplicant - 用來控制WiFi的daemon
2. Java Frameworks
    frameworks/base/services/java/com/android/server/wifi/
    frameworks/base/wifi/java/android/net/wifi/
3. JNI
    frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4. Legacy HAL(不同於stub HAL)
    hardware/libhardware_legacy/wifi/
5. wlan.ko - WiFi driver module
    wpa_supplicant透由wireless_ext(wext)與driver溝通

2014年2月18日 星期二

找你的Android Phone

之前都是用其他APP來找自己的Android Phone
或是遠端控制權限~~~
在很久之前Google就完成了官方的功能
能定位、更改鎖定方式、甚至移除資料,
以保護手機資料不外洩~
可以上網測試定位與鎖定功能,但是沒法測試移除資料的功能,要重建資料太麻煩了 @@
只能相信它是有用的 ><
Find your lost phone with Android Device Manager

Android Device Manager
在手機上要開啟裝置管理員中Android裝置管理員的選項
在Android Device Manager網頁用Google帳號登錄即可

大家一起來保護手機 ^^

2014年2月17日 星期一

Android HAL與Framework




看了這篇轉:Android HAL實例解析,終於是比較了解Android的HAL、Framework了。


HAL - 有libhardware_legacylibhardware兩種,像WiFi就是
          libhareware_legacy的一種,RIL也是HAL的一種。
Framework - Service及Manager皆屬於此層,有點類似Windows API
JNI - 因為HAL是C code,而Framework是Java code,中間透過JNI做橋接

2014年2月7日 星期五

安裝x86 Android 4.0開發環境

  1. sudo apt-get install python (>2.6)
  2. sudo apt-get install make (>3.81)
  3. sudo apt-get install git
  4. sudo apt-get install curl
  5. sudo apt-get install libc6:i386 (Ubuntu 13.10)
  6. sudo apt-get install libstdc++6:i386 (Ubuntu 13.10)
  7. sudo apt-get install libncurses5:i386 (Ubuntu 13.10)
  8. sudo apt-get install zlib1g:i386 (Ubuntu 13.10)
  9. sudo apt-get install ia32-libs (Ubuntu 12.04)
  10. sudo apt-get install gcc-4.4 g++-4.4 gcc-4.4-multilib g++-4.4-multilib
  • cd /usr/bin
  • sudo rm –f gcc
  • sudo ln –s gcc-4.4 gcc
  • sudo rm –f g++
  • sudo ln –s g++-4.4 g++
P.S. 可額外安裝下面package
       sudo apt-get install gnupg flex bison zip
       sudo apt-get install gperf build-essential git-core
       x11proto-core-dev libx11-dev libx11-dev:i386 lib32readline6-dev
       lib32readline6-dev:i386 lib32z1-dev libgl1-mesa-dev libgl1-mesa-glx:i386
       mingw32 tofrodos python-markdown libxml2-utils

安裝Java
  1. wget --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F" http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin
  2. chmod u+x jdk-6u45-linux-x64.bin
  3. ./jdk-6u45-linux-x64.bin
  4. sudo mv jdk1.6.0_45 /opt
  5. sudo update-alternatives --install "/usr/bin/jar" "jar" "/opt/jdk1.6.0_45/bin/jar" 1
  6. sudo update-alternatives --install "/usr/bin/java" "java" "/opt/jdk1.6.0_45/bin/java" 1
  7. sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/jdk1.6.0_45/bin/javac" 1
  8. sudo update-alternatives --install "/usr/bin/javadoc" "javadoc" "/opt/jdk1.6.0_45/bin/javadoc" 1
  9. sudo update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so" "mozilla-javaplugin.so" "/opt/jdk1.6.0_45/jre/lib/amd64/libnpjp2.so" 1
  10. sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/jdk1.6.0_45/bin/javaws" 1
  11. sudo update-alternatives --config jar
  12. sudo update-alternatives --config java
  13. sudo update-alternatives --config javac
  14. sudo update-alternatives --config javadoc
  15. export _JAVA_HOME=/opt/jdk1.6.0_45/
安裝repo
  1. mkdir ~/bin
  2. PATH=~/bin:$PATH
  3. curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
  4. chmod a+x ~/bin/repo

2014年1月29日 星期三

Android使用adb工具更改唯讀目錄權限


存取/system,顯示為read only
利用adb工具重新mount為R/W

adb shell mount -o remount rw /system

讓Android支援某一設備


在裝置的/system/etc/permissions中會列出裝置支援的設備

相關設備支援檔案放在本機的frameworks/base/data/etc

例如想要支援WiFi,
將本機frameworks/base/data/etc下的android.hardware.wifi.xml
放置到裝置/system/etc/permissions
即可支援WiFi

觀看與設定Android Native Service



getprop|grep init

setprop

2014年1月23日 星期四

使用wpa_supplicant

wpa_supplicant -Dwext -iwlan0 -C/data/system/wpa_supplicant -c /data/misc/wifi/wpa_supplicant.conf -d
wpa_cli -p/data/system/wpa_supplicant -iwlan0

wpa_cli list_network
wpa_cli add_network
wpa_cli remove_network
wpa_cli scan
wpa_cli scan_relults
help

Example:
WPA/WPA2 TKIP/AES

wpa_cli -iwlan0 add_network 1
wpa_cli -iwlan0 set_network 1 ssid '"SSID"'
wpa_cli -iwlan0 set_network 1 key_mgmt WPA-PSK
wpa_cli -iwlan0 set_network 1 psk /"PASSWORD"'
wpa_cli -iwlan0 set_network 1 pairwise CCMP TKIP
wpa_cli -iwlan0 set_network 1 group CCMP TKIP
wpa_cli -iwlan0 set_network 1 proto WPA RSN
wpa_cli -iwlan0 enable_network 1

將檔案包進Android image內


device/"vendor"/"platfrom"下有個"platform".mk
裡面會定義file copy
可新增自己的檔案進去

PRODUCT_COPY_FILES += \
   ...
   ...
   ...

透由ethernet使用adb

因為x86平台並無USB client or OTG不能使用USB adb
改用ethernet

設定好PC IP與device IP,並確認可以互ping

adb connect device_IP
連上後可使用
adb push <local file> <remote file>
adb shell

切斷連線
adb disconnect device_IP

2013年11月19日 星期二

安裝Android開發環境

參考Initializing a Build Environment

  1. Python 2.6 -- 2.7
  2. GNU Make 3.81 -- 3.82
  3. JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older
  4. Git 1.7 or newer
  • #apt-get install python
  • #apt-get install make
  • Ubuntu Java help
    #wget --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F" http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin
    #chmod u+x jdk-6u45-linux-x64.bin
    #./jdk-6u45-linux-x64.bin
    #mv jdk1.6.0_45 /opt
    #update-alternatives --install "/usr/bin/jar" "jar" "/opt/jdk1.6.0_45/bin/jar" 1
    #update-alternatives --install "/usr/bin/java" "java" "/opt/jdk1.6.0_45/bin/java" 1
    #update-alternatives --install "/usr/bin/javac" "javac" "/opt/jdk1.6.0_45/bin/javac" 1
    #update-alternatives --install "/usr/bin/javadoc" "javadoc" "/opt/jdk1.6.0_45/bin/javadoc" 1
    #update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so" "mozilla-javaplugin.so" "/opt/jdk1.6.0_45/jre/lib/amd64/libnpjp2.so" 1
    #update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/jdk1.6.0_45/bin/javaws" 1
    #update-alternatives --config jar
    #update-alternatives --config java
    #update-alternatives --config javac
    #update-alternatives --config javadoc
    #export _JAVA_HOME=/opt/jdk1.6.0_45/
  • #apt-get install gcc-4.4 g++-4.4 gcc-4.4-multilib g++-4.4-multilib
  • #cd /usr/bin
    #rm –f gcc; ln –s gcc-4.4 gcc
    #rm –f g++; ln –s g++-4.4 g++
  • #apt-get install git git-core gnupg flex bison gperf build-essential zip curl libc6-dev lib32ncurses5-dev libncurses5-dev:i386 ia32-libs x11proto-core-dev libx11-dev libx11-dev:i386 lib32readline5-dev libreadline6-dev:i386 lib32z-dev libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev zlib1g-dev:i386
  • #ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so (Ubuntu-10.10)

2013年11月14日 星期四

Android WLAN連線方式

  1. ./wpa_supplicant -Dwext -iwlan0 -c wpa_supplicant.conf -d
  2. 搜尋AP
    iwlist wlan0 scan
  3. 連線至AP
    iwconfig wlan0 essid "APSSID"

Android 3G Dongle PPP撥號測試

使用.chat文件來撥號

TIMEOUT 10
ABORT 'BUSY'
ABORT 'NO ANSWER'
ABORT 'ERROR'
SAY 'Starting GPRS connect script\n'
""'ATZ'
SAY 'Setting APN\n'
OK 'AT+CGDCONT=1,"IP","internet"'
ABORT 'NO CARRIER'
SAY 'Dialing...\n'
OK 'ATD*99***1#'
CONNECT

CyanogenMod ROM

    CyanogenMod好像release手機ROM耶,我的Xperia V一直沒有升級的ROM,是不是該來刷CyanogenMod ROM看看,來支援Android 4.2 ><

2013年8月15日 星期四

Compiler Android發生JDK版本錯誤問題

由於預設的安裝路徑已經找不到"sun-java6-jdk"可以安裝了~~~
手動下載安裝又很麻煩~~~
就使用預設的"openjdk-6-jre"來用~~~
apt-get install openjdk-6-jre
雖然安裝很方便,但compiler時會有問題~~~

會出現下面的錯誤
Your version is: java version "1.6.0_27"
The correct version is: Java SE 1.6

直接把確認版本的code mask即可~~~
目前compiler後還沒有問題發生~~~

在你BSP路徑下的build/core/main.mk

# Check for the correct version of java
#java_version := $(shell java......
#ifneq ($(shell java......
#......
#......
#$(info......
#$(error stop)
#endif

安裝Android開發環境

參考Initializing a Build Environment http://source.android.com/source/initializing.html