หากคุณเป็นนักพัฒนา Android ที่ต้องการสร้างแอปสำหรับพาร์ติชัน /system (เช่น root apps) จะมีบางกรณีที่คุณจะต้องการสร้าง flashable .zip สำหรับแอปของคุณ เพื่อให้ไฟล์แอปสามารถติดตั้งไปยังพาร์ติชัน /system ได้อย่างถูกต้อง
การใช้งาน flashable .zips อื่นๆ รวมถึง:
- การปรับเปลี่ยน DPI
- การใช้ฟอนต์กำหนดเอง
- การใช้ boot animation กำหนดเอง
- การลบหรือเพิ่ม system apps
การสั่งให้ผู้ใช้จัดการในระบบไฟล์และย้ายไฟล์ด้วยตนเองเป็นการเสียเวลาสำหรับทุกฝ่าย - การสร้าง flashable .zip เป็นเส้นทางที่สะดวกกว่ามาก คู่มือของ Appual นี้จะแสดงวิธีสร้าง flashable zip สำหรับ Android
เราจะแสดง addon.d script ด้วย เพื่อให้การเปลี่ยนแปลงระบบแบบกำหนดเองจะอยู่รอดหลัง dirty ROM flash - ดังนั้นผู้ใช้จะไม่ต้องแฟลช zip ของคุณใหม่สำหรับแต่ละอัปเดต
ข้อกำหนด:
- Root file explorer (MiXplorer, Solid Explorer)
- ZipSigner (สำหรับเซ็น zip) หรือ MiX Signer plug-in หากคุณใช้ MixPlorer
- Nandroid backup แนะนำอย่างยิ่ง
คุณควรเตรียมไฟล์ทั้งหมดที่จะใส่ใน zip - APKs, configs, boot animations ฯลฯ จัดระเบียบทุกอย่างก่อนเริ่ม เพราะนี่เป็นกระบวนการที่ละเอียดอ่อน
เทมเพลตของ Custom Zip
หากคุณต้องการดาวน์โหลดเทมเพลต zip ที่คุณสามารถปรับแต่งตามความต้องการของคุณเอง หรือใช้เป็นฐานสำหรับการสร้าง flashable zip คุณสามารถดาวน์โหลดได้ที่นี่:
- TEMPLATE SCRIPT: DOWNLOAD LINK (คำสั่งพื้นฐาน / คุณต้องเพิ่มค่า custom ของคุณเอง: apps, paths ของ ringtones, bootanimation...)
- TEMPLATE ZIP: DOWNLOAD LINK (ตัวอย่างมีประโยชน์เสมอสำheเข้าใจคำอธิบาย มาช่วยเข้าใจโครงสร้างไฟล์ของคุณได้)
เทมเพลตควรเพียงพอสำหรับเริ่มใช้ custom script
คุณต้องจำ path หลักเหล่านี้ เพราะนี่คือสิ่งในพาร์ติชัน /system ที่ flashable zips ของคุณจะมักจะเป้าหมาย:
addon.d => backup script เพื่ออยู่รอดหลัง dirty flash (ใช้โดย GApps package ตัวอย่างเช่น) app and priv-app => system apps ที่จะเพิ่มหรือลบ etc => host file fonts => ฟอนต์ของคุณ media => bootanimation.zip ของคุณ media > audio > alarms => เสียงสำหรับ鬧鐘 media > audio > notifications => เสียงสำหรับการแจ้งเตือน media > audio > ringtones => เสียงสำหรับนาฬิกาปลุก media > audio > ui => เสียงสำหรับสิ่งต่างๆ เช่น แบตเตอรี่ต่ำ ปลดล็อก กล้อง.. root of /system สำหรับไฟล์ build.prop
จำไว้เสมอว่า ไฟล์ที่ถูกลบจาก path เหล่านี้จะถูกติดตั้งใหม่หลัง dirty flash และไฟล์ที่เพิ่มด้วยตนเองจะถูกลบ นี่คือเหตุผลที่จำเป็นต้องสร้างสคริปต์ที่ทำแบ็กอัป /system mods ของคุณ
ตัวอย่าง Update-Script
ui_print("+-------------------------------------+"); ui_print("| CLEAN FLASH SCRIPT |"); ui_print("| |"); ui_print("| by Primokorn |"); ui_print("+-------------------------------------+"); run_program("/sbin/busybox", "umount", "/system"); run_program("/sbin/busybox", "mount", "/system"); ui_print(" "); ui_print("***Deleting bloatwares***"); delete_recursive( "/system/app/adaway.apk", "/system/app/AdAway", "/system/app/BasicDreams", "/system/app/BookmarkProvider", "/system/app/Calendar", "/system/app/CalendarWidget", "/system/app/CMFileManager", "/system/app/CMWallpapers", "/system/app/DeskClock", "/system/app/Eleven", "/system/app/Email", "/system/app/ExactCalculator", "/system/app/Exchange2", "/system/app/Gello", "/system/app/HexoLibre", "/system/app/Jelly", "/system/app/LiveWallpapersPicker", "/system/app/LockClock", "/system/app/messaging", "/system/app/MiXplorer", "/system/app/NexusLauncher", "/system/app/Phonograph", "/system/app/PhotoTable", "/system/app/PicoTts", "/system/app/PicoTTS", "/system/app/ResurrectionStats", "/system/app/SoundRecorder", "/system/app/Terminal", "/system/app/TugaBrowser", "/system/app/Wallpaper", "/system/app/WallpaperPickerGoogle", "/system/priv-app/AudioFX", "/system/priv-app/Chrome", "/system/priv-app/Gallery2", "/system/priv-app/MusicFX", "/system/priv-app/OnePlusCamera", "/system/priv-app/OnePlusGallery", "/system/priv-app/OnePlusMusic", "/system/priv-app/Recorder", "/system/priv-app/Screencast", "/system/priv-app/Snap", "/system/priv-app/SnapdragonCamera", "/system/priv-app/SnapdragonGallery", "/system/priv-app/WeatherManagerService", "/system/priv-app/WeatherProvider", "/system/priv-app/Tag" ); ui_print("Installing apps and mods, etc"); show_progress(8.800000, 5); package_extract_dir("system", "/system/"); ui_print("***Fixing permissions***"); set_perm(0, 0, 0755, "/system/addon.d/99-dirty.sh"); set_perm(0, 0, 0644, "/system/etc/gps.conf"); set_perm(0, 0, 0644, "/system/fonts/Roboto-Regular.ttf"); set_perm(0, 0, 0644, "/system/media/audio/ringtones/PlasticRing.ogg"); set_perm(0, 0, 0644, "/system/priv-app/Phonesky.apk"); set_perm(0, 0, 0644, "/system/priv-app/microG.apk"); set_perm(0, 0, 0644, "/system/priv-app/Gsam.apk"); set_perm(0, 0, 0644, "/system/priv-app/BBS.apk"); set_perm(0, 0, 0644, "/system/priv-app/V4A-Magisk.apk"); run_program("/sbin/busybox", "mount", "/data"); package_extract_dir("data", "/data/"); set_perm(0, 0, 0755, "/data/local/afscript.sh"); show_progress(8.800000, 5); run_program("/sbin/busybox", "umount", "/data"); run_program("/sbin/busybox", "umount", "/system"); ui_print(" "); ui_print("Done."); ui_print("Ready to reboot.");
หมายเหตุ: ui_print(" "); ใช้สำหรับข้อความข้อความ บรรทัดเหล่านี้ไม่ทำอะไรเลย
คุณควร unmount และ re-mount พาร์ติชันเสมอก่อนทำงานบนมัน
run_program("/sbin/busybox", "umount", "/system"); run_program("/sbin/busybox", "mount", "/system");
เพื่อลบคอมโพเนนต์/แอประบบ ให้ใส่ comma ที่ท้ายแต่ละบรรทัด ยกเว้นบรรทัดสุดท้าย
delete_recursive( "/system/app/adaway.apk", "/system/app/AdAway", ........................ "/system/priv-app/WeatherProvider", "/system/priv-app/Tag" );
แตกไฟล์ระบบที่คุณต้องการติดตั้ง
package_extract_dir("system", "/system/"); ตั้งค่าสิทธิ์ไฟล์ set_perm(0, 0, 0755, "/system/addon.d/99-dirty.sh"); .............. set_perm(0, 0, 0644, "/system/priv-app/V4A-Magisk.apk");
ทำสิ่งเดียวกันแต่สำหรับโฟลเดอร์ /data ดังนั้นคุณจะ mount พาร์ติชัน แตกไฟล์ data ที่คุณต้องการเพิ่ม และตั้งค่าสิทธิ์
run_program("/sbin/busybox", "mount", "/data"); package_extract_dir("data", "/data/"); set_perm(0, 0, 0755, "/data/local/afscript.sh");
ต่อไปคุณจะ unmount พาร์ติชันที่แก้ไขแล้ว
run_program("/sbin/busybox", "umount", "/data"); run_program("/sbin/busybox", "umount", "/system");
ตัวอย่าง Addon.D script
#!/sbin/sh # # /system/addon.d/99-dirty.sh # /system ถูก format และติดตั้งใหม่ แล้วไฟล์เหล่านี้จะถูกกู้คืน # . /tmp/backuptool.functions list_files() { cat <<EOF addon.d/99-dirty.sh fonts/Roboto-Regular.ttf media/audio/ringtones/PlasticRing.ogg priv-app/BBS.apk priv-app/Gsam.apk priv-app/microG.apk priv-app/PhoneSky.apk priv-app/V4A-Magisk.apk etc/gps.conf etc/hosts EOF } case "$1" in backup) list_files | while read FILE DUMMY; do backup_file $S/"$FILE" done ;; restore) list_files | while read FILE REPLACEMENT; do R="" [ -n "$REPLACEMENT" ] && R="$S/$REPLACEMENT" [ -f "$C/$S/$FILE" ] && restore_file $S/"$FILE" "$R" done rm -rf /system/app/adaway.apk rm -rf /system/app/AdAway rm -rf /system/app/BasicDreams rm -rf /system/app/BookmarkProvider rm -rf /system/app/Calendar rm -rf /system/app/CalendarWidget rm -rf /system/app/CMFileManager rm -rf /system/app/CMWallpapers rm -rf /system/app/DeskClock rm -rf /system/app/Eleven rm -rf /system/app/Email rm -rf /system/app/ExactCalculator rm -rf /system/app/Exchange2 rm -rf /system/app/Gello rm -rf /system/app/HexoLibre rm -rf /system/app/Jelly rm -rf /system/app/LatinIME rm -rf /system/app/LiveWallpapersPicker rm -rf /system/app/LockClock rm -rf /system/app/messaging rm -rf /system/app/MiXplorer rm -rf /system/app/NexusLauncher rm -rf /system/app/Nova.apk rm -rf /system/app/Phonograph rm -rf /system/app/PhotoTable rm -rf /system/app/PicoTts rm -rf /system/app/PicoTTS rm -rf /system/app/ResurrectionStats rm -rf /system/app/SoundRecorder rm -rf /system/app/Terminal rm -rf /system/app/TugaBrowser rm -rf /system/app/Wallpaper rm -rf /system/app/WallpaperPickerGoogle rm -rf /system/priv-app/AudioFX rm -rf /system/priv-app/Chrome rm -rf /system/priv-app/Gallery2 rm -rf /system/priv-app/LatinIME rm -rf /system/priv-app/MusicFX rm -rf /system/priv-app/OnePlusCamera rm -rf /system/priv-app/OnePlusGallery rm -rf /system/priv-app/OnePlusMusic rm -rf /system/priv-app/Recorder rm -rf /system/priv-app/Screencast rm -rf /system/priv-app/SnapdragonCamera rm -rf /system/priv-app/SnapdragonGallery rm -rf /system/priv-app/Snap rm -rf /system/priv-app/Trebuchet rm -rf /system/priv-app/WeatherManagerService rm -rf /system/priv-app/WeatherProvider rm -rf /system/priv-app/Tag ;; pre-backup) # Stub ;; post-backup) # Stub ;; pre-restore) # Stub ;; post-restore) # Stub ;; esac
สร้างรายการไฟล์ที่คุณต้องการเก็บไว้หลัง dirty flash
list_files() { cat <<EOF addon.d/99-dirty.sh fonts/Roboto-Regular.ttf media/audio/ringtones/PlasticRing.ogg priv-app/BBS.apk priv-app/Gsam.apk priv-app/microG.apk priv-app/PhoneSky.apk priv-app/V4A-Magisk.apk etc/gps.conf etc/hosts EOF }
RM -RF ไฟล์ที่คุณไม่ต้องการให้ติดตั้งหลัง dirty flash (ไฟล์ระบบที่คุณลบใน modification ของคุณซึ่งจะถูกติดตั้งใหม่จาก dirty flash)
rm -rf /system/app/adaway.apk rm -rf /system/app/AdAway rm -rf /system/app/BasicDreams rm -rf /system/app/BookmarkProvider ................................................ rm -rf /system/priv-app/WeatherProvider rm -rf /system/priv-app/Tag ;;
วิธีสร้าง Flashable Android Zip
เราจะใช้ MiXplorer เพราะมันเป็น root explorer และ file manager ที่ดีที่สุดสำหรับ Android ไม่ต้องสงสัย
- ก่อนอื่นเลือกโฟลเดอร์ทั้งหมดที่จะรวมใน zip และเลือก Archive

- ยืนยันการสร้างไฟล์ archive ตั้งชื่อและเลือก Store

- flashable zip ของคุณจะถูกสร้างขึ้น เลือกไฟล์ zip แล้ว Sign it (ใช้ MiX signer plugin)
- ตอนนี้เลือก TestKey เพื่อตรวจสอบข้อผิดพลาดลายเซ็น
- ตอนนี้คุณสามารถแฟลช zip ได้ - แนะนำให้ย้ายไป /SDcard เพื่อหาง่ายจาก custom recovery
บันทึกสุดท้าย
flashable zip ของคุณต้องติดตั้งหลัง clean flash หรือหลัง wipe พาร์ติชัน /system และ dirty flash ROM ของคุณ updater-script จะลบและเพิ่มไฟล์ระบบที่คุณระบุในสคริปต์ - แต่ปล่อย addon.d script ไว้ เพราะมันจะทำงานของมันโดยไม่มีการรบกวนจากคุณ
หลังการติดตั้งครั้งแรก ตรวจสอบพาร์ติชัน /system ให้ละเอียดว่าทุกอย่างถูกต้อง - ไฟล์ถูกลบ ฯลฯ อาจคุณพิมพ์ชื่อไฟล์ผิดและมันไม่ถูกลบ เกิดขึ้นได้