/system 파티션용 앱(예:루트 앱)을 만들고자 하는 Android 개발자라면 앱용으로 플래시 가능한 .zip을 만들고 싶은 특정한 경우가 있습니다. /system 파티션에 앱 파일이 제대로 설치될 수 있도록 하기 위함입니다.
플래시 가능한 .zip의 몇 가지 다른 용도는 다음과 같습니다.
- DPI 수정
- 맞춤 글꼴 적용
- 맞춤 부팅 애니메이션 적용
- 시스템 앱 제거 또는 추가
사용자에게 파일 시스템을 어지럽히고 수동으로 파일을 이동하도록 지시하는 것은 관련된 모든 사람에게 시간 낭비입니다. 플래시 가능한 .zip을 만드는 것이 훨씬 더 편리한 경로입니다. 이 Appual 가이드는 Android용 플래시 가능한 zip을 만드는 방법을 보여줍니다.
또한 사용자 지정 시스템 변경 사항이 더티 ROM 플래시에서 살아남을 수 있도록 addon.d 스크립트를 보여줄 것입니다. 따라서 사용자는 업데이트할 때마다 zip을 다시 플래시할 필요가 없습니다.
요구사항:
- 루트 파일 탐색기(MiXplorer, Solid Explorer)
- ZipSigner(Zip 서명용) 또는 MixPlorer를 사용하는 경우 MiX Signer 플러그인
- Nandroid 백업을 적극 권장합니다.
또한 zip에 들어갈 모든 파일(APK, 구성, 부팅 애니메이션 등)을 준비해야 합니다. 시작하기 전에 모든 것을 정리해야 합니다. 이는 섬세한 프로세스이기 때문입니다.
맞춤형 Zip 템플릿
필요에 맞게 사용자 정의할 수 있는 템플릿 zip을 다운로드하거나 플래시 가능한 zip을 만들기 위한 기반으로 사용하려면 여기에서 가져올 수 있습니다.
- 템플릿 스크립트: 다운로드 링크(기본 명령/맞춤 값을 추가해야 함:앱, 벨소리 경로, 부팅 애니메이션…)
- 템플릿 ZIP: 다운로드 링크 (예시를 통해 설명을 더 잘 이해할 수 있습니다. 파일을 구성하는 방법을 이해하는 데 도움이 될 수 있습니다.)
템플릿은 사용자 정의 스크립트를 사용하기에 충분해야 합니다.
플래시 가능한 zip이 일반적으로 대상으로 하는 /system 파티션의 주요 경로를 기억해야 합니다.
addon.d => backup script to survive a dirty flash (used by GApps package for instance) app and priv-app => system apps to add or remove etc => host file fonts => your font media => your bootanimation.zip media > audio > alarms => sounds for alarms media > audio > notifications => sounds for notifications media > audio > ringtones => sounds for ringtones media > audio > ui => sounds for various things such as low battery, unlock, camera,.. root of /system for build.prop file
이 경로에서 제거된 파일은 더티 플래시 후에 다시 설치되고 수동으로 추가된 파일은 제거된다는 점을 항상 기억하십시오. 이것이 /system 모드의 백업을 만드는 스크립트를 만드는 것이 필요한 이유입니다.
업데이트 스크립트의 예
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(" "); 문자 메시지용입니다. 이 줄은 아무 것도 하지 않습니다.
작업하기 전에 항상 파티션을 마운트 해제했다가 다시 마운트해야 합니다.
run_program("/sbin/busybox", "umount", "/system"); run_program("/sbin/busybox", "mount", "/system");
시스템 구성 요소/앱을 제거하려면 마지막 줄을 제외하고 각 줄 끝에 쉼표를 넣으십시오.
delete_recursive( "/system/app/adaway.apk", "/system/app/AdAway", ........................ "/system/priv-app/WeatherProvider", "/system/priv-app/Tag" );
설치하려는 시스템 파일의 압축을 풉니다.
package_extract_dir("system", "/system/"); Set the file permissions. set_perm(0, 0, 0755, "/system/addon.d/99-dirty.sh"); .............. set_perm(0, 0, 0644, "/system/priv-app/V4A-Magisk.apk");
/data 폴더에 대해 동일한 작업을 수행합니다. 따라서 파티션을 마운트하고 추가하려는 데이터를 추출하고 권한을 설정합니다.
run_program("/sbin/busybox", "mount", "/data"); package_extract_dir("data", "/data/"); set_perm(0, 0, 0755, "/data/local/afscript.sh");
다음으로 수정된 파티션을 마운트 해제합니다.
run_program("/sbin/busybox", "umount", "/data"); run_program("/sbin/busybox", "umount", "/system");
Addon.D 스크립트의 예
#!/sbin/sh # # /system/addon.d/99-dirty.sh # /system is formatted and reinstalled, then thes files are restored. # . /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
더티 플래시 이후에 보관하고 싶은 파일 목록을 만드세요.
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 더티 플래시 후 설치하고 싶지 않은 파일(수정 시 제거한 시스템 파일은 더티 플래시에서 다시 설치됨)
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 ;;
플래시 가능한 Android Zip을 만드는 방법
이를 위해 MiXplorer를 사용할 것입니다. MiXplorer는 최고의 Android 루트 탐색기이자 파일 관리자이기 때문입니다.
- 먼저 zip에 포함될 모든 폴더를 선택하고 아카이브를 선택합니다.
- 보관 파일 생성을 확인하고 이름을 지정한 다음 Store를 선택합니다.
- 플래시 가능한 zip이 생성되므로 zip 파일을 선택한 다음 서명(MiX 서명자 플러그인 사용)
- 이제 TestKey를 선택하여 서명 오류가 있는지 확인하십시오.
- 이제 zip을 플래시할 수 있습니다. 맞춤 복구에서 쉽게 찾을 수 있도록 /SDcard로 이동하는 것이 좋습니다.
최종 기록
플래시 가능한 zip은 깨끗한 플래시 후 또는 /system 파티션을 지우고 ROM의 더티 플래시를 수행한 후에 설치해야 합니다. updater-script는 스크립트에서 지정한 시스템 파일을 제거 및 추가하지만 addon.d 스크립트는 사용자의 간섭 없이 작업을 수행하기 때문에 그대로 두십시오.
첫 번째 설치 후 /system 파티션을 철저히 검사하여 모든 것이 올바른지 확인하십시오. 파일이 제거되었는지 등입니다. 파일 이름에 오타가 있어서 제거되지 않았을 수 있습니다.