Flashable zipで特定のファイルの中身を置き換える方法

この記事の賞味期限は切れています。
投稿から1年以上経過しているため、情報が古い可能性があります。

当サイトで紹介するMODやアプリなどの内、システムファイルの改変やシステムに深く関わるものはroot化やリカバリが必須となります(root化の必要なしと明記している場合は除く)。導入は自己責任で行ってください。また、技適の無い機器の使用は自己責任です。

ROMの更新など、システム全体を上書きしてしまうような操作をした後に、
更新前に適用していたファイルへの変更をZIPで簡単に戻せるようにできるzipの作り方を紹介します。



ファイルを丸ごと置き換える場合はAndroid Ultimate Toolbox Proなどの
ZIPを作成するツールを使えばできますが、ファイルの中の一部だけを変えないといけない場合
(build.propなど)では、丸ごと置き換えてしまうと問題が起きてしまいます。
そこで、ファイルを置き換えるのではなく、sedコマンドでファイルの中身を編集します。
サンプルのZIPをここからダウンロードしてください。
(前の記事のLEDライトを明るくするZIPです)
このZIPでは、
META-INF\com\google\android\updater-script
で、sm.shを端末にコピー→実行→sm.shを削除という動作をするようにしています。
sm.shの中身はこのようになっています。

#!/sbin/sh
MODIFIED=`cat /system/etc/flashled_calc_parameters.cfg|grep "AndroPlus_LED"`
if [ "$MODIFIED" ];
then
echo "Already done, no need to modify"
else
mount -o remount,rw /system
sed -i 's/if_indicator_level = 3125/if_indicator_level = 4125/g' /system/etc/flashled_calc_parameters.cfg
sed -i 's/if_torch_vr = 25000/if_torch_vr = 500000/g' /system/etc/flashled_calc_parameters.cfg
sed -i 's/max_if_torch_3a = 250000/max_if_torch_3a = 350000/g' /system/etc/flashled_calc_parameters.cfg
echo "# Modified - AndroPlus_LED" >> /system/etc/flashled_calc_parameters.cfg
mount -o remount,ro /system
fi

これを元に、好きなファイルの中身を編集できるようにします。
まず、

MODIFIED=`cat /system/etc/flashled_calc_parameters.cfg|grep "AndroPlus_LED"`
if [ "$MODIFIED" ]; 

の部分でZIPを適用済みか判断して、適用済みなら何もしないようにしています。
「/system/etc/flashled_calc_parameters.cfg」は変更したいファイルのパスに変え、
「AndroPlus_LED」は自分の名前を入れるなどして、元のファイルにない文字に変えてください。
最後の方にある

echo "# Modified - AndroPlus_LED" >> /system/etc/flashled_calc_parameters.cfg

で適用済みか判断するための文字を書き込んでいます。
先ほどと同じように、「/system/etc/flashled_calc_parameters.cfg」と「AndroPlus_LED」を変えてください。

mount -o remount,rw /system
mount -o remount,ro /system

は/systemのマウントなので、何も変えないでください。
変えたいファイルが/dataにある場合は、コマンドの/systemを/dataに変えてください。
次に、どのファイルのどこを書き換えるか指定します。
上記の例では

sed -i 's/if_indicator_level = 3125/if_indicator_level = 4125/g' /system/etc/flashled_calc_parameters.cfg

といったsedコマンドが三つあります。

sed -i 's/[書き換え前の文字列]/[書き換え後の文字列]/g' [書き換えるファイルのパス]

というようになっているので、例えば
build.propのro.sf.lcd_density=480をro.sf.lcd_density=420にしたい場合は、

sed -i 's/ro.sf.lcd_density=480/ro.sf.lcd_density=420/g' /system/build.prop

となります。
書き換える文字列の指定は正規表現を使えるので、

sed -i 's/ro.sf.lcd_density=.*/ro.sf.lcd_density=420/g' /system/build.prop

というように、「.*」を使ってro.sf.lcd_densityがどんな値であっても置き換える、ということができます。
正規表現の詳細については検索してください。
また、文字を置き換えるのではなく、その文字がある行に新しく行を追加したい場合は、

sed -i '/[文字列]/i [追加したい文字]' [書き換えるファイルのパス]

というふうにします。
書き換える文字列があるかどうか確認して、無ければ追加するという場合は

if [ -n "`grep \"[書き換え前の文字列]\" [書き換えるファイルのパス] `" ]; then
sed -i 's/[書き換え前の文字列]/[書き換え後の文字列]/g' [書き換えるファイルのパス]
else
echo "[書き換え後の文字列]" >> [書き換えるファイルのパス]
fi

というようにします。
例えば、ro.qcom.adがbuild.propにあるか確認して無ければ追加したいという場合は

if [ -n "`grep \"ro.qcom.ad\" /system/build.prop `" ]; then
sed -i 's/ro.qcom.ad=.*/ro.qcom.ad=1/g' /system/build.prop
else
echo "ro.qcom.ad=1" >> /system/build.prop
fi

とします。
sedコマンドの詳細はこのページなどに書かれています。
工夫次第で様々な操作を自動化できるので、ぜひ色々試してみてください。



コメントフォーム右上の「ログイン」メニューで各種SNSアカウントでログインできます。
匿名でコメントしたい場合は、名前とメールアドレスを入力した後「アカウントを作成せず投稿する」にチェックを入れてください。
Disqusに登録すると、返信通知を受け取れます。