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