Android
 Computer >> コンピューター >  >> トラブルシューティング >> Android

AndroidシステムMod用のフラッシュ可能ZIPを作成する方法【完全ガイド】

Android開発者の中で、/systemパーティション向けのアプリ(ルートアプリなど)を作成している方なら、アプリ用にフラッシュ可能な.zipファイルを作成したい場面があるはずです。これにより、アプリのファイルを/systemパーティションに正しくインストールできるようになります。

フラッシュ可能な.zipには、以下のような用途もあります。

  • DPIの変更
  • カスタムフォントの適用
  • カスタムブートアニメーションの適用
  • システムアプリの追加・削除

ユーザーにファイルシステムを直接操作して手動でファイルを移動するよう指示するのは、関係者全員にとって時間の無駄です。フラッシュ可能な.zipを作成する方がはるかに便利な方法です。このガイドでは、Android用のフラッシュ可能なzipの作成方法を解説します。

さらに、addon.dスクリプトの使い方も紹介します。これにより、カスタムシステム変更がROMのダーティーフラッシュ後も維持されるため、ユーザーはアップデートごとにzipを再フラッシュする必要がなくなります。

必要なもの

  • ルート権限で使えるファイルエクスプローラー(MiXplorer、Solid Explorerなど)
  • ZipSigner(zipへの署名用)。MiXplorerを使用する場合はMiX Signerプラグイン
  • Nandroidバックアップの取得を強く推奨

また、zipに含めるすべてのファイル(APK、設定ファイル、ブートアニメーションなど)を事前に準備しておきましょう。これは繊細な作業なので、作業開始前にすべて整理しておくことが重要です。

カスタムzipのテンプレート

自分のニーズに合わせてカスタマイズできるテンプレートzipや、フラッシュ可能なzip作成のベースとして使えるテンプレートが必要な場合は、以下から入手できます。

  • テンプレートスクリプト:ダウンロードリンク(基本コマンドのみ。アプリ、着信音のパス、ブートアニメーションなどの独自の値を追加する必要があります)
  • テンプレートzip:ダウンロードリンク(実例があると説明の理解が深まります。ファイルの構造化方法を把握するのに役立ちます)

テンプレートがあれば、カスタムスクリプトを使い始めるには十分でしょう。

フラッシュ可能なzipが通常対象とする/systemパーティション内の主要なパスを覚えておいてください。

addon.d => ダーティーフラッシュ後も生き残るバックアップスクリプト(GAppsパッケージなどで使用)
app および priv-app => 追加・削除するシステムアプリ
etc => hostsファイル
fonts => フォント
media => ブートアニメーション.zip
media > audio > alarms => アラーム音
media > audio > notifications => 通知音
media > audio > ringtones => 着信音
media > audio > ui => 低電力警告、ロック解除、カメラなどの各種効果音
build.propファイルは /system のルート直下

重要な注意点:ダーティーフラッシュとファイルの復元

これらのパスから削除されたファイルは、ダーティーフラッシュ後に再インストールされ、手動で追加したファイルは削除されることを常に覚えておいてください。だからこそ、/systemのModをバックアップするスクリプトを作成する必要があるのです。

アップデートスクリプトの例

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_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
}

次に、ダーティーフラッシュ後にインストールされたくないファイル(Modで削除したシステムファイルのうち、ダーティーフラッシュで再インストールされてしまうもの)を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の作成手順

ここでは、Android向けの最高のルートエクスプローラー兼ファイルマネージャーであるMiXplorerを使用します。

  1. まず、zipに含めるすべてのフォルダを選択し、「アーカイブ」を選択します。
    AndroidシステムMod用のフラッシュ可能ZIPを作成する方法【完全ガイド】
  2. アーカイブファイルの作成を確認し、名前を付けて「Store」を選択します。
    AndroidシステムMod用のフラッシュ可能ZIPを作成する方法【完全ガイド】
  3. フラッシュ可能なzipが作成されます。zipファイルを選択し、署名します(MiX Signerプラグインを使用)。
  4. 次に「TestKey」を選択して、署名エラーがないか確認します。
  5. これでzipをフラッシュできます。カスタムリカバリから見つけやすいよう、/SDcardに移動しておくことをおすすめします。

最後に

フラッシュ可能なzipは、クリーンフラッシュ後、または/systemパーティションをワイプしてからROMをダーティーフラッシュした後にインストールする必要があります。updater-scriptは、スクリプトで指定したシステムファイルの削除と追加を行いますが、addon.dスクリプトには触れないでください。こちらは何もしなくても自動的に機能します。

初回インストール後は、/systemパーティションを入念にチェックし、すべてが正しく処理されているか(ファイルが削除されているかなど)を確認しましょう。ファイル名のタイポにより削除されなかったというケースも実際に起こり得ます。

  1. AndroidスマホでZIPファイルを解凍する方法|圧縮(ZIP化)の手順も解説

    インターネットの普及により、世界中へのドキュメント共有は格段に簡単になりました。しかし、大容量ファイルの共有は依然として大きな課題でした。この問題を解決するために生まれたのが「zipファイル」です。zipファイルを使えば、大量の画像や動画を1つのファイルにまとめて送信できます。当初はPC向けの技術でしたが、現在ではスマートフォンの世界にも広く浸透しています。zipファイルを受け取ったものの、中身を開けられずにお困りの方も多いのではないでしょうか。この記事では、Androidデバイスでファイルを解凍する方法を詳しく解説します。 AndroidでZIPファイルを解凍する方法 ZIPファイルとは?

  2. AndroidでTelegramアカウントを作成する方法【初心者向け完全ガイド】

    Telegram(テレグラム)は、世界中で5億人以上のアクティブユーザーを抱える人気のインスタントメッセージングサービスです。WhatsAppやGoogleメッセージ、Signalなどの他のメッセージアプリに代わる優れた選択肢として知られています。近年は、楽しくて便利な機能が豊富なことから利用者が急増しており、注目を集めています。この記事では、AndroidスマートフォンでTelegramアカウントを作成する方法を、手順を追って詳しく解説します。 AndroidでTelegramアカウントを作成する方法 まず、多くのユーザーを魅了しているTelegramの主な機能をご紹介します。 複数の