Skip to content

Instantly share code, notes, and snippets.

@reindex-ot
Last active May 26, 2024 14:20
Show Gist options
  • Save reindex-ot/3b453682b61d45ccc5bcfb2d645bb85a to your computer and use it in GitHub Desktop.
Save reindex-ot/3b453682b61d45ccc5bcfb2d645bb85a to your computer and use it in GitHub Desktop.
Android dump img.

Androidの各種imgのバックアップ

SUが入ったGSI、KernelSUが存在する現在、imgのバックアップは容易になっています。
Bootloader Unlockさえやれれば誰でもやれるのでチャレンジしてみましょう。
DSUまたはKernelSUに対応している物が対象です。非対応機は対象外です。 Notion版はこちら

下準備

DSUを使う場合

  • Bootloader Unlock済みのデバイス
  • DSU Sideloader
  • ADBとFastbootの環境 (基本中の基本なので必ずやりましょう)
  • SUが入ったGSI (Magiskで既にroot化している場合は、必ず通常の状態に戻してください)
  • Magisk (緊急時に使います)

KernelSUを使う場合

  • Bootloader Unlock済みのデバイス
  • KernelSU (apkと適したimg)
  • ADBとFastbootの環境 (基本中の基本なので必ずやりましょう)

バックアップを行なう

注意: それぞれ、Bootloader Unlockがされている状態が前提です。

DSUの場合

  1. DSU SideloaderにSUの入ったGSIを選択して「Data Size」を16GBあたりにする

  2. DSU SideloaderがGSIのインストールを行なうための処理を開始します

  3. 処理後にコマンドの入力を求めるので

adb shell sh "/storage/emulated/0/Android/data/vegabobo.dsusideloader/files/install"

を実行します

  1. 実行後にAndroidの通知にDSUのインストールのプログレスバーが表示されていればインストールが行なわれています

  2. 完了後に再起動を促されるので「再起動」を選択します

  3. GSIが適していればGSIが起動します

  4. PC上でadb shellsu$#になったらOK

  5. 以下は「共通の操作」に続く

KernelSUの場合

  1. KernelSUのapkをインストールしてそのデバイスに適したboot.imgをダウンロードします。

  2. ダウンロードしたimgを以下のコマンドで操作

fastboot boot XXXX.img (XXXX.imgはimgのパス)

注意: 絶対にfastboot flash bootを実行しないでください。KernelSUのimgが焼かれてしまいます。

  1. 再起動後にKernelSUが「作動中」かつPC上でadb shellsu$#になったらOK

  2. 以下は「共通の操作」に続く

共通の操作

注意: Qualcomm、MediaTekで若干コマンドが変わります。

Qualcommの場合

cd /dev/block/bootdevice/by-name/

MediaTekの場合

cd /dev/block/by-name/

Qualcomm側のコマンドを実行時に「ディレクトリがない」とエラーが出た場合はそちらのパターンにすれば変更できると思います。 QualcommとMediaTekの記述のみですが、DSUまたはKernelSUが対応しているROMであればSoCは関係なしにやれます。

すべてのimgをバックアップする

  1. 上記にあるcdのコマンドを実行

  2. バックアップのディレクトリを作成のコマンドを実行

mkdir /sdcard/backup_img
  1. imgをバックアップするコマンドを実行
  • Qualcomm用
for file in *; do
    if [[ "${file}" = cache* || "${file}" = userdata* ]]; then continue ; else dd if=/dev/block/bootdevice/by-name/"${file}" of=/sdcard/backup_img/"${file}".img ; fi
done
  • MediaTek用
for file in *; do
    if [[ "${file}" = cache* || "${file}" = userdata* ]]; then continue ; else dd if=/dev/block/by-name/"${file}" of=/sdcard/backup_img/"${file}".img ; fi
done

MD5でファイルが一致しているか確認を行なう場合は以下のコマンド

echo "" > /sdcard/backup_img/md5.txt
for file in *; do
    if [[ "${file}" = cache* || "${file}" = userdata* || "${file}" = sda || "${file}" = sdb || "${file}" = sdc ]]; then continue ; else
	if cmp -s "${file}" /sdcard/backup_img/"${file}".img; then
		echo "${file} - OK" >> /sdcard/backup_img/md5.txt
	else
		echo "${file} - NG, you have to backup again!" >> /sdcard/backup_img/md5.txt
	fi
    fi
done

md5.txtが生成されています。

  1. 完了後にデバイスの内部ストレージ内にbackup_imgに各種imgが保存されているのでPCへコピー (DSUは再起動で通常のROMが起動します。DSUの通知が出たら「破棄」を選択してください)

注意: バックアップを保存した物にはデバイス固有のファイル(modemstなど)が含まれています、公開を行なう場合は固有のファイルは必ず削除してください。

  1. 緊急時

GSI経由でのバックアップ時に容量不足のエラーが出て保存に失敗する場合があります。
この場合はboot.imginit_bootをPCに保存してデバイスを一旦再起動します。

  • DSUの通知が表示されたときは「破棄」をしてください。
  • 保存したimgをMagiskでパッチを行なってfastboot flash bootまたはfastboot flash init_bootをしてMagiskでのroot化な状態にしてください
  • 次にバックアップ用のコマンドを実行でバックアップが完全に行えるはずです、バックアップ時のboot.imgまたはinit_boot.imgはパッチ済みなのでパッチ前な物に必ず差し替えてください

boot.imgまたはinit_boot.imgのみのバックアップ

各種のコマンドを実行で内部ストレージの直下に保存されます。
rootにするだけでいい方はそちらが楽なのでおすすめです。必ずパッチ前のimgはしっかりと残してください。

SUが入ったGSIまたはKernelSUを実行中に

adb shellsu

$から#にした後に以下を実行します。

Qualcommの場合
  • boot.img
dd if=/dev/block/bootdevice/by-name/boot$(getprop ro.boot.slot_suffix) of=/sdcard/boot.img
  • init_boot.img (カーネルバージョンがAndroid 13以降)
dd if=/dev/block/bootdevice/by-name/init_boot$(getprop ro.boot.slot_suffix) of=/sdcard/init_boot.img
MediaTekの場合
  • boot.img
dd if=/dev/block/by-name/boot$(getprop ro.boot.slot_suffix) of=/sdcard/boot.img
  • init_boot.img (カーネルバージョンがAndroid 13以降)
dd if=/dev/block/by-name/init_boot$(getprop ro.boot.slot_suffix) of=/sdcard/init_boot.img

modem、modemst、fsgのバックアップ

IMEIを消失させると厄介な事が多いのでこちらもやっておく事を推奨します。
これらのファイルはデバイス固有のファイルなのでファイルの公開は非推奨です。

SUが入ったGSIまたはKernelSUを実行中に

adb shellsu

$から#にした後に以下を実行します。

Qualcommの場合
cd /dev/block/bootdevice/by-name/
for file in *; do
    if [[ "${file}" == "modem" || "${file}" == "modemst1" || "${file}" == "modemst2" || "${file}" == "fsg" ]]; then dd if=/dev/block/bootdevice/by-name/"${file}" of=/sdcard/"${file}".img ; else continue ; fi
done
MediaTekの場合
cd /dev/block/by-name/
for file in *; do
    if [[ "${file}" == "modem" || "${file}" == "modemst1" || "${file}" == "modemst2" || "${file}" == "fsg" ]]; then dd if=/dev/block/by-name/"${file}" of=/sdcard/"${file}".img ; else continue ; fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment