14 December 2015

มามะ มาลองเขียน iOS App บน Android Studio กันเถอะ!!

Updated on

        บอกเลยว่าไม่ได้เมาแล้วมานั่งเขียนบทความ แต่บทความนี้เจ้าของบล็อกจะมาแชร์ว่าเดี๋ยวนี้สามารถสร้างแอพบน iOS โดยใช้ Android Studio ได้แล้วนะเออ

         อ๊ะๆ ไม่เคยเห็นกันมาก่อนล่ะสิ

        เจ้าของบล็อกก็คิดไม่ถึงเหมือนกันว่าจะมาถึงจุดนี้ได้ ฮา แต่ทั้งนี้ก็ต้องขอบคุณ Intel ครับ (ไม่ได้ค่าโฆษณานะ) ที่พัฒนาสิ่งที่เรียกว่า Intel Multi-OS Engine ขึ้นมาให้ หรือเรียกสั้นๆว่า MOE

แล้ว Intel Multi-OS Engine มันคืออะไร?

        MOE เป็นหนึ่งในเทคโนโลยีที่ทาง Intel พัฒนาขึ้นมาครับ โดยอยู่ในรูปของ Plug-in ที่สามารถเอาไปติดตั้งใช้งานใน Android Studio ได้เลย (เพราะ AS นั้น Based on IntelliJ IDEA ที่สามารถติดตั้ง 3rd-party plug-in ได้) ซึ่งเจ้า MOE ตัวนี้ก็จะทำงานกับโปรเจคแอนดรอยด์ได้ตามปกติ แต่ว่ามันมีสามารถทำให้ Gradle สามารถ Build iOS App ได้ รวมไปถึงช่วยให้สามารถเรียก iOS Simulator บน Android Studio เพื่อให้สามารถเทสได้ทันที


        ซึ่งแน่นอนว่าการพัฒนาแอพ iOS บน Android Studio จะเป็นการใช้ภาษา Java ในการพัฒนาเลยครับ อ่านไม่ผิดหรอก Java จริงๆ (เดี๋ยวอธิบายอีกที) จึงทำให้สามารถสร้าง Common Logic Code เพื่อใช้งานร่วมกันระหว่าง Android และ iOS ได้เลย

Overview

        ต้องบอกว่าการที่เขียนภาษา Java ให้เป็น iOS App ได้นั้นไม่ใช่เรื่องเล็กน้อยเลย แต่ด้วย MOE ที่มีการทำงานหลายๆอย่างที่ช่วยแปลงภาษา Java ให้กลายเป็น Objective C เกิดขึ้นมาได้ โดยที่นักพัฒนาไม่จำเป็นต้องแตะ Objective C เลย


        โดยเบื้องหลังการทำงานก็จะมีไลบรารีต่างๆที่ช่วยจัดการให้เสร็จสิ้น อย่างโค๊ด Java ก็จะถูก Binding กับโค๊ดในภาษา Objective C แถมเขียนโค๊ด Java ปกติเลย ไม่ต้องไปแตะ JNI เลยซักนิด จึงทำให้เขียนแอพ iOS ด้วยภาษา Java ได้ทันที และคำสั่งก็จะเป็น iOS Platform API โดยตรงเลย

        ในส่วนของ MOE Java core นั้นได้สืบทอดมาจาก Android ART runtime และรองรับ Java API เกือบทั้งหมด จึงหมดปัญหาเรื่องการพัฒนาในฝั่งแอนดรอยด์ได้เลย และส่วน iOS ก็รองรับ 64-bit และไม่ต้องกลัวว่าจะรองรับกับ CPU เฉพาะบางสถาปัตยกรรม เพราะรองรับทั้ง x86 และ ARM จ้า

        และนอกจากนี้ทาง Intel ยังบอกไว้ว่ารองรับ Lambda บน Java 8 ด้วยล่ะ โดยใช้ Retro-lambda Integration (เจ้าของบล็อกยังไม่เคยลอง Lambda เลย)

การติดตั้ง Intel Multi-OS Engine

        เข้าไปดาวน์โหลดได้ที่ Intel Multi-OS Engine ซึ่งตอนนี้พึ่งจะ Preview ให้ได้ทดลองใช้กันครับ โดยจะต้องสมัครก่อนถึงจะดาวน์โหลดได้


        จะมีให้ดาวน์โหลดแยกกันระหว่าง Windows กับ OSX นะครับ ขนาดประมาณ​ 150MB ให้ทำการติดตั้งให้เรียบร้อย โดยในระหว่างการติดตั้งจะต้องปิด Android Studio ด้วย (เพราะมันเป็น Plug-in Install ด้วย)

        สำหรับสิ่งที่ต้องติดตั้งไว้ในเครื่องเพื่อใช้งานกับ MOE ก็จะมี

        • Android Studio เวอร์ชันล่าสุด
        • XCode เวอร์ชันล่าสุด (ถ้าใช้ Mac)
        • Java Development Kit (JDK) 1.7
        • Android SDK

        และในการติดตั้งจะต้องกำหนด Path ของ Tools ต่างๆด้วย


การ Build iOS App ของ MOE

        เพราะการ Build เป็นไฟล์ IPA ทำบน Android Studio โดยตรงไม่ได้อยู่แล้ว จึงเป็นเรื่องปกติที่จะต้องใช้ XCode ในการ Build เป็นไฟล์อีกที ซึ่ง XCode นั้นจะมีเฉพาะบน Mac เท่านั้น ดังนั้นถ้าผู้ที่หลงเข้ามาอ่านใช้ Mac ก็สามารถทำ Local Build ได้เลย เพียงแค่ติดตั้ง XCode ไว้ด้วย


        ถ้าผู้ที่หลงเข้ามาอ่านใช้ Windows ก็สามารถติดตั้ง MOE ได้ แต่ว่าจะไม่สามารถ Build iOS App เองได้ ดังนั้นจึงต้องใช้วิธี Remote Build โดยการส่งไฟล์ขึ้นไปบนเซิฟเวอร์ที่ทาง Intel เตรียมไว้ให้แทน จริงๆ Mac ก็ทำได้นะ จะได้ไม่ต้องเปลืองพื้นที่ลง XCode แต่มันก็จะเสียเวลา Build กว่าการทำ Local Build นั่นเอง

การทำงานของ MOE บน Android Studio เพื่อสร้างแอพ iOS

        เนื่องจาก Android Studio มันมีไว้เขียนแอพแอนดรอยด์อยู่แล้วเนอะ ดังนั้นคงไม่ต้องอธิบายอะไร แต่สำหรับฝั่ง iOS ต้องมีขั้นตอนนิดหน่อย

        การจะสร้างโปรเจคต้องเป็นโปรเจคแอนดรอยด์ (ก็ทำงานอยู่บน Android Studio นี่เนอะ) แล้วโค๊ดในส่วนของ iOS จะกลายเป็น Module ตัวนึงเท่านั้น



        สร้าง Module เพิ่มสำหรับ iOS App แต่ว่าจะสร้างเป็น New > Intel Multi-OS Engine Module แทน ซึ่ง MOE ก็จะมี Template เริ่มต้นให้อยู่แล้ว สามารถดูขั้นตอนการเพิ่ม Module สำหรับ iOS ได้ที่ Step-by-Step Guide to Build iOS Apps using XCode Interface Builder in Multi-OS Engine



        การจัด UI Layout สำหรับ iOS สามารถนำไปเปิดบน XCode แล้วจัดบน Storyboard หรือว่าจะใช้ MOE UI Design บน Android Studio ก็ได้ (ให้ความรู้สึกคล้ายๆกับการจัด Layout ของแอนดรอยด์)



        การ Binding UI เข้ากับโค๊ดใน Java ก็จะใช้ NatJ runtime libraries ที่ทำมาให้ใช้งานได้ง่ายๆในรูปแบบ Annotation และแอพแต่ละหน้าก็จะอยู่ใน View Controller Class (เช่น AppViewController)



        ในกรณีที่ออกแบบ UI บน MOE UI Design จะอยู่ในรูปของไฟล์ .ixml ที่จะได้แต่ลากวางเท่านั้น ไม่มี XML Editor ให้ใช้ แต่เบื้องหลังของมันคือ View ของแอนดรอยด์ที่ทำ Style ให้คล้ายกับ iOS (เมื่อเอาไฟล์ .ixml มาลองเปิดดู) โดยสามารถ Generate เป็น Storyboard ได้



        ในการทดสอบแอพสามารถทำได้ผ่าน Simulator หรือ Real Device โดยผ่าน Android Studio นี่แหละ และสามารถ Export เป็น IPA แล้ว Public ขึ้น App Store ได้เลยนะ!!!


        สำหรับการเขียนโค๊ดต้องบอกก่อนเลยว่า MOE ไม่ได้ทำให้โค๊ดแอนดรอยด์มารันบน iOS ได้นะครับ แต่ว่า MOE จะช่วยให้นักพัฒนาสามารถพัฒนาแอพทั้งสอง Platform ด้วยการใช้ภาษา Java เหมือนกันเท่านั้น


        เพราะต้องยอมรับว่า Android กับ iOS มีความแตกต่างกันในเรื่องของโครงสร้างและการทำงานครับ ดังนั้นจะหวังให้โค๊ดชุดเดียวทั้งหมดแต่รันได้ทั้ง 2 Platform ก็จะมีแค่ Hybrid ที่เอาอย่างอื่นมาครอบทับไว้เพื่อให้เขียนได้ด้วยโค๊ดชุดเดียว แต่จะมีปัญหาตรงที่ไม่สามารถจัดการการทำงานได้ดีเท่า Native

        ซึ่งคำสั่งต่างๆของ Objective C ที่ใช้ใน iOS ก็จะถูกแปลงมาให้อยู่ในรูปของภาษา Java เพื่อให้สามารถเรียกใช้งานได้เหมือนกับ Native เลย (แต่ก็ไม่ทั้งหมดหรอกนะ)


        ในการใช้ MOE เพื่อพัฒนาแอพทั้งคู่ ทาง Intel จึงแนะนำว่าการเขียนโค๊ดหลายๆส่วนนั้นต้องเขียนแยกระหว่าง Android กับ iOS อยู่ดี แต่ว่าโค๊ดที่เป็นพวก Business Logic หรือ Algorithm ในการคำนวณที่ไม่ผูกกับ Platform ใด Platform หนึ่ง ให้แยกเป็น Module ออกมา แล้วให้ทั้งสองฝั่งเรียกไปใช้งานแทน

        ดังนั้นถ้ามีโค๊ดที่ใช้งานร่วมกันได้มากเท่าไรก็จะช่วยให้พัฒนาทั้งสองฝั่งได้ง่ายขึ้นเท่านั้นแหละ


        การ Build Project สำหรับ iOS นั้นจะต้องกำหนดใน Build Configuration เพื่อให้ใช้เป็น MOE (ส่วนจะแบบ Local หรือ Remote ก็ขึ้นอยู่กับเครื่องที่ใช้)



        สำหรับ iOS Module ที่สร้างเป็น MOE สามารถสั่งไปเปิดบน XCode ผ่าน MOE Action Menu ได้เลยนะ



        สำหรับไลบรารีก็คงต้องบอกว่าลำบากซักหน่อยที่จะหาไลบรารี Java มาใช้บนแอพสำหรับ iOS เพราะไม่ใช่ว่าเป็น Java Library ก็สามารถใช้งานได้ทุกตัว แต่ก็ขึ้นอยู่กับว่ามันรองรับด้วยหรือไม่ เพราะอย่างที่บอกไว้ว่าไม่ใช่ทุกคำสั่งบน Java ที่จะรองรับได้ ส่วน OpenGL ก็สามารถใช้งานได้ปกติ

        ดังนั้นจึงน่าเสียดายเล็กน้อยกับการที่เจ้าของบล็อกไม่สามารถเอา Retrofit มาใช้ใน iOS ได้ ถึงแม้มันจะเป็นแค่ Java Library ก็ตาม เพราะยังมีบางคำสั่งที่จำเป็นต้องเปลี่ยนไปใช้เป็นคำสั่งของ iOS ที่ทาง Intel ทำมาเป็น Java ไว้ให้ ดังนั้นพวก View Library จึงไม่ต้องพูดถึงเลย

        ส่วน Swift ก็ไม่ต้องพูดถึงเลยครับ เพราะตัวนี้อิง Objective C ล้วนๆ แต่ก็ต้องรอติดตามดูกันไปว่าจะพัฒนาได้มากแค่ไหนเนอะ

สรุป

        เฮ้ย มันเจ๋งนะ!! เพราะเป็นครั้งแรกที่เจ้าของบล็อกเพิ่งจะได้เห็นเครื่องมือที่จะช่วยให้เขียนแอพ iOS ด้วยภาษา Java นี่แหละ แถมยังเป็น Native อีกด้วย (จริงๆมี RoboVM อีกตัว) เพราะงั้นจึงไม่ต้องห่วงว่า Performance จะตกเลย (อยู่ที่การเขียนของเราล้วนๆ) แถมยังสามารถทำทั้งหมดบน Android Studio (แต่ก็อาจจะต้องลง XCode ทิ้งไว้ด้วย)

        นี่จะเป็นอีกหนึ่งเครื่องมือที่น่าสนใจในอนาคตครับ เพราะมันอาจจะเป็นอีกหนึ่งทางเลือกที่น่าสนใจสำหรับนักพัฒนาสาย Java แต่ก็ต้องดูว่ามันจะยืดหยุ่นได้มากแค่ไหนครับ เพราะปัญหาสำหรับ Hybrid Development Tools ส่วนใหญ่คือความยืดหยุ่นในการพัฒนาค่อนข้างต่ำครับ ไม่สามารถปรับเปลี่ยนในหลายๆอย่างได้ จึงทำให้ไม่เหมาะกับงานที่ต้องการ Custom และ Performance จริงๆ แต่ถ้า MOE สามารถพัฒนาและจัดการกับปัญหานี้ได้ ก็เตรียมเฮได้เลย~

        และอย่าลืมนะ ว่าตอนนี้ MOE ยังเป็น Preview อยู่ เพราะงั้นการนำไปใช้งานเลยใน Production จึงบอกเลยว่าอย่ารีบครับ รอศึกษาไปเรื่อยๆก่อนครับ :D

แหล่งข้อมูลอ้างอิง

        เผื่อว่าผู้ที่หลงเข้ามาอ่านคนใดสนใจอยากจะลองศึกษาและใช้งานดู ทาง Intel ก็ทำแหล่งข้อมูลให้เยอะพอสมควรเลยครับ

        • Intel Multi-OS Engine - Technology Preview เอาไว้ดูรายละเอียดคร่าวๆสำหรับ Engine ตัวนี้
        • Tutorials and Quick Start Guides for Multi-OS Engine เป็นเหมือนสารบัญที่รวมเนื้อหาในหัวข้อต่างๆเพื่อศึกษาครับ
        • Building Your First App for Android and iOS on Apple Mac OS X Using Multi-OS Engine การเริ่มต้นสร้างโปรเจคสำหรับแอนดรอยด์และ iOS ด้วย MOE
        • How to port an Android app to iOS using Multi-OS Engine? ในกรณีที่มีโค๊ดแอนดรอยด์อยู่แล้ว และอยากจะเพิ่มในส่วนของ iOS เข้าไปทีหลัง
        • Intel Multi-OS Engine Samples on GitHub ตัวอย่างแอพที่รองรับทั้งแอนดรอยด์และ iOS โดยใช้ MOE ซึ่งมีหลายๆโปรเจคอยู่ในนี้ให้ศึกษา

Special Thanks

        +Ibnu S Wardy