16 เมษายน 2557

[Android Dev Tips] วิธีดึงข้อมูลที่อยู่ภายใน Internal Storage ของแอปพลิเคชัน [/data/data]



        ในเวลาที่ผู้ที่หลงเข้ามาอ่านเขียนแอปพลิเคชัน บ่อยครั้งผู้ที่หลงเข้ามาอ่านก็อยากจะได้ไฟล์ข้อมูลที่อยู่ในเครื่องเพื่อออกมาดูว่าการทำงานถูกต้องหรือไม่ ที่พบบ่อยที่สุดก็คือไฟล์ฐานข้อมูล SQLite รองลงมาก็คงจะเป็น Shared Preference ที่เก็บไว้

        แต่ทว่าการจะเข้าไปดึงข้อมูลออกมานั้นไม่ใช่เรื่องง่ายเลย เพราะว่าปัญหาใหญ่คือข้อมูลดังกล่าวมันอยู่ใน Internal Storage ซึ่งระบบแอนดรอยด์ไม่ยอมให้เข้าไปทำอะไรได้ง่ายๆอยู่แล้ว เพราะมันคือไฟล์ของระบบจึงต้องมีการป้องกันไม่ให้ผู้ใช้ทั่วไปเข้าไปแก้ไขข้อมูลได้

การดึงข้อมูลบน Emulator

        ในกรณีที่ใช้ Emulator ไม่ว่าจะ AVD หรือจะ Genymotion จะสามารถเข้าไปดึงไฟล์ได้ง่ายๆด้วย DDMS หรือใช้ File Explorer ที่อยู่ใน ADT (Eclipse) หรือ Android Studio ได้เลย

        ถ้าจะใช้ DDMS ให้เข้าไปที่ ../sdk/platform-tools/ddms



        จะเห็นว่าเจ้าของบล็อกเสียบเครื่อง Moto X ไว้ และเปิด Genymotion ที่เป็น Nexus 4 ไว้ โดย Genymotion จะมีคำว่า debug ต่อท้ายเลขเวอร์ชันอยู่ด้วย นั่นหมายความว่าสามารถดึงไฟล์ผ่าน DDMS ได้



        กดเลือกที่ Device ตัวนั้นๆ แล้วเลือกไปที่ Device > File Explorer...



        จะมีหน้าต่าง File Explorer โผล่ขึ้นมา



        สามารถเข้าไปที่ data/data/[package_name]/ เพื่อเข้าไปดึงไฟล์ได้เลย สำหรับฐานข้อมูลจะอยู่ในโฟลเดอร์ databases และสำหรับตัวอย่างเจ้าของบล็อกดึงไฟล์ Shared Preference ออกมา โดยอยู่ที่ data/data/app.akexorcist.mobileinternetsetting/shared_prefs/Operator.xml ก็เลือกไฟล์ดังกล่าวแล้วกดที่ปุ่มข้างบนที่เป็นปุ่ม Pull File from Device



        แล้วเลือกที่อยู่ในคอมพิวเตอร์ที่ต้องการเก็บไฟล์ได้เลย เป็นอันเสร็จเรียบร้อย



        นอกจากจะใช้ DDMS แล้ว สามารถใช้ File Explorer ที่อยู่ใน ADT หรือ Android Studio ได้เช่นกัน โดยต้องเลือกไปที่ Window > Show View > Other...



        จะมีหน้าต่าง Show View แสดงขึ้นมา ให้เลือก Android > File Explorer



        เมื่อเลือกแล้วก็จะมีหน้าต่างของ Show View โผล่ขึ้นมาทันทีที่ข้างล่างโปรแกรมในแถบเดียวกันกับ Console (หรืออาจจะต่างกันไป) เท่านี้ก็สามารถใช้งานได้ปกติเหมือนกับบน DDMS เลย เพียงแต่ว่าตัวนี้จะเลือก Device ไม่ได้ ในกรณีที่เปิด Emulator ไว้หลายตัว





การดึงข้อมูลบน Real Device 

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

        • รูทเครื่องซะ - ซึ่งเจ้าของบล็อกจะไม่มานั่งบอกวิธีรูทให้นะ ไปนั่งหากันเอง เพราะว่าเครื่องแต่ละเครื่องมันมีวิธีรูทไม่เหมือนกันอยู่แล้ว ให้เอาชื่อเครื่องและรุ่นไปค้นหาใน Google แล้วต่อท้ายด้วยคำว่า "รูท" หาเจอไม่ยาก



        • ใช้แอปพลิเคชันจำพวก File Explorer ที่สามารถเข้าถึงแบบรูทได้ โดยเจ้าของบล็อกใช้เป็น ES File Explorer เพราะว่าเป็นแอปพลิเคชันติดเครื่องเจ้าของบล็อกอยู่แล้ว แถมสามารถเข้าไปดู Internal Storage ผ่านรูทได้ด้วย




        ต่อจากนี้จะเป็นการใช้ ES File Explorer นะ สำหรับแอปพลิเคชันตัวอื่นๆอาจจะมีการใช้งานที่แตกต่างกันออกไป (ดูด้วยว่าแอปพลิเคชันนั้นๆเข้าถึงไฟล์ระบบผ่านรูทได้ด้วยหรือไม่)

        เริ่มจากเปิดแอปพลิเคชัน ES File Explorer ขึ้นมาแล้วกดที่ปุ่มตรงมุมซ้ายบนเพื่อเปิดหน้าต่างเมนูขึ้นมา



        เลือก Tools แล้วเลื่อนแถบเมนูลงมาก็จะเห็นกับช่อง Root Explorer ให้ติ๊กเลือกซะ



        ถ้าเครื่องถูกรูทแล้ว ก็จะต้องมีหน้าต่างของ SuperSu หรือว่า Superuser (แล้วแต่ว่าผู้ที่หลงเข้ามาอ่านจะรูทด้วยตัวไหน) ขึ้นมาถามว่าแอปพลิเคชันตัวนี้เรียกใช้สิทธิ์รูทจะยอมให้ใช้สิทธิ์ได้หรือไม่ ให้เลือก Grant ซะ เท่านี้ ES File Explorer ก็จะอยู่ในสถานะรูทแล้ว

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



        เมื่อขอสิทธิ์เข้าถึงแบบรูทแล้ว ให้กดปุ่มมุมซ้ายบนเพื่อซ่อนเมนูได้เลย แล้วกดที่ปุ่ม / ที่อยู่ข้างบน แล้ว Directory ก็จะเปลี่ยนไปที่ข้างนอกสุดของตัวเครื่องแล้ว (สังเกต;jk Directory จะเป็น Device)



        ทีนี้ให้เข้าไปยัง Path ที่ต้องการได้เลย โดยเจ้าของบล็อกก็จะเข้าไปที่ data/data/app.akexorcist.mobileinternetsetting/




        เท่านี้ก็เข้ามาใน Internal Storage ของแอปพลิเคชันที่ต้องการได้แล้ว จากนั้นก็ให้ทำการกีอปไฟล์ไปไว้ใน SD Card ได้เลย แล้วต่อเครื่องเข้ากับคอมพิวเตอร์แล้วโอนไฟล์ลงคอมอีกทีหนึ่ง หรือว่าจะโยนไฟล์จากเครื่องไปยังคอมพิวเตอร์ผ่านวงแลนได้เช่นกัน (ความสามารถของ ES File Explorer)

        สรุปได้ว่าถ้าอยากจะเข้า Internal Storage ของแต่ละแอปพลิเคชันจะต้องรูทเครื่องเท่านั้นถึงจะเข้าถึงได้ (จากการทดสอบด้วยทุกหนทางเท่าที่นึกได้แล้ว)

        แต่ถ้าถามว่ารูทแล้วเครื่องจะเป็นอะไรมั้ย ก็บอกได้แค่ว่าไม่เป็นอะไรหรอก ใช้งานได้ปกติ แต่ข้อดีสำหรับนักพัฒนาคือสามารถเข้าถึง Internal Storage ได้ง่ายๆ จึงเป็นที่มาว่านักพัฒนาหลายๆคนทำไมถึงรูทเครื่องกัน XD (จริงๆแล้วเอาไว้ใช้กับแอปพลิเคชันหลายๆตัวที่ต้องรูทเครื่องซะมากกว่า ฮาๆ)


        รูทเครื่องเถอะลูก!! แต่อย่ามาถามเจ้าของบล็อกนะว่ารูทยังไงนะ!!




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium