Nếu bạn là nhà phát triển Android muốn tạo app dành cho phân vùng /system (như app root), có lúc bạn cần tạo file .zip flashable cho app. Điều này giúp các file app được cài đặt đúng cách vào phân vùng /system.
Một số trường hợp khác dùng flashable .zip:
- Sửa đổi DPI
- Áp dụng font tùy chỉnh
- Áp dụng boot animation tùy chỉnh
- Xóa hoặc thêm system app
Yêu cầu user tự mò file system và di chuyển file thủ công là lãng phí thời gian cho tất cả - tạo flashable .zip tiện lợi hơn nhiều. Hướng dẫn này sẽ chỉ cách tạo flashable zip cho Android.
Chúng tôi cũng sẽ chỉ addon.d script, giúp thay đổi system tùy chỉnh tồn tại sau dirty flash ROM - user không cần re-flash zip mỗi lần cập nhật.
Yêu cầu:
- Root file explorer (MiXplorer, Solid Explorer)
- ZipSigner (ký zip) hoặc MiX Signer plugin nếu dùng MiXplorer
- Nandroid backup rất khuyến nghị
Bạn cũng nên chuẩn bị sẵn các file sẽ đưa vào zip - APK, config, boot animation, v.v. Sắp xếp mọi thứ trước khi bắt đầu, vì đây là quy trình tinh vi.
Template của Custom Zip
Nếu muốn tải template zip để tùy chỉnh hoặc làm base tạo flashable zip, có thể lấy tại:
- TEMPLATE SCRIPT: DOWNLOAD LINK (lệnh cơ bản / tự thêm giá trị tùy chỉnh: app, đường dẫn ringtone, bootanimation...)
- TEMPLATE ZIP: DOWNLOAD LINK (ví dụ luôn giúp hiểu rõ giải thích. Giúp hiểu cách cấu trúc file).
Template đủ để bắt đầu dùng custom script.
Cần nhớ các đường dẫn chính, vì đây là những thứ trong phân vùng /system mà flashable zip thường nhắm đến:
addon.d => backup script để sống sót sau dirty flash (dùng bởi GApps package) app and priv-app => system app để thêm hoặc xóa etc => host file fonts => font của bạn media => bootanimation.zip của bạn media > audio > alarms => âm thanh báo thức media > audio > notifications => âm thanh thông báo media > audio > ringtones => âm thanh chuông media > audio > ui => âm thanh cho pin yếu, unlock, camera... root của /system cho file build.prop
Luôn nhớ: file bị xóa từ các đường dẫn này sẽ được cài lại sau dirty flash, và file thêm thủ công sẽ bị xóa. Do đó cần tạo script backup /system mods.
Ví dụ 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.");
Lưu ý: ui_print(" "); dùng để hiển thị thông báo. Các dòng này không thực thi hành động.
Luôn unmount và re-mount phân vùng trước khi làm việc trên nó.
run_program("/sbin/busybox", "umount", "/system");
run_program("/sbin/busybox", "mount", "/system");
Để xóa component/app hệ thống, thêm dấu phẩy cuối mỗi dòng, trừ dòng cuối.
delete_recursive( "/system/app/adaway.apk", "/system/app/AdAway", ........................ "/system/priv-app/WeatherProvider", "/system/priv-app/Tag" );
Giải nén file system bạn muốn cài đặt.
package_extract_dir("system", "/system/");
Set quyền file.
set_perm(0, 0, 0755, "/system/addon.d/99-dirty.sh"); .............. set_perm(0, 0, 0644, "/system/priv-app/V4A-Magisk.apk");
Làm tương tự cho thư mục /data. Mount partition, extract data, set permissions.
run_program("/sbin/busybox", "mount", "/data");
package_extract_dir("data", "/data/");
set_perm(0, 0, 0755, "/data/local/afscript.sh");
Tiếp theo unmount các partition đã sửa đổi.
run_program("/sbin/busybox", "umount", "/data");
run_program("/sbin/busybox", "umount", "/system");
Ví dụ Addon.D script
#!/sbin/sh
#
# /system/addon.d/99-dirty.sh
# /system được format và cài lại, sau đó các file này được khôi phục.
.
/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
Tạo danh sách file bạn muốn giữ sau 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 các file bạn không muốn cài lại sau dirty flash (file hệ thống bạn xóa trong mod sẽ được cài lại từ 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 ;;
Cách tạo Flashable Android Zip
Chúng ta sẽ dùng MiXplorer, vì đây là root explorer và file manager tốt nhất cho Android, không bàn cãi.
- Chọn tất cả thư mục sẽ đưa vào zip, chọn Archive.

- Xác nhận tạo archive, đặt tên và chọn Store.

- Flashable zip đã tạo, chọn file zip và Sign (dùng MiX signer plugin).
- Chọn TestKey để kiểm tra lỗi chữ ký.
- Bây giờ có thể flash zip - khuyến nghị move vào /SDcard để dễ tìm từ custom recovery.
Ghi chú cuối
Flashable zip cần cài sau clean flash, hoặc sau khi wipe /system và dirty flash ROM. Updater-script sẽ xóa và thêm file system bạn chỉ định - nhưng đừng đụng addon.d script, nó sẽ tự làm việc mà không cần can thiệp.
Sau cài đặt lần đầu, kiểm tra kỹ phân vùng /system đảm bảo mọi thứ đúng - file đã xóa, v.v. Có thể bạn typo tên file nên không bị xóa, chuyện này hay xảy ra.