บทนำ (Overview)
“ProGuard” คือเครื่องมือนักพัฒนาโปรแกรม ที่ช่วยให้ “Binary” ของเรามีคุณสมบัติดังนี้
- “Shrink” ช่วยให้ “Class” หรือ “Variable” ที่นักพัฒนาสร้างมา หรือ “Library” อื่น ๆ ทำนำมาร่วมด้วยอยู่ใน “Project” แต่ไม่ได้ใช้งาน จะถูกตัดทิ้งไปโดยไม่รวมอยู่ “Binary” ดังนั้นทำให้ “Binary” ของเรามีขนาดเล็กลง
- “Optimize” ในขั้นตอนมานี้ แม้จะเหลือเฉพาะส่วนที่ใช้งาน ก็ยังพอสามารถทำให้โปรแกรมมีขนาดเล็กลง และทำงานได้เร็วอีกด้วย
- “Obfuscate”ทำการเปลี่ยนชื่อ “Variable” และ “Class” ให้ไม่สื่อความหมาย เช่น “a.bbb” เป็นต้น
อ้างอิง: สามารถศึกษารายละเอียดเพิ่มเติมได้ที่
- https://developer.android.com/studio/build/shrink-code.html
- https://en.wikipedia.org/wiki/Obfuscation_(software)
ขั้นตอน (Steps)
- ในโปรแกรม “Android Studio” ให้สร้าง “Project” ใหม่ขึ้นมา
- จากนั้นเปลี่ยนมุมมองเป็น “Project”
- จากนั้นไปที่ “File” (/app/build.gradle) แก้ไขในส่วน “minifyEnable” จาก “False” เป็น “True”
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
- ในส่วนของ “buildType” อาจเป็นไปได้ทั้ง “debug” หรือ “release” ตัวอย่างของต้องการตั้งค่า เช่น
buildTypes { debug { minifyEnabled true useProguard true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
- ในการตั้งค่า “Debug” และ “Release” ก็ขึ้นอยู่กับว่าโปรแกรม “Compile” ด้วย “Mode” อะไร ดังนั้นเราก็สามารถเปลี่ยนเป็น “Debug” หรือ “Release” ก็ได้โดยไปที่ “Build จากนั้น Select Build Variant…”
- จะปรากฏหน้าต่างด้านล่างซ้ายซึ่งเราสามารถเลือก “Compile” ตามที่เราตั้งค่าไว้
- ถ้าเกิดปัญหาสำหรับการ “Obfuscation” ของ “Library” ต่าง ๆ ที่นำมาร่วมใช้งานด้วย ให้ทำการแก้ไขที่ไฟล์ ” proguard-rules.pro”
- จากนั้นเพิ่ม “code” ตามข้างล่างลงไป ตัวอย่างเช่น
-keepclassmembers class "เพิ่ม package ที่เราจะ obfuscation" { public *; }
- สร้างไฟล์ “.apk” โดยไปที่ “Build” และ “Build APK”
- ฉะนั้นสามารถเข้าถึงไฟล์ได้ได้ตามภาพ
- ทดสอบผลการ “Obfuscate” พบว่าจะมีการ “Rename” ชื่อ “Class” และ “Variable” สามารถติดตามบทความ “Reverse engineering “ได้จากบทความ
- จากรูปจะพบว่ามีการ “Renamed” ชื่อตัวแปร และ คลาส