Android行動裝置的工廠測試程式開發

來源:互聯網
上載者:User

我設計的工廠測試載入器是CS結構的,在裝置端會有一個Server,再PC端會有一個Client,兩者進行互動完成測試。

通訊方式選擇:
1.Stocket:優點是不基於ADB,可以自己定義介面,相對穩定,在Android2.3以前似乎多數的測試載入器都是使用這個方式,需要在裝置端跑起來一個S程式,等待接收命令。
2.ADB:優點方便,直接移植過來Android的ADBD的程式即可,加一些傳輸的資訊的D-CODE以及P-CODE即可,在Android2.3以後ADB逐漸穩定,我覺得使用這種方式更加方便。

PC端:視窗設計需要簡明,簡單,按鈕大,方便工廠測試工人的操作;與工廠產線的介面需要開放,擴充性好。(推薦使用VC開發)

裝置端:設計需要擴充性強,穩定,(使用C開發)

我主要做的裝置端,就說說裝置端的設計吧:

先確定你需要測試的模組,在確定你需要測試模組的相關功能,這樣把每個模組分開,可以盡量的模組之間的幹擾。

main.h

 
  1. #define CMD(cmd) extern int cmd##_main(char**, int, char*);
  2. #include<DefineCommand.h>
  3. #undef CMD

  4. typedef int (*mode_main_func)(char** argv, int argc, char* send_buff);

  5. typedef struct _MODE
  6. {
  7. char* name;
  8. mode_main_func main_func;
  9. } MODE;

  10. MODE g_ModeTable[] = {
  11. #define CMD(cmd) { #cmd, cmd##_main },
  12. #include<DefineCommand.h>
  13. #undef CMD
  14. };
DefineCommand.h
 
  1. CMD(bt)
  2. CMD(wifi)
  3. CMD(nfc)
  4. CMD(fm)
  5. CMD(audio)
  6. CMD(headset)
  7. CMD(mic)
  8. CMD(speaker)
  9. CMD(camera)
  10. CMD(gps)
  11. CMD(touch)
  12. CMD(rtc)
  13. CMD(vibrator)
  14. CMD(imei)
  15. CMD(battery)
  16. CMD(charging)
  17. CMD(g_sensors)
  18. CMD(p_sensors)
  19. CMD(l_sensors)
  20. CMD(led)
  21. CMD(lcd)
  22. CMD(keypad)
  23. CMD(modem)
  24. CMD(sd)
  25. CMD(hdmi)
  26. CMD(small_camera)
  27. CMD(lcd_back_light)
  28. CMD(camera_flash)
main.c
 
  1. MODE* getMode(char* mode);

  2. int main(int argc, char **argv)
  3. {
  4. int ret = 0;
  5. MODE* tMode = NULL;
  6. char* mode_name = (char *)malloc(MODE_SIZE); //模組名稱
  7. char* func_name = (char *)malloc(FUNC_SIZE); //模組測試功能名稱
  8. char* send_buff = (char *)malloc(MAXBUFF);
  9. int func_val = -1, func_argc= 0;

  10. if (argc < ARGC_NUM) {
  11. //TCMD_LOGE(mode_name, func_name, COMMAND_ARGC_ERROR);
  12. return COMMAND_ARGC_ERROR;
  13. }

  14. stpcpy(mode_name, argv[1]);
  15. stpcpy(func_name, argv[2]);
  16. func_argc = argc - 3;

  17. tMode = getMode(mode_name);

  18. if (tMode) {

  19. func_val = tMode->main_func(argv, func_argc, send_buff);

  20. switch (func_val)
  21. {
  22. case COMMAND_UNDEFINE_FUNC:
  23. //TCMD_LOGE(mode_name, func_name, COMMAND_UNDEFINE_FUNC);
  24. ret = COMMAND_UNDEFINE_FUNC;
  25. break;
  26. case COMMAND_ARGC_ERROR:
  27. //TCMD_LOGE(mode_name, func_name, COMMAND_ARGC_ERROR);
  28. ret = COMMAND_ARGC_ERROR;
  29. break;
  30. case COMMAND_EXEC_FAILE:
  31. //TCMD_LOGE(mode_name, func_name, COMMAND_EXEC_FAILE);
  32. ret = COMMAND_EXEC_FAILE;
  33. case COMMAND_EXEC_SUCCESSFUL:
  34. //TCMD_LOGI(mode_name, func_name, "Successful.\n");
  35. ret = COMMAND_EXEC_SUCCESSFUL;
  36. break;
  37. default:
  38. //TCMD_LOGE(mode_name, func_name, COMMAND_UNKNOWN_ERROR);
  39. ret = COMMAND_UNKNOWN_ERROR;
  40. break;
  41. }

  42. } else {
  43. //TCMD_LOGE(mode_name, func_name,COMMAND_UNDEFINE_MODE);
  44. ret = COMMAND_UNDEFINE_MODE;
  45. }

  46. return ret;
  47. }
  48. MODE* getMode(char* name)
  49. {
  50. MODE* tMode = NULL;
  51. int i = 0;
  52. int mode_num = sizeof(g_ModeTable) / sizeof(MODE);

  53. for (; i < mode_num; ++i) {
  54. if(!strcmp(name, g_ModeTable[i].name)) {
  55. tMode = &g_ModeTable[i];
  56. TCMD_LOGD("Mode_table.name = %s", tMode->name);
  57. break;
  58. }

  59. }
  60. return tMode == NULL ? NULL : tMode;
  61. }
然後就進入到各個模組的的main中執行了,例子battery.c

 
  1. int battery_main(char** argv, int argc, char* send_buff)
  2. {
  3. int ret = 0;
  4. char* func_name = (char *)malloc(FUNC_SIZE);

  5. stpcpy(func_name, argv[2]);

  6. if(!strcmp(func_name, "--info"))
  7. ret = battery_read_info(argv, argc, send_buff);
  8. else
  9. ret = COMMAND_UNDEFINE_FUNC;

  10. return ret;
  11. }
分兩種的測試方式,一種是直接操作kernel提供的sys測試節點,比如Touch Sensor Battery Rtc都可以這樣搞,但是像Audio Camera BT/WIFI/GPS Modem這樣的大型模組就不太好這樣測試了,需要調用相關的測試模組,這樣就需要進程之間的通訊,我使用的recovery中recovery與updater之間的方式,pipefd。

舉例子,測試modem的時候:

 
  1. int modem_read_imsi(char** argv, int argc, char* send_buff)
  2. {
  3. int ret = 1;
  4. const char* binary = MODEM_ADAPTER;

  5. TCMD_LOGI(argv[1], argv[2], "Test to start...\n");

  6. if ( argc != MODEM_READ_IMSI_ARGC)
  7. ret = COMMAND_ARGC_ERROR;
  8. else {
  9. int pipefd[2];
  10. pipe(pipefd);

  11. const char** args = (const char**)malloc(sizeof(char*) * 4);
  12. args[0] = binary;
  13. args[1] = IMSI;
  14. char* temp = (char*)malloc(10);
  15. sprintf(temp, "%d", pipefd[1]);
  16. args[2] = temp;
  17. args[3] = NULL;

  18. ret = exec_binary(binary, args, pipefd[0], pipefd[1], send_buff);
  19. }
  20. return ret;
  21. }
  22. int modem_main(char** argv, int argc, char* send_buff)
  23. {
  24. int ret = 0;
  25. char* func_name = (char *)malloc(FUNC_SIZE);

  26. stpcpy(func_name, argv[2]);

  27. if(!strcmp(func_name, "--imei"))
  28. ret = modem_read_imei(argv, argc, send_buff);
  29. else if(!strcmp(func_name, "--ue_version"))
  30. ret = modem_read_uversion(argv, argc, send_buff);
  31. else if(!strcmp(func_name, "--imsi"))
  32. ret = modem_read_imsi(argv, argc, send_buff);
  33. else if(!strcmp(func_name, "--echo"))
  34. ret = modem_get_status(argv, argc, send_buff);
  35. else
  36. ret = COMMAND_UNDEFINE_FUNC;

  37. return ret;
  38. }

 
  1. int exec_binary(const char* binary, const char** cmd, int fb_p, int fb_c, char* send_buff)
  2. {
  3. pid_t pid = fork();

  4. if (pid == 0) {
  5. close(fb_p);
  6. execv(binary, (char* const*)cmd);
  7. _exit(-1);
  8. }
  9. close(fb_c);

  10. FILE* from_child = fdopen(fb_p, "r");
  11. int size = fread(send_buff, 1, MAXBUFF, from_child);
  12. if ( size <= 0)
  13. return COMMAND_EXEC_FAILE;

  14. int status;
  15. waitpid(pid, &status, 0);
  16. if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
  17. return COMMAND_EXEC_FAILE;

  18. return COMMAND_EXEC_SUCCESSFUL;
  19. }
這樣設計的好處就是如果測試相關模組出現問題,不用修改測試載入器,直接更新模組的binary即可。
這就是我設計的工廠測試載入器,設計與開發大概不到2星期,相關模組的整合在一個月做完,但是由於公司項目黃了,沒有用到,但是我還是從中學習到了好多知識,感謝指導我思路的老宋,大牛!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.