完全解決Android模擬器中文短信亂碼問題java
給模擬器發送短信的過程:linux
DDMS/Telnet->console->Kernelandroid
發送短信致使亂碼的地方在兩個:windows
DDMS程序和consolesocket
短信亂碼問題的緣由:函數
中文短信是以ucs2編碼,存儲在pdu的usd區。google
而傳給系統的編碼非ucs2。編碼
第一步:spa
DDMS傳給console的是GBK編碼,console接收後前有底層統一轉成UTF-8編碼,至於爲何這裏就不說了!utf-8
DDMS最後是用socket與console進行交互。UI操做以命令傳給console;
默認發送時獲取字節碼的編碼是ISO-8859-1。
因此咱們作下修改:
用原來的編碼解碼而後編碼成爲GBK。經過adb發送出去。
console接收後由一個命令分發錶轉到sms_send
將字節碼從utf-8流中解析出來
這裏就出現了一個錯誤。漢字的UTF-8爲三個字節。在作第二個和第三個本身讀取前跳過了第二個。因此註釋掉
順便修改console發送時候的編碼函數
方法同上
最後的步驟是用發送者號碼和短信內容構建PDU短信;
smspdu_create_deliver_utf8-->smspdu_create_deliver-->gsm_rope_add_sms_deliver_pdu
咱們主要關注gsm_rope_add_sms_deliver_pdu就好了
在這個函數中:主要涉及到PDU編碼的知識,這個也不詳細敘述,想了解的能夠去百度;
根據代碼分析,google在用戶數據區前面多加了個長度信息。由於英文短信是從另一個分支處理的,因此不受影響!
修改方法如圖,註釋掉那段代碼!
OK,咱們流程都打通了,如今就須要編譯了。
編譯我也說一句吧,須要編譯模擬器emulator,sdk或者熟悉點的能夠只編譯ddms,而後拷貝到sdk。
好了,打完收工!你能夠用telnet鏈接模擬器:telnet localhost 5554->sms send 10086 你好!
或者在DDMS那裏發送,效果是同樣的!
涉及文件:
external\qemu\telephony\sms.c
external\qemu\android\console.c
sdk\ddms\libs\ddmlib\src\com\android\ddmlib\EmulatorConsole.java
轉載請說明出處!
發現不少博主轉載都把個人信息去掉了,太傷心了。
順便補充一句,這裏只是寫了linux的解決方案,windows須要在模擬器裏面轉碼。須要瞭解的請在這裏M我!