"ทุ่มเทอย่างสุดกำลัง เพื่อความฝันและวันข้างหน้า วันนี้เหนื่อยไม่ว่าถ้าหากมันทำให้มีวันหน้าที่สวยงามได้"
[Geek] บันทึกการทดลองพัฒนาแอพฯบน Tizen 2.3 + วิเคราะห์อนาคต
18 Jan 2015 23:48   [7154 views]

สัปดาห์ที่แล้วมีข่าวฮือฮาเกี่ยวกับมือถือ Tizen ตัวแรกของโลกอย่าง Samsung Z1 เตรียมวางจำหน่ายที่อินเดียในราคาราวๆ $90

ที่ฮือฮาก็เพราะเป็น Move แรกของซัมซุงอย่างเป็นทางการที่นอกใจแอนดรอยด์ ซึ่งส่วนตัวก็ติดตาม Tizen มาสักพัก พอเห็น Move นี้ก็เลยศึกษาลงลึกขึ้น เมื่อวานก็เลย Spend เวลาครึ่งวัน นั่งเล่น Tizen ดูทั้งแง่การใช้งานและการพัฒนา เลยเอามาเล่าให้ฟังครับ

ที่มาของ Tizen

กว่าจะมาเป็น Tizen อย่างทุกวันนี้ มันผ่านอะไรมาเยอะแยะมาก เอาคร่าวๆก็คือหลังจาก MeeGo อกหักจากโนเกียไป Intel ก็เลยแยกตัว MeeGo ของตัวเองออกมา แล้วหันไปจับมือกับซัมซุงที่มี Bada อยู่ตอนนั้น(และตายไปเป็นที่เรียบร้อย) ประกาศรวมตัว MeeGo (ที่ตัดส่วนของโนเกียออก) และ Bada เข้าด้วยกัน เปิดตัวเป็นโปรเจค Tizen นับแต่นั้นมา

สาเหตุที่ซัมซุงเตรียม Tizen ไว้ก็คือ การอยากได้ OS ของตัวเอง ควบคุมทุกอย่างได้ ไม่ใช่ OS ที่คนอื่นทำมาอย่างแอนดรอยด์

แต่นั่นก็นานมาแล้ว Tizen ทำท่าจะออกเป็นมือถือมาหลายรอบ แต่สุดท้ายก็เลื่อน เลื่อน เลื่อนและก็เลื่อน จริงๆจะบอกว่าแทบยกเลิกเลยก็ว่าได้ สาเหตุไม่ใช่เพราะอะไร ออกมาก็ขายไม่ออก ใครจะซื้อหละ ...

แต่ซัมซุงไม่ยอมแพ้ต่อ Tizen ดูยังมีแผนกับมันตลอดเวลา อย่างเช่นปีที่แล้ว Tizen ถูกนำไปใช้กับระบบ Embedded ทุกตัว ไม่ว่าจะเป็น TV, Wearable, Netbook ยันระบบในรถ ชัดเจนว่าซัมซุงต้องการจะใช้มันเป็น OS ที่รวมทุกผลิตภัณฑ์ของตัวเองไว้ด้วยกัน จะมีก็แค่มือถือแหละที่ไม่ชัดเจนสักทีว่าจะเอายังไง

จนกระทั่งสัปดาห์ที่แล้ว ซัมซุงก็ออก Tizen Phone ละ ...

ทำไมซัมซุงถึงลุย Tizen Phone ตอนนี้

ซัมซุงพยายามมานานแล้วที่จะดีดตัวเองออกจากแอนดรอยด์ เพราะถึงซัมซุงจะเป็นเบอร์หนึ่งเรื่องแอนดรอยด์อยู่ แต่ถ้าให้ Breakdown มาดูแล้ว ซัมซุงก็เป็นแค่คนผลิตมือถือขายเท่านั้น แต่อย่างอื่นซัมซุงไม่สามารถเข้าควบคุมหรือมีผลประโยชน์ใดๆเลย

พูดง่ายๆ ซัมซุงจะโดนคู่แข่งตีเมื่อไหร่ก็ได้ .... ซึ่ง .... ปีที่แล้วซัมซุงเพิ่งโดนแย่งเค้กไปเต็มๆจากแบรนด์ที่ไม่อยู่ในสายตาซัมซุงเลยอย่าง Xiaomi ที่เอาตลาดจีนไปทั้งประเทศ(ใหญ่นะ) อีกทั้งตลาดกลางก็โดนแบรนด์อื่นๆกินไปอย่างสนุก เช่น Asus ที่ออก Zenfone มาฆ่าทุกแบรนด์ ผลคือยอดขายและกำไรโดยรวมของ Samsung Mobile ตกฮวบไปกว่า 50% ทำเอาต้องรื้อองค์กรใหม่เลยทีเดียว

และเดาว่า Tizen Phone ก็คงเป็นหนึ่งในผลของการปรับ Strategy ครั้งนี้ หากยังเดินไปทางแอนดรอยด์ 100% ต่อไปอย่างก่อนหน้านี้ ก็เห็นอนาคตแล้วว่าคงจะเป็นที่หนึ่งได้อีกไม่นาน และหากเริ่มช้ากว่านี้ก็คงไม่ทันการณ์ละ Z1 จึงออกมา

โดย Segment ที่เริ่มเข้าตีโดย Z1 คือมือถือ Low-Mid End ในเลเวลเดียวกับ Android One (ซึ่งไม่ประสบความสำเร็จเท่าไหร่) เน้นตลาด Mass คืออินเดียเพื่อลองตลาดและผลักดันด้านนักพัฒนา

และ Z1 นี้มีการปรับเรื่อง OS เป็นที่เรียบร้อยเพื่อให้สนับสนุนแบบ Universal ไม่ใช่แค่ทำเพื่อมือถือ แต่ทำเพื่อทุกอุปกรณ์ ซึ่งเปลี่ยนได้ไม่นานมานี้เองใน Tizen 2.3 ถือว่า Strategy ชัดเจนมากเลยหละ

เมื่อวานก็เลยเริ่มลองพัฒนาแอพฯดูสักนิดสักหน่อย ได้ข้อมูลมาดังนี้ครับ

หน้าตาโดยรวม

UI ของ Tizen นี่ TouchWiz for Android มากๆ เพียงแต่ไม่มี Home Screen เปิดมาก็เป็นหน้าจอ Lock Screen พอ Unlock ก็จะเจอหน้าลิสต์ไอคอนแอพฯ

หากลากด้านบนลงมา ก็จะเป็น Notification Area เหมือนแอนดรอยด์ทุกประการ แทบแยก OS ไม่ออก

UI ก็ ... แบบเนี้ย

สรุปก็คือดูแอนดรอยด์มากๆ แต่หน้าตาค่อนข้างโบราณกว่า ... ส่วนตัวไม่ชอบ Look & Feel เลย

วิธีการพัฒนาแอพฯ

เครื่องมือสำหรับการพัฒนาแอพฯบน Tizen มีชื่อว่า Tizen SDK ใช้ฐาน IDE อยู่บน Eclipse เจ้าเก่า มาพร้อม Emulator ในแนว Android ที่รันโดยใช้ HAXM ช่วย แต่ก็ถือว่าไม่เร็วเท่าไหร่ แต่ก็ไม่ช้าจนอึดอัด ...

ดูจาก Emulator แล้วก็พบว่า Tizen มีขนาดหน้าจออยู่สองขนาดด้วยกันคือ 480x800 และ 720x1280 ซึ่งเป็นคนละ Ratio กัน แต่ข่าวดีคือถ้าเขียนถูกวิธี มันก็จะสเกลให้ดูดีได้บนทั้งสองหน้าจอ แต่หน้าตาจะเปลี่ยนไปเล็กน้อยเรื่องความสูงความยาว

การพัฒนาแอพฯทำได้สองภาษาดังนี้


Native Application

ก่อนหน้านี้ตอนเป็น Tizen 2.2 เรายังสามารถพัฒนาแอพฯด้วยภาษา C++ ใน OSP Framework แบบเดียวกับ Bada ทุกประการ (ต้องบอกว่าเหมือนเลยหละ เป๊ะๆ แค่เปลี่ยน namespace ให้เป็น Tizen แค่นั้น) โครงโค้ดสวยมาก วาง UI แบบลากวางได้เลย

แต่ถึงโค้ดจะสวย แต่จริงๆมันก็โบราณเกินไป ตัว C++ นี้จึงโดนถอดออกไปใน Tizen 2.3 แล้วแทนที่ด้วยภาษา C แบบดิบเถื่อนที่ดูแล้วไม่น่าจะทำมาให้มนุษย์เขียน ...

ตอนนี้เป็นเรื่องราวดราม่าอยู่เล็กๆสำหรับคนทำแอพฯ Tizen เพราะมีหลายคนทำ Native แบบเดิมมาจนจะเสร็จแล้ว แต่พอออกรุ่นแรกมาปั๊บ พี่เอาตัว Native นั้นออกหมดเลยจ้าาาาา 555 แล้วก็เสียบด้วย API ตัวใหม่หมดยกชุดแทน แบบ ... ไม่ได้แก้ตัวเก่าด้วยนะ นี่คือแทนด้วยตัวใหม่เลย (เริ่มมาก็ไล่แฟนๆ Tizen ที่เป็น Early Adopter ออกซะแล้ว อนาคตจะเป็นยังไงน้อ ...)

ถึงแม้จะเขียนทั้งแอพฯด้วยภาษา C ได้ แต่เอาเข้าจริงคงไม่มีทีมไหนทำ(ด้วยโครงสร้างทำแอพฯแบบดิบเถื่อนที่เห็นอยู่ตอนนี้) ประโยชน์ที่คงไว้คงเหลือแค่การเขียน Service เพื่อทำงานเป็นเบื้องหลัง และไว้ติดต่อกับ Web Application อีกทีมากกว่า

สาเหตุที่ทีมพัฒนา Tizen ตัดสินใจเอา C++ ตัวนั้นออกไปคือ C++ นั้นเดิมทีถูกสร้างมาบน Bada และมันไม่ได้วางไว้สำหรับ Embedded Device เกิดมาเพื่อโทรศัพท์มือถือเท่านั้น ซึ่งมันขัดกับ Strategy OS เดียวสำหรับทุกอุปกรณ์ของซัมซุง ก็เลยถูกถอดออกไปนั่นเอง ในขณะเดียวกัน ทีมพัฒนา Tizen ยืนยันว่าภาษา C ถูกออกแบบมาเพื่อให้ใช้ได้บนทุกอุปกรณ์ ดังนั้นไม่ต้องกังวลว่าจะมีปัญหา

นี่คือตัวอย่างโค้ดภาษา C ครับ

#include "hellonative.h"typedef struct appdata {	Evas_Object *win;	Evas_Object *conform;	Evas_Object *label;} appdata_s;static voidwin_delete_request_cb(void *data , Evas_Object *obj , void *event_info){	ui_app_exit();}static voidwin_back_cb(void *data, Evas_Object *obj, void *event_info){	appdata_s *ad = data;	/* Let window go to hide state. */	elm_win_lower(ad->win);}static voidcreate_base_gui(appdata_s *ad){	/* Window */	ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);	elm_win_autodel_set(ad->win, EINA_TRUE);	if (elm_win_wm_rotation_supported_get(ad->win)) {		int rots[4] = { 0, 90, 180, 270 };		elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);	}	evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);	eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);	/* Conformant */	ad->conform = elm_conformant_add(ad->win);	elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);	elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);	evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);	elm_win_resize_object_add(ad->win, ad->conform);	evas_object_show(ad->conform);	/* Label*/	ad->label = elm_label_add(ad->conform);	elm_object_text_set(ad->label, "Hello EFL");	evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);	elm_object_content_set(ad->conform, ad->label);	evas_object_show(ad->label);	/* Show window after base gui is set up */	evas_object_show(ad->win);}static boolapp_create(void *data){	/* Hook to take necessary actions before main event loop starts		Initialize UI resources and application's data		If this function returns true, the main loop of application starts		If this function returns false, the application is terminated */	appdata_s *ad = data;	create_base_gui(ad);	return true;}static voidapp_control(app_control_h app_control, void *data){	/* Handle the launch request. */}static voidapp_pause(void *data){	/* Take necessary actions when application becomes invisible. */}static voidapp_resume(void *data){	/* Take necessary actions when application becomes visible. */}static voidapp_terminate(void *data){	/* Release all resources. */}static voidui_app_lang_changed(app_event_info_h event_info, void *user_data){	/*APP_EVENT_LANGUAGE_CHANGED*/	char *locale = NULL;	system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);	elm_language_set(locale);	free(locale);	return;}static voidui_app_orient_changed(app_event_info_h event_info, void *user_data){	/*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/	return;}static voidui_app_region_changed(app_event_info_h event_info, void *user_data){	/*APP_EVENT_REGION_FORMAT_CHANGED*/}static voidui_app_low_battery(app_event_info_h event_info, void *user_data){	/*APP_EVENT_LOW_BATTERY*/}static voidui_app_low_memory(app_event_info_h event_info, void *user_data){	/*APP_EVENT_LOW_MEMORY*/}intmain(int argc, char *argv[]){	appdata_s ad = {0,};	int ret = 0;	ui_app_lifecycle_callback_s event_callback = {0,};	app_event_handler_h handlers[5] = {NULL, };	event_callback.create = app_create;	event_callback.terminate = app_terminate;	event_callback.pause = app_pause;	event_callback.resume = app_resume;	event_callback.app_control = app_control;	ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);	ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);	ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);	ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);	ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);	ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);	ret = ui_app_main(argc, argv, &event_callback, &ad);	if (ret != APP_ERROR_NONE) {		dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);	}	return ret;}

ไฟล์เดียวอยู่เลย Add UI ด้วยโค้ดเอา รันออกมาเป็นหน้าตาแบบนี้

หรือแอพฯซับซ้อนๆอย่างเครื่องคิดเลข ก็ทำด้วยภาษาซีเพียวๆได้ (700 บรรทัด) ซึ่ง ... อย่าไปดูโค้ดเลยนะ เดี๋ยวเห็นแล้วจะซึมเศร้าเอา ...

สรุปแล้วพอจะบอกได้ว่าซัมซุงน่าจะไม่เน้นแอพฯแบบ Native เลย แต่ที่เน้นหนักๆคงจะเป็นอีกตัว ... Web Application


Web Application

อีกภาษาที่ทำแอพฯบน Tizen ได้ และดูเป็นผู้เป็นคนที่สุดก็คือ HTML+CSS+Javascript โดยมี UI Framework ที่ใช้ชื่อว่า TAU (Tizen Advanced UI) โค้ดก็เป็น HTML ธรรมดาเลย แต่ด้วย TAU จึงทำให้สามารถเขียนแบ่งเป็นส่วนๆได้อย่างสวยงามโดยใช้ data-* ในการกำหนดค่าต่างๆ (data-role, data-position, etc.)

<!DOCTYPE html><html><head>	<meta name="viewport" content="width=device-width,user-scalable=no"/>	<script src="./lib/jquery.js"></script>	<script type="text/javascript" src="./lib/tau/mobile/js/tau.js" data-build-remove="false"></script>	<link rel="stylesheet"  href="./lib/tau/mobile/theme/default/tau.css">	<script src="./js/main.js"></script>	<title>Tizen Web IDE - Template - Tizen - Tizen Web UI Framework - Single-Page</title>	<link rel="stylesheet" type="text/css" href="./css/style.css"/></head><body>    <div data-role="page">        <div data-role="header" data-position="fixed">            <h1>Single-page application </h1>        </div><!-- /header -->        <div data-role="content">            <p>This is a single page boilerplate template that you can copy to build your first Tizen Web UI Framework page.</p>        </div><!-- /content -->    </div><!-- /page --></body></html>

ผลของโค้ดข้างบนออกมาเป็นแบบนี้

ก็ง่ายดีนะ ศึกษา TAU หน่อยว่าอะไรคืออะไร ก็เขียนได้ละ

ส่วนเรื่องของ Business Logic ก็เชื่อมด้วย Javascript ซึ่งบน Tizen เค้าเลือกใช้ jQuery Mobile เป็นโครงของ Javascript อ่านๆดูก็ ... โอเค้

หากอยากได้หน้าตาของตัวเอง ก็สามารถปรับโน่นปรับนี่ได้ด้วย CSS โดยตรงครับผม

เรื่อง Performance ของ UI เท่าที่ลองก็โอเคเลยนะครับ ลื่นอยู่ แต่ถ้าเป็นเรื่องของการรัน Logic ยังไงก็ช้าเพราะมันเป็น Javascript นั่นเอง


การพัฒนา Hybrid Application

เนื่องจากบางงานเราอาจจะต้องการการทำงานแบบ Native (เช่น Image Processing) บน Tizen ก็เลยเปิดช่องให้เราสามารถเขียนโค้ดบางส่วนไปรันด้วย Native ได้ แล้วใช้ Web Application สั่งเอา เราเรียกสิ่งนี้ว่า Hybrid Application ครับ

วิธีคือเขียนแอพฯด้วย Web Application ไป แล้วเขียนโค้ดภาษา C ในรูปแบบของ Service (โค้ด Native ที่ไม่มี UI) แล้วเราก็สามารถให้ Web App เรียกคำสั่งไปที่ Native Service ผ่าน Web Socket ได้

นี่เป็นตัวอย่างของ Hybrid Application ครับผม >> Multi-project Hybrid Application

การรันแอพฯแอนดรอยด์

หนึ่งในความพยายามของ OS หน้าใหม่ทุกตัว (ทุกตัวจริงๆ) ไม่ว่าจะเป็น Jolla เอย BB10 เอย รวมถึงตัวนี้ด้วย Tizen ก็คือความพยายามเริ่มต้นด้วยแอพฯที่มีอยู่ในโลกนับล้านแอพฯด้วยการเปิดให้สามารถลงแอพฯแอนดรอยด์ได้

แต่ด้วยตัว Tizen เอง จริงๆไม่สามารถลงได้ แต่ได้ความช่วยเหลือของ OpenMobile ก็จะลงได้ครับ น่าเสียดายที่ Emulator ลงทดสอบตรงนี้ไม่ได้ เอาวีดีโอชาวบ้านมาแปะให้ดูก่อนละกัน =)

ความคาดหวังตรงนี้ ... อย่าคาดหวังอะไรมาก ที่ผ่านมาไม่เวอร์คสักราย Strategy นี้ ...

วิเคราะห์อนาคตของ Tizen

เคยวิเคราะห์ไว้ใน Blog ก่อนหน้านี้แล้วว่า ตลาด Smartphone ไม่ต้องการ OS ที่สามแล้ว จากนี้ iOS และ Android จะครองโลกไปอีกนาน และไม่มีพื้นที่สำหรับ OS ที่สามแล้วไม่ว่าจะบน Segment ไหน

สิ่งที่ Mobile OS ใดๆจะไปรอดได้ระยะยาวๆไม่ใช่ Market Share แต่เป็นเรื่องความสมบูรณ์ของ Ecosystem ซึ่ง Apple และ Google ทำมาได้ดีมาก iOS และ Android จึงเติบโตอยู่อย่างตอนนี้

โดยส่วนตัวที่เคยเล่นโน่นนี่บน Samsung Phone ผมเชื่อเป็นอย่างยิ่งว่า Samsung ไม่น่าจะสามารถสร้าง Ecosystem ของตัวเองได้ ถึงจะพยายามอย่างสุดฤทธิ์ก็ตาม (ที่ผ่านมา Samsung พยายามมาตลอดด้วย Samsung Apps แต่ไม่มีใครใช้) ในแง่ Software ซัมซุงถือว่าเฟลมาตลอด ที่ได้ดีคือเรื่องของฮาร์ดแวร์ล้วนๆ

ดังนั้นผมคง Bet ไปในทางว่า Tizen สำหรับโทรศัพท์มือถือน่าจะเกิดมาไม่นานแล้วก็ตายจากไปเช่นเดียวกับ bada ครับ ดังนั้นในฐานะนักพัฒนา เราแนะนำว่า ไม่ควรจับ Tizen ครับ พัฒนาไปก็เสียต้นทุนไปเปล่าๆ แต่ในฐานะผู้ใช้ ซื้อมาเล่นเล่นๆก็ได้ครับ แต่อย่าคาดหวังว่าจะใช้มันในฐานะ Smartphone มองมันเป็นฟีเจอร์โฟนธรรมดาๆดีกว่า ด้วยราคานี้ไปเล่นแอนดรอยด์คุ้มกว่ามาก

แต่ในตลาด Embedded Device ค่อนข้างมั่นใจว่าหลังจากนี้ Samsung จะฝัง OS ตัวนี้ไปกับทุกผลิตภัณฑ์ของตัวเองในฐานะ Internet of Things ไม่ว่าจะเป็นตู้เย็น เครื่องซักผ้า ฯลฯ และน่าจะไปได้ครับ เพราะตลาดนี้ยังไม่มีมาตรฐานและยังแข่งขันกันอยู่ สุดท้ายน่าจะไปได้ แต่คงไม่มีใครสนใจเรื่องแอพฯอะไรมากมายเท่านั้นเอง

ตอนนี้ส่วนตัวก็ไม่แน่ใจว่าซัมซุงจะมั่นใจใน Tizen บนมือถือมากน้อยแค่ไหน ดูจาก Move แล้ว คิดว่ายังไม่มั่นใจขนาดนั้น และอยากจะลองตลาดเล่นๆเฉยๆ แต่ถ้าไปได้ก็จะสเกลขึ้นอย่างรวดเร็ว แต่ถ้าไม่ ... อาจจะมีแค่ 3-4 รุ่นแล้วก็ลาจากครับ

สรุป

คงต้องรอดู Strategy ของซัมซุงต่อไปครับ ปีนี้มีการขยับตัวอย่างบ้าคลั่งแน่ๆ แต่ Move แรกอย่าง Tizen นั้น น่าจะไปไม่รอด จากสาเหตุมากมายร้อยพัน ยังไงมารอดู Move ต่อไปกัน =)

สวัสดีวันจันทร์ครับ ... จบ

บทความที่เกี่ยวข้อง

Mar 19, 2015, 00:11
8020 views
Google Play ใช้คนร่วมตรวจแอพฯก่อนขึ้น Store แอพฯจะคุณภาพดีขึ้นหรือไม่? เปลี่ยนไปหรือเหมือนเดิม?
Dec 8, 2014, 03:51
18843 views
ทำความรู้จัก ProGuard เครื่องมือที่จะทำให้แอพฯแอนดรอยด์คุณเล็กลงกว่าครึ่งและยัง Reverse Engineer ยากขึ้น
0 Comment(s)
Loading