วันเสาร์ที่ 12 กรกฎาคม พ.ศ. 2557

การใช้งาน Proguard กับ Android

บทความครั้งที่แล้ว เราได้พูดถึงการใช้งานเจ้าเครื่องมืออย่าง Dex2Jar และ JD-GUI ไปแล้วนะครับ วันนี้เราจะมาพูดถึงวิธีป้องกันไม่ให้คนเอาแอพเราไปเปิดดูแล้วได้โค๊ตไปได้  วิธีการนั้นก็คือการใช้เจ้า Proguard เนี่ยแหละครับ
ในส่วนนี้ผู้เขียนขออธิบายวิธีการใช้งานมันกับเจ้า Eclipse นะครับ ยังไม่เคยได้ลอง Android Studio สักที ว่าจะลองๆ แล้วก็ไม่ได้ลอง

โดยปกติแล้วถ้าเรา New project ใหม่ขึ้นมา เราจะสังเกตเห็นว่า มันมักจะมีไฟล์ตัวนึงโผล่ขึ้นมาด้วย เจ้านั่นก็คือ proguard-project.txt นั่นเองครับ
ผู้เขียนขอทำการ rename ไฟล์มันให้เป็น *.cfg หน่อยนะครับ จะได้รู้ว่ามันเปนไฟล์ Configure
จากนั้นทำการเปิดไฟล์ project.proporties ขึ้นมาแล้วทำการ uncomment บรรทัดนี้ออก


ใครหาบรรทัดนั้นไม่เจอก็ copy ไปนะครับ

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.cfg


จากนั้นผู้เขียนขอทำการ copy ค่า Default ของ Configure ของเจ้า proguard มาแปะเลยละกัน

หน้าตาเป็นแบบนี้

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.billing.IInAppBillingService
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.content.Context {
    public void *(android.view.View);
    public void *(android.view.MenuItem);
}

ทำไปแปะใน file proguard.cfg เราซะ 
จากนั้นก็ทำการ build เลย!!

เมื่อได้ apk แล้ว ตัวนี้หละครับมันถูก Obfuscated มาเรียบร้อยละ ถ้าอยากจะรู้ว่าหน้าตามันเป็นยังไงก็ลองใช้ dex2Jar ดูนะครับ  หน้าตามันออกมาก็ประมาณนี้


สังเกตว่าคลาส MainActivity ชื่อยังเหมือนเดิม แต่ข้างในโค๊ตมันมีตัวแปล a ไรก็ไม่รู้ แถมมี class นึงชื่อ a โผล่มาอีกต่างหาก ใช่แล้วครับ เจ้า proguard มันเปลี่ยนชื่อไปให้เรา
จริงๆแล้วผู้เขียนได้ทำการใส่ class ที่เป็น Utility เข้าไปอีกกระปินึง แต่มันเห็นว่าเราไม่ใช้มันเลยดันลบทิ้งหมดเลย
อ้าา ใช่แล้วครับ ข้อนี่เป็นข้อระวังเลยล่ะในการใช้งานเจ้านี่ เพราะบางครั้งมันก็ดันไปลบในสิ่งที่เราไม่ได้อยากให้ลบด้วย เพราะฉะนั้น เราอยากจะให้อะไรอยู่เราก็ต้อง "keep" มันเอไว้นะครับ อยากรู้ว่า command ในการ keep ไว้ทำไง เลื่อนไปดูด้านบนได้เลยครับ ^__^  ข้อนี่เป็นสิ่งที่ต้องระวังนะครับขอย้ำ โดยเฉพาะในการใช้ Library ต่างๆ เราก็ต้องดูด้วยว่ามันกระทบหรือเปล่า พูดง่ายๆคือต้อง test ทุกครั้งหลังจากกการใช้มันน่ะครับ

ข้อดีของมันอีกอย่างคือเมื่อมันลบ class เราทิ้งไปหลายๆ classes มันทำให้ ขนาดของ *.dex ลดลง หรือ ขนาดของเจ้าไฟล์ *.apk นี่เองที่ลดลง

สิ่งสุดท้ายที่ขาดไม่ได้เลยคือ เรารู้ครับว่าคลาสที่โดนเปลี่ยนชื่อไปก่อนหน้านั้นมันชื่อว่าอะไร วิธีการไม่ยากครับ หลังจากเรา build ด้วย proguard เสร็จ มันจะปรากฏมี Folder นึง โผล่ขึ้นมาในโปรเจกเรา point ที่สำคัญก็คือ เค้าตัวไฟล์ที่ชื่อว่า mapping.txt เนี่ยแหละครับ จะเป็นตัวบอกว่า class ไหนถูกเปลี่ยนชื่อเป็นอะไร


หน้าตาของเจ้า mapping file


เป็นไงครับ ทีนี้ก็ใช้กันเปนแล้วสินะครับ ยังไงก็อย่าลืม test กันก่อนด้วยล่ะว่าโปรแกรมเรายังทำงานถูกต้องมั๊ยย อย่าลืมนะครับ!

1 ความคิดเห็น: