轉載自更夜
[筆記]Android emulator常用指令與技巧
1. 切換 Layout為 Landscape or Protrait: Ctrl + F11 or Ctrl + F12
2. 模擬網路 ON/OFF: F8
3. 模擬有電話打進來的情形: 開兩個模擬器即可互打,電話號碼就是模擬器上的 5554, 5556 etc。
4. 把檔案放到 emu 的 sdcard 或系統目錄
adb push my_song.mp3 /sdcard/my_song.mp3
5. 從 emu 把檔案 copy出來
adb pull /data/data/com.example.android.notepad/databases/note_pad.db note_pad.db
6. 安裝 apk 到 emu 上
adb install c:/android-apk/myapp.apk
7. 進入 emu 的 shell ,可執行 ls, rm 等動作,有root權
adb shell
8. 進入sqlite3 shell,先進入 shell之後
# sqlite3 /data/data/com.example.android.notepad/databases/note_pad.db
以上指令如果在開啟了超過一個模擬器的狀態下,必須指定要針對哪個模擬器
adb -s emulator-5554 shell
列出所有模擬器代號:
adb devices
附註: SQLite資料檔可以使用 push pull 拉到 emu外來使用輔助工具 SQLite Database Browser 來瀏覽或管理,對開發很有幫助。
2011年4月26日 星期二
2010年12月2日 星期四
android 置入external library (.jar)
在eclipse裡面當想要置入額外的library,比如說google library或是別人自己製造的library
使得程式不會出現error,
1.在package explorer裡面點選想要的專案按右鍵,找最下面的properties
2.再找到Java Build Path,
3.Add External JARs
之後找到想要新增加的.jar檔就可以新增library了
快瘋掉,每天都在尋寶要怎樣作
再一次的被搞死
使得程式不會出現error,
1.在package explorer裡面點選想要的專案按右鍵,找最下面的properties
2.再找到Java Build Path,
3.Add External JARs
之後找到想要新增加的.jar檔就可以新增library了
快瘋掉,每天都在尋寶要怎樣作
再一次的被搞死
2010年8月20日 星期五
2010年6月2日 星期三
The Javadoc for this element could neither be found in the attached source nor the attached Javadoc.
When building the Android SDK using the Eclipse. You will find that using "tooltip description " is not showing the Java document in Eclipse by hovering the mouse over the method. Note that you will find descriptions " The Javadoc for this element could neither be found in the attached source nor the attached Javadoc."
Solving the problem: go back to the "Available packages" tabs of the AVD manager(which is the SDK device manager in Eclipse) and install the doc package.
done!
搞不懂為什麼我要寫英文......
Solving the problem: go back to the "Available packages" tabs of the AVD manager(which is the SDK device manager in Eclipse) and install the doc package.
done!
搞不懂為什麼我要寫英文......
2010年5月7日 星期五
Android2.1 Message 從頂層到底層架構flow(2)
媽的我這樣寫真是前無古人後無來者
來吧,上面的framework丟到parcel裡面去
RILRequest初始化的時候,會連接名為rild的socket(也就是rild中s_listen_event綁定的socket),初始化數據傳輸的通道.
rr.mp 是Parcel對象,Parcel是一套簡單的序列化協議,用於將對象(或對象的成員)序列化成字節流,以供傳遞參數之用.這裡可以看到String address和int clirMode都是將依次序列化的成員.在這之前,rr初始化的時候,request號跟request的序列號(自動生成的遞增數),已經成為頭兩個 將被序列化的成員.這為後面的request解析打下了基礎.
接下來是send到handleMessage的流程,send將rr直接傳遞給另 一個線程的handleMessage,handleMessage執行data = rr.mp.marshall()執行序列化操作, 並將data字節流寫入到rild socket.
csdn的opendroid專欄的GSM驅動模塊rild詳細分析
看看就好,從CSDN的opendroid專欄寫過來的上面那一段,不過他是寫dial流程啦,message我還沒寫呢!正要開始,看官注意了!
進入
hardware/ril/libril/ril_event.cpp
------->
n = select(nfds, &rfds, NULL, NULL, ptv);
------->
firePending();
------->
ev->func(ev->fd, 0, ev->param);
------->
ev->func = func;
------->
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param)
------>
hardware/ril/libril/ril.cpp
------->
static void listenCallback (int fd, short flags, void *param)
上面階段都是listenCallback在調用的=="
------->
ril_event_set (&s_commands_event, s_fdCommand, 1,processCommandsCallback, p_rs);
------->
static void processCommandsCallback(int fd, short flags, void *param)
------->
processCommandBuffer(p_record, recordlen);
------->
RequestInfo *pRI
------->
typedef struct RequestInfo {
int32_t token; //this is not RIL_Token
CommandInfo *pCI;
struct RequestInfo *p_next;
char cancelled;
char local; // responses to local commands do not go back to command process
} RequestInfo;
------->
這裡的pRI就是一個RequestInfo結構指針, 從socket過來的數據流, 前面提到是Parcel處理過的序列化字節流, 這裡會通過反序列化的方法提取出來. 最前面的是request號, 以及token域(request的遞增序列號). 我們更關注這個request號, 前面提到, 上層和rild之間, 這個號是統一的. 它的定義是一個包含ril_commands.h的枚舉, 在ril.cpp中
------->
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
------->
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;
------->
pRI->pCI->dispatchFunction(p, pRI);
對照表在ril_commands.h
找我們message的
{RIL_REQUEST_SEND_SMS, dispatchStrings, responseSMS}
走dispatchStrings
------->
static void dispatchString (Parcel& p, RequestInfo *pRI)
------->
s_callbacks.onRequest(pRI->pCI->requestNumber, string8, sizeof(char *), pRI)
------->
/hardware/ril/reference-ril/reference-ril.c
------->
onRequest (int request, void *data, size_t datalen, RIL_Token t)
------->
case RIL_REQUEST_SEND_SMS:
requestSendSMS(data, datalen, t);
break;
------->
requestSendSMS(void *data, size_t datalen, RIL_Token t)
------->
hardware/ril/reference-ril/atchannel.c
------->
at_send_command_sms(cmd1, cmd2, "+CMGS:", &p_response);
------->
at_send_command_full
------->
at_send_command_full_nolock
------->
err = writeline (command);
寫下去吧= =
------->
written = write (s_fd, s + cur, len - cur);
=======>
tired= =..
來吧,上面的framework丟到parcel裡面去
RILRequest初始化的時候,會連接名為rild的socket(也就是rild中s_listen_event綁定的socket),初始化數據傳輸的通道.
rr.mp 是Parcel對象,Parcel是一套簡單的序列化協議,用於將對象(或對象的成員)序列化成字節流,以供傳遞參數之用.這裡可以看到String address和int clirMode都是將依次序列化的成員.在這之前,rr初始化的時候,request號跟request的序列號(自動生成的遞增數),已經成為頭兩個 將被序列化的成員.這為後面的request解析打下了基礎.
接下來是send到handleMessage的流程,send將rr直接傳遞給另 一個線程的handleMessage,handleMessage執行data = rr.mp.marshall()執行序列化操作, 並將data字節流寫入到rild socket.
csdn的opendroid專欄的GSM驅動模塊rild詳細分析
看看就好,從CSDN的opendroid專欄寫過來的上面那一段,不過他是寫dial流程啦,message我還沒寫呢!正要開始,看官注意了!
進入
hardware/ril/libril/ril_event.cpp
------->
n = select(nfds, &rfds, NULL, NULL, ptv);
------->
firePending();
------->
ev->func(ev->fd, 0, ev->param);
------->
ev->func = func;
------->
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param)
------>
hardware/ril/libril/ril.cpp
------->
static void listenCallback (int fd, short flags, void *param)
上面階段都是listenCallback在調用的=="
------->
ril_event_set (&s_commands_event, s_fdCommand, 1,processCommandsCallback, p_rs);
------->
static void processCommandsCallback(int fd, short flags, void *param)
------->
processCommandBuffer(p_record, recordlen);
------->
RequestInfo *pRI
------->
typedef struct RequestInfo {
int32_t token; //this is not RIL_Token
CommandInfo *pCI;
struct RequestInfo *p_next;
char cancelled;
char local; // responses to local commands do not go back to command process
} RequestInfo;
------->
這裡的pRI就是一個RequestInfo結構指針, 從socket過來的數據流, 前面提到是Parcel處理過的序列化字節流, 這裡會通過反序列化的方法提取出來. 最前面的是request號, 以及token域(request的遞增序列號). 我們更關注這個request號, 前面提到, 上層和rild之間, 這個號是統一的. 它的定義是一個包含ril_commands.h的枚舉, 在ril.cpp中
------->
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
------->
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;
------->
pRI->pCI->dispatchFunction(p, pRI);
對照表在ril_commands.h
找我們message的
{RIL_REQUEST_SEND_SMS, dispatchStrings, responseSMS}
走dispatchStrings
------->
static void dispatchString (Parcel& p, RequestInfo *pRI)
------->
s_callbacks.onRequest(pRI->pCI->requestNumber, string8, sizeof(char *), pRI)
------->
/hardware/ril/reference-ril/reference-ril.c
------->
onRequest (int request, void *data, size_t datalen, RIL_Token t)
------->
case RIL_REQUEST_SEND_SMS:
requestSendSMS(data, datalen, t);
break;
------->
requestSendSMS(void *data, size_t datalen, RIL_Token t)
------->
hardware/ril/reference-ril/atchannel.c
------->
at_send_command_sms(cmd1, cmd2, "+CMGS:", &p_response);
------->
at_send_command_full
------->
at_send_command_full_nolock
------->
err = writeline (command);
寫下去吧= =
------->
written = write (s_fd, s + cur, len - cur);
=======>
tired= =..
Android2.1 Message 從頂層到底層架構flow(1)
今天終於有空來寫下message的心得了
忙碌了好久....這篇大家可以轉貼只不過要標示下作者.
在android2.1/package/apps/Mms//src/com/android/mms/ui/ComposeMessageActivity.java
下面有mSendButton就從這邊開始吧,這邊就是系統裡面的message這個application的send按鈕.
從Interface Methods 往下看進入confirmSendMessageIfNeeded().---->sendMessage(true).
接下來在ComposeMessageActivity裡面的sendMessage的mWorkingMessage.send()進入android/mms/data/WorkingMessage.java的send()裡面可以看到prepareForSave確保文字以拷貝.如果是短信的話,就直接跑sendSmsWorker()調用SmsMessageSender sender.sendMessage(threadID).可以看到的是SmsMessagSender在Mms/transaction/SmsMessageSender的路徑.在sendMessage的函數中可以看到有切割的方法在最後面的smsManager.sendMultipartTextMessage()可以看到把message傳到framework傳出去.
接下來到framework
frameworks/base/telephony/java/android/teleph/SmsManager.java
------->
sendTextMessage(destinationAddress,scAddress,parts.get(0),
sentIntent, deliveryIntent);
------->
iccISms.sendText(destinationAddress, scAddress, joshlinkingutf, sentIntent, deliveryIntent);(預設是跑gsmˊˋ)
=======>
frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
------->
sendText(String destAddr, String scAddr, String text,PendingIntent sentIntent, PendingIntent deliveryIntent)
------->
sendRawPdu(pdu.encodedScAddress, text.getBytes(), sentIntent, deliveryIntent);
------->
frameworks/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java
------->
sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,PendingIntent deliveryIntent)
------->
sendSms(tracker);
------->
mCm.sendSMS(IccUtils.bytesToHexString(smsc),joshlinkingbytesToString, reply);
------->
/frameworks/base/telephony/java/com/android/internal/telephony/RIL.java
------->
sendSMS (String smscPDU, String pdu, Message result)
------->
RILRequest rr= RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);
(rr是以RIL_REQUEST_SEND_SMS為request號而申請的一個RILRequest對象.這個request號在java框架和rild庫中共享(參考RILConstants.java中這些值的由來,下面hardware/ril用這個command來判斷要作什麼)
send(rr);
------->
send(RILRequest rr)
------->
mSender.obtainMessage(EVENT_SEND, rr);
------->
RILSender mSender;
------->
class RILSender extends Handler implements Runnable;
------->
case EVENT_SEND:
------->
s = mSocket;(開到hardware/ril的socket)
先到這邊吧好累,下去就是c++了還有c
忙碌了好久....這篇大家可以轉貼只不過要標示下作者.
在android2.1/package/apps/Mms//src/com/android/mms/ui/ComposeMessageActivity.java
下面有mSendButton就從這邊開始吧,這邊就是系統裡面的message這個application的send按鈕.
從Interface Methods 往下看進入confirmSendMessageIfNeeded().---->sendMessage(true).
接下來在ComposeMessageActivity裡面的sendMessage的mWorkingMessage.send()進入android/mms/data/WorkingMessage.java的send()裡面可以看到prepareForSave確保文字以拷貝.如果是短信的話,就直接跑sendSmsWorker()調用SmsMessageSender sender.sendMessage(threadID).可以看到的是SmsMessagSender在Mms/transaction/SmsMessageSender的路徑.在sendMessage的函數中可以看到有切割的方法在最後面的smsManager.sendMultipartTextMessage()可以看到把message傳到framework傳出去.
接下來到framework
frameworks/base/telephony/java/android/teleph/SmsManager.java
------->
sendTextMessage(destinationAddress,scAddress,parts.get(0),
sentIntent, deliveryIntent);
------->
iccISms.sendText(destinationAddress, scAddress, joshlinkingutf, sentIntent, deliveryIntent);(預設是跑gsmˊˋ)
=======>
frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
------->
sendText(String destAddr, String scAddr, String text,PendingIntent sentIntent, PendingIntent deliveryIntent)
------->
sendRawPdu(pdu.encodedScAddress, text.getBytes(), sentIntent, deliveryIntent);
------->
frameworks/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java
------->
sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,PendingIntent deliveryIntent)
------->
sendSms(tracker);
------->
mCm.sendSMS(IccUtils.bytesToHexString(smsc),joshlinkingbytesToString, reply);
------->
/frameworks/base/telephony/java/com/android/internal/telephony/RIL.java
------->
sendSMS (String smscPDU, String pdu, Message result)
------->
RILRequest rr= RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);
(rr是以RIL_REQUEST_SEND_SMS為request號而申請的一個RILRequest對象.這個request號在java框架和rild庫中共享(參考RILConstants.java中這些值的由來,下面hardware/ril用這個command來判斷要作什麼)
send(rr);
------->
send(RILRequest rr)
------->
mSender.obtainMessage(EVENT_SEND, rr);
------->
RILSender mSender;
------->
class RILSender extends Handler implements Runnable;
------->
case EVENT_SEND:
------->
s = mSocket;(開到hardware/ril的socket)
先到這邊吧好累,下去就是c++了還有c
訂閱:
文章 (Atom)