HomeTips for NEC Terrain(改)>NEC Terrain(改) - nand unlock 編 -


■終了

 2018/7/21 20時頃に SIM を Terrain から Gemini PDA に移しました。
 以後、携帯するデバイスは Gemini PDA になり、Terrain は引退になります。
 約四年間使用。思ったよりも短い付き合いになりました。
 最初に使った Android デバイスで、Roott化、アプリ作成まで出来て予想以上に楽しかったです。が、お別れの時が来ました、左様なら・・・


■打ち止め、では無かった?

 ※ 2018/7 になりましたが、以下の状態から変わらずにフツーに使えてます!

 ↓下の記事で話題がでた Keyone 。直近で唯一の HKB付きスマフォ。 (GeminiPDA が出ました)

Keyone.jpg

 一瞬、買ってもいい気持ちになったのですが・・・ 調べてみると root を取るのが不可能らしいです。
 かつ、KB の日本語入力もいろいろ問題がありそうなレビューがちらほら。
 root が取れれば頑張って手直しする気にもなるのですが、それが出来ないとなると・・・一気に物欲が萎えました。

 という訳で TLS1.0 打ち切り問題の続き。

 Terrain のブラウザは Flash が動く Firefox バージョン45 をずっと使っていて、確かにコレは青空文庫のサイトにアクセス不可。
 しかし、最新ブラウザならば Android 標準API に因らず単体で TLS1.2 を実装しているとの事・・・試しに chrome の最新バージョンを入れると、確かに青空文庫のサイトにアクセスできます。
 例によって up to down で、Firefox の TLS1.2 の使えるバージョンを検証。

 ・48.0以下 はダメ。
 ・49.0.2 は TLS1.2 が使えました。
 ・51.0以上 になると、使っているジェスチャーアドオンが動かないので、イマイチ

 という訳で  Firefox 50.1.0 が良さそう。Flash はとうとう使えなくなりました、まあ仕方ないです・・・その代わり バージョン45 より起動はめちゃ早いです。

 この状態で7月まで様子見。 Terrain は未だ頑張れるかも!?
 この関連か分かりませんが、6月に以下が使えなくなっています。
 ・読書尚友 Free (青空文庫ビューア)のダウンロード
 ・amazon video
 ・amazon music

<おまけ>
 最近、google play 開発者サービス が大きくなって、ストレージを圧迫するようになってきた。こいつは PlayStore の更新を止めていても勝手に自動更新されます。
 ストレージ圧迫されると、Terrain の調子が目に見えて悪くなる・・・
 試しに LINK2SD で、SD に追い出したら調子良くなった。

photo_googleAP_01.png

 リンク作成中にエラーが出る事が有りますが、リトライすれば問題無く全て追い出せます。


■打ち止め

 恐らく Terrain の最終記事です。
 最近になって  読書尚友 Free (青空文庫ビューア) から、書庫をダウンロード出来ない事に気付きました。
 原因は(多分)青空文庫の aozora.gr.jp のサーバーが TLS 1.0 を無効化した為。
 TLS1.1/1.2 の API をサポートするのは android 4.1〜、Terrain の Android4.0.3 については、どうあがいても青空文庫サーバーから直接ダウンロードすることは出来ない。更に言えばブラウザで青空文庫のサイトを開く事すら出来ない。
 大手のサーバーは軒並み 2018年6月末 をめどに TLS 1.0 を無効化する見込みらしい・・・

 という訳で、Terrain の限界が予想よりも早く来てしまいました。
 次は Keyone 位しか無いなぁ、非常に使いにくそうだけど。
 んー、[es]は8年も使ったのに、Terrain は4年使えなかった・・・まだ暫くは使い続けると思いますが、この記事が最終となるでしょう。であであ・・・


■Lolipop(5.0)以降で通知アイコンに色を付ける

 Terrain には全く関係ない、一般的記事です。
 EcoCtlを修正して、通知領域のアイコンで状態を分かる様に修正中。Android5.0でテストしたら通知アイコンが真っ白になって判別不能。
 何なんだろうと思って調べたら、Lolipop(5.0)以降では OS の仕様でアイコンが白くなってしまう様です。
 さて、ちょっと前に修正した BKlightCtl は通知アイコンの色で明るさ設定を判別するようにしたが・・・こいつは Lolipop(5.0)でもちゃんと色が付いている。
 全く同じアイコンを使ってみても、EcoCtl は色が付かず、BKlightCtl は色が付く!?

 ↓エミュレータ画面、Terrainって名前だけど、Android6.0です。左は赤くて、右が白い・・・
Photo_notify_icon.png

 いろいろ試したところ AndroidManifest.xml の android:targetSdkVersion を 20以下にすると色を残せる様です。
 もちろんその場合、21 以降の API は使えません。参考までに。

 ちなみに、Terrain はまだメイン機で使ってます。EcoCtl の修正は Terrain で Amazonミュージックを使う為の修正です。


■マルチタップランチャー

 その昔 [es] 用に 3Clicks というアプリが有り、ダブルクリック、トリプルクリックに操作を割り当てられました。
 Android ではキーフック出来ないので諦めていましたが・・・HOMEアプリにするとHOMEタップが拾える! と言うことで Android版マルチタップランチャーです。 こいつの登録数に制限はありません。

Multi Launcher



 初め、Multilauncher V2 を少し手直ししたら、メインの処理はすぐ出来たので「簡単」と思ったのですが。その後の細かい部分で地獄の泥沼が待っていました。大したこと無いように見えると思いますが、Android の謎の制限、画面スタックの勝手な制御、等の為に、追加処理がてんこ盛りです。Android5.0 以上で試すと、更に動かず。またまた余計な処理が必要になりました。サンプル動画は Terrain ですが Android5.0 以上では動画みたいに画面が透けません。Android が裏で余計なことをする為です。どうしようもないです。

 Terrain ならば「HOMEタップ→ハードキー押下」の操作で全キーに割り当て、と言う機能追加も可能ですが・・・
 設定画面を作るのも面倒だし、要望する人も殆どいないと思うので見送り。強い要望があれば対応しても良いです。


■PCとのファイル交換

 久しぶりの更新。Terrain 固有の記事ではありませんが、root化デバイスが対象です。
 PCとファイル交換をする場合、普通は USB で繋いで、MTP/mass storage のモードに切り替えます。1つのファイルだけを処理したい時等そこそこ面倒です。
 WiFi 経由で接続して、PC側のエクスプローラに android のストレージを表示できればラクそう。調べると、android をファイルサーバにする必要があり、面倒そうなので一時保留 →最近になって再トライしてみたところ予想よりもずっと簡単に出来ました。

Samba Filesharing for Android (要root)

 基本的に、↑これをインストールするだけです。↓初期起動画面。
photo_samba_01.png

 右下のメニューから、設定画面を呼び出せます。
photo_samba_02.png

 Username と Password で、PCから接続するときの認証情報を設定。Workgroup Name は設定不要。
photo_samba_03.png

 NETBIOS Name で PCから見た android のサーバ名を設定。
photo_samba_04.png

 ・Unix Extensions : PC でのみ接続する場合はは不要。
 ・No local Master Browser : android が local Master Browser にならないようにする。
photo_samba_05.png

 ・Screen Wake Lock : Samba Filesharing が前面にいる時に、画面がロックしないようにする。
 ・Wifi Wake Lock : WiFi の速度が抑制されるのを防止。
 ・Multicast Lock : NETBIOS Name を使用する場合はチェック要。
photo_samba_06.png

 起動画面の「samba」のタイトルをタップすると、有効になります。↓は Wifi 接続していない状態。
photo_samba_07.png

 Wifi 接続すると、接続を検知して、下記の画面になる。表示されている IPアドレスか、NETBIOS Name で接続できます。(WiFi切断すると前の画面に戻ります。)
photo_samba_08.png

 同じ Wifi に繋いでいる PC のエクスプローラから \\Terrain を入力すると認証画面が出ます。
 サーバ名\Username / Password を入力(Username だけを入れると、Win7 は認証情報を永続的に記憶してくれません)。
photo_samba_09.png

 エクスプローラに Terrain のストレージが表示されました。もちろん全てのファイル操作が可能です。
 PC から接続中も、ストレージがアンマウントされる事はありません、PC、android 両方からファイル操作可能。また、MTP と違ってファイル更新日も分かるのが有り難い。
 ただし処理速度は遅いです。転送速度は USB の半分程度。またファイル一覧の更新処理が遅い為か? 転送するファイル数が増えるほど遅くなります。
photo_samba_10.png

 このままでも十分に使えますが、、、この先は、こんな事もできます的お話し。

 Samba Filesharing を Enable にしておけば、Wifi の接続状態を見て自動起動・停止します。ただ、この場合、Wifi 接続中は必ず起動中になってしまいます。
 使うときだけ起動しようとすると、WiFi接続 → Samba Filesharing を開く → 手動Enable、の3ステップが必要。
 これを1ステップで出来るようにしてみます。

 @Wifi の接続状態による自動起動・停止を止める
 アイコン(リソースファイル)差替 の記事のやり方で、AndroidManifest.xml (以下)を取り出し。
 <action android:name="android.net.wifi.STATE_CHANGE"/> を削除して、apkを再構成しインストール。自動起動・停止が止まります。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.funkyfresh.samba">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:name=".samba" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:configChanges="keyboardHidden|orientation" android:label="Preferences" android:name="Preferences" android:screenOrientation="behind"/>
        <receiver android:enabled="true" android:name="WifiSambaReceiver">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <data android:scheme="file"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
                <data android:scheme="file"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
                <action android:name="android.net.wifi.STATE_CHANGE"/>
                <action android:name="com.funkyfresh.samba.RESTARTSAMBA"/>
                <action android:name="com.funkyfresh.samba.STOPSAMBA"/>
                <action android:name="com.funkyfresh.samba.RECONFIGURED"/>
                <action android:name="com.funkyfresh.samba.NEWPASSWD"/>
            </intent-filter>
        </receiver>
        <service android:name="SambaFilesharingService">
            <intent-filter>
                <action android:name="com.funkyfresh.samba.SambaFilesharingService"/>
            </intent-filter>
        </service>
    </application>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
</manifest>
 A起動シェル
 ・WiFiが停止していたら、起動する。
 ・Samba Filesharing のサービスを起動する。
 ・WiFiが接続されるのを待って、Samba Filesharing を有効にする。
 ・Samba Filesharing 画面を表示
 ・ecoctl の WiFi自動停止を無効にする
#!/system/bin/sh
dumpsys wifi | grep 'Wi-Fi is enabled'
if [ "$?" -eq 0 ]
then
  echo 'enable'
else
  echo 'disable'
  svc wifi enable
fi
am startservice -n com.funkyfresh.samba/.SambaFilesharingService --ez useWifiLock true --ez useMcastLock true
i=0
while [ $i -lt 10 ]; do
echo $i
i=$((i+1))
dumpsys wifi | grep 'current HSM state: ConnectedState'
if [ "$?" -eq 0 ]
then
  echo 'connect'
  am broadcast -a com.funkyfresh.samba.RESTARTSAMBA
  am start -n com.funkyfresh.samba/.samba
  am startservice -n com.jp.ssipa.ecoctl/.MyService --es SERVICE_STATUS SET_SETTING --es SUB_STATUS WIFI_NW_CHECK --ez VALUEb false
  break
else
  echo 'disconnect'
fi
sleep 2s
done
exit 0
 B停止シェル
 ・Samba Filesharing を無効にする。
 ・ecoctl の WiFi自動停止を有効にする
#!/system/bin/sh
am broadcast -a com.funkyfresh.samba.STOPSAMBA
am startservice -n com.jp.ssipa.ecoctl/.MyService --es SERVICE_STATUS SET_SETTING --es SUB_STATUS WIFI_NW_CHECK --ez VALUEb true
 A、Bのシェルを、 Terminal Shortcut Pro で、HOME画面から呼び出せるように登録。(ショートカットのアイコンも、好きな物にリソース差し替え)
photo_samba_11.png

 HOME 画面から、起動・停止が出来るようになりました。
photo_samba_12.png


■二周年

 Terrain を使い始めて二年たったので、再レビュー・・・ 最近は余り新しい話題はありません。

◆見た目
 相変わらず外観の劣化は全く無いです。ケース未使用ですがキズも増えないし裏面もマットなままで全くテカりません。安っぽさを感じさせない所が良いです。
 Shiftキーが Ctlキーに変わりました。通常の入力で Ctl + UIOP 変換 & Ctl + XCV を多用する為。これで英カナ全半選択、切り貼りが自由自在。Shiftキーは Push-to-Talk(Convenience)キーに、Push-to-Talk(Convenience)キーは Speaker キーに移動。
 四方向カーソルと Ctrl、Shift が使えてこその QWERTY キーボードです。入力のしやすさは最高。
 実は、訳有って Xperia Z4 も使っていますが、入力が面倒なので Z4 はサブ機、Terrain がメイン機。ちなみに今回の写真は Z4 で撮影、流石に写真の綺麗さでは負けます(汗

◆nand unlock その後
 現在 SYSTEM 領域の実質使用量は約 1GB 程度。一部の人からも報告ありましたが、この状態で使うと安定度が下がります。日に1回〜2回、何の前触れもなく突然リセットがかかる・・・
 結局、SYSTEMストレージの使用量が元々の上限の 780MB を越えると徐々に安定度が落ちる様です(理由は不明)。

 標準機能でアプリの一部を SDカードに移動しても良いのですが、標準機能は制限が多いので Link2SD を再び復活。(使い方はこちら
 LINK2SD はブート後にソフトリブートが必要なので、起動時スクリプトの boot.sh を以下に修正。

#!/system/bin/sh
if test -f /data/local/tmp/softreboot
then
rm /data/local/tmp/softreboot
exit 0
fi
touch /data/local/tmp/softreboot
#for swap
busybox swapon /dev/block/vold/179:35
echo 60 > /proc/sys/vm/swappiness
#for LINK2SD
mount -t ext2 /dev/block/vold/179:34 /data/sdext2
#soft reboot
test -f /data/local/tmp/softreboot && setprop ctl.restart surfaceflinger
test -f /data/local/tmp/softreboot && setprop ctl.restart
 LINK2SD で一部SDに移し、SYSTEMストレージの使用量を 780MB 700MB 以下にすると安定しました。

 実質 780MB までしか使えないし、起動時にソフトリブートするなら nand unlock の意味が無い様に見えるかも!?
 でも 780MB を越えることが全く出来ないのと、一時的に 2GB まで使えるのでは、やっぱり使い勝手が結構違います。nand unlock 出来るなら、やって損は無いと思います。

◆SYSTEM バックアップ
 システムストレージのフルバックアップは便利です。約5分でバックアップもレストアも可能。 nand unlock の大きなメリットの1つ。
 バックアップイメージを別の Terrain にレストアしても問題なく状態移行されて、使用できました。
 現在は SYSTEMストレージサイズを 4GB も使わないので 2GB に縮小。2GBにするとddコマンド一回でバックアップ、レストアできるので更にラクです。
 なお LINK2SD 等で SD に移している場合は、バックアップ前に全て SYSTEMストレージに戻しておく必要があるので注意。

◆アプリいろいろ、特に Terrain 用に便利なアプリを幾つか。

ComittoN
 マンガviewer。
 最初は Perfect Viewer を使っていましたが、Perfect Viewer は画像を拡大して頁を送ると元の拡大率に戻ってしまいます。
 ComittoN は画像を拡大して頁を送っても拡大率をキープしてくれるので、画面が小さい Terrain 向き。処理速度も Perfect Viewer より速い。 ただし自動縦横回転してくれないので普通の画像Viewerには使えません。

bVNC: Secure VNC Viewer
 VNC viewer
 これまた Terrain の小さな画面でもちゃんと使える VNC viewer
 動作モードが 4つあるのですが、タッチパッドモードがおすすめ。 接続後、右下メニューから Inpur Mode−Simulated touchpad を選択。
photo_bVNC_01.png photo_bVNC_02.png
 Android の標準とは違って、PC のタッチパッドの様にマウスカーソルを動かします。最初は違和感が有りますが、慣れれば小さな画面でも細かい操作ができます。タップで左クリック、BACK で右クリックです。

Calsma 関数電卓
 数式電卓。
 数式電卓は幾つかありますが、良さそうなのは Android4.0 に対応してない物が多かった。Terrain で使えて最も使いやすかったのがコレ。Androidアプリにしては、珍しくヘルプがしっかりしているのも良い。

DSP manager (Play Store には無いので、apkをアップします)
 インストール後 Settings−Sound−Music effects で DSP manager を選択。その後、DSP manager を起動すると設定画面が出るので、設定。
 「ベースブースト」と「バーチャルルームエフェクト」はかなり効きます。
 ※ダイナミックレンジコンプレッションは有効にするとヘンになるので、使用しないように注意。

Amazonビデオ (旧バージョンの apk をアップします)
 Amazonプライム会員は、無料でプライムビデオが見放題。Android 上でも Amazonビデオアプリ を使えば視聴可能です、が、最新バージョンは Android4.0 否対応・・・
 過去に 4.0 対応していた旧バージョンをアップしておきます。
 LTE が使えない Terrain でもストリーミング再生可能(画質は若干荒い)。
 ダウンロードも出来ますが旧バージョンではダウンロード先に SD を選択できず SYSTEMストレージ固定。でも nand unlock で領域拡張してあれば映画1本位は余裕でダウンロード出来ます。
 安定性が気になる場合は LINK2SD の有料版(238円)を使えばダウンロード後のデータを SD へ移動可能。この状態でそのまま SD へダウンロードできれば良かったのですが、残念ながら出来ませんでした。

Firefox 45.0.2 と  Adobe Flash 11.1.115.81
 Android ブラウザで唯一 Flash が動く組み合わせ。最新バージョンでは動きません・・・。上のリンクで旧バージョンを取れます。
 Windows 版の Firefox も徐々に Flash が動かなくなっています。Windows 版では 48.0.2 辺りまでか・・・?

◆その他、幾つか

・バッテリーは1つ目を使用中、まだ劣化は有りません。

・システムストレージ上の /data/tmp/tmpEn が 100MB位 になっている事有り。消しても問題ありません。定期的に消しましょう。

・NFCの反応が悪いと思っていましたが、叩くように接触させると比較的反応が良いようです。

・ヘッドフォンジャックを直接使うと若干ノイズが聞こえますが、BT 経由にすると無くなります。

・ソフトリブート  やり方に以下の2つ有り。 Aだと安定度が下がる気がします、@の方が良さそう。
@
setprop ctl.restart surfaceflinger
setprop ctl.restart
A
busybox killall system_server


■アイコン(リソースファイル)差替

 今回も Terrain 固有の記事ではありません。
 Android でのアイコン変更方法について調べました。まずは簡単なホーム画面のアイコン変更方法。いろいろやり方はありますが、例えば・・・
  QuickShortcutMaker(ショートカットツール)

 これを使えばホーム画面のアイコンを好きな画像に変えられます。更に、このアプリはアプリの画面毎にショートカットを作れる事もできます。ホーム画面を使いやすくしたい人にはオススメ。

 ここまでは前振りで、これからが本題です。
 ウィジェットのアイコンを変えたい場合、QuickShortcutMaker でも無理です。
 例えば   Wi-Fiテザリングスイッチャー これはホームからテザリングの ON/OFF できて、かつ WiFi が ON の時は自動で WiFi を OFF/ON してくれる便利ツール。 ですが、ON/OFF がアイコンからちょっとわかりにくい。
 ↓これはテザリング OFF(赤枠)
photo_icon_01.png

 ↓これは テザリング中
photo_icon_02.png

 ウィジェットのアイコンを変更したい場合、apk 内のリソースの画像を差し替える必要があります。リソースファイルを差し替えるツールは Windows ならば Resource Hacker が有名。
 Android で Resource Hacker と同じ事をやってみます。
 以下の手順でできる筈ですが、やったのがかなり前なので手順不足等あったらすいません。
 なお、リソース差し替え作業には java と Android SDK をセットアップした PC が必要です。

◆Apktool の入手
 右のURLより ・Apktool の最新 と ・23 Dec 2012 - Scripts r05-ibot Released を入手 https://ibotpeaches.github.io/Apktool/

◆Apktool の配置
 apktool_x.x.x.jar を apktool.jar にリネーム
 Scripts r05-ibot Released から  apktool.bat、apktool.jar を展開
 java と Android SDK をセットアップした PC の 〜\android-sdk\tools\ 配下に apktool.jar、apktool.bat、apktool.jar を配置する。

◆apk展開バッチファイル
 以下の内容の展開用バッチファイルを作成。下線部は PC に合わせて修正。

@echo off
echo Set Parameter
set JDK_DIRECTORY=C:\Program Files\Java\jdk1.8.0_65
set ADK_DIRECTORY=C:\Program Files\Android\android-sdk
set path=%path%;%JDK_DIRECTORY%\bin\;%ADK_DIRECTORY%\tools\;%ADK_DIRECTORY%\platform-tools\
echo Backup APK
copy /y "%~dpnx1" "%~dpnx1.bak"
echo Expand APK
"%JDK_DIRECTORY%\bin\java" -jar "%ADK_DIRECTORY%\tools\apktool.jar" d "%~dpnx1"
pause
◆apk再構成用バッチファイル
 以下の内容の再構成用バッチファイルを作成。下線部は PC に合わせて修正。
@echo off
echo Set Parameter
set JDK_DIRECTORY=C:\Program Files\Java\jdk1.8.0_65
set ADK_DIRECTORY=C:\Program Files\Android\android-sdk
set KEYSTORE_FILE=%ADK_DIRECTORY%\apktool_keystore
set KEY_ALIAS=mykey
set KEYSTORE_PASS=password1234
set path=%path%;%JDK_DIRECTORY%\bin\;%ADK_DIRECTORY%\tools\;%ADK_DIRECTORY%\platform-tools\
echo Check Keystore
if not exist "%KEYSTORE_FILE%" "%JDK_DIRECTORY%\bin\keytool" -genkey -keystore "%KEYSTORE_FILE%" -validity 10000 -alias %KEY_ALIAS% -storepass "%KEYSTORE_PASS%" -keypass "%KEYSTORE_PASS%"
echo Rebuild APK
"%JDK_DIRECTORY%\bin\java" -jar "%ADK_DIRECTORY%\tools\apktool.jar" b "%~dpn1" -o "%~dpn1_rebuild.apk"
echo Set Keystore
"%JDK_DIRECTORY%\bin\jarsigner" -keystore "%KEYSTORE_FILE%" -storepass "%KEYSTORE_PASS%" -digestalg SHA1 "%~dpn1_rebuild.apk" "%KEY_ALIAS%" -tsa http://timestamp.digicert.com
pause
◆apk展開
 上で作成した2つのバッチファイルと、処理したい apk を1つのフォルダに格納します。
 インストール済アプリから apk を取り出すツールはたくさんあるので、適当なヤツを使って下さい。私が使っているのはこれ↓
  apk抽出

 フォルダに配置したら、apk を展開用バッチにドラッグ&ドロップします。DOS窓が開いて、以下のようになれば展開成功。
Set Parameter
Backup APK
        1 個のファイルをコピーしました。
Expand APK
I: Using Apktool 2.0.3 on Wi-Fi テザリング スイッチャー.1.1.6.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\ssipa\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
続行するには何かキーを押してください . . .
 フォルダ内に apk のバックアップと、apk 名前でリソースを展開したフォルダが作られます。

◆リソース変更
 展開されたリソースの変更したいファイルを差し替えます。
 例えば、Wi-Fi テザリング スイッチャー であれば、〜\Wi-Fi テザリング スイッチャー.1.1.6\res\drawable-hdpi-v4 配下にアイコン用の PNG ファイルがあるのでそれを差し替えます。
 アイコンは通常 〜\res\drawable-xx フォルダに格納されます。
 drawable-xx が複数ある場合は画面の解像度用に分けているのですが、ファイル名が同じ場合は一番大きい物を残して他を削除しても問題ない筈。

◆apk再構成
 元の apk を今度は再構成用バッチにドラッグ&ドロップします。DOS窓が開いて、以下のようになれば展開成功。
 初回実行時のみ、キー生成用の情報を聞いてくるので適当に入力します。最後の「y」以外はでたらめで問題有りません。
Set Parameter
Check Keystore
姓名は何ですか。
  [Unknown]:  ssipa
組織単位名は何ですか。
  [Unknown]:  x
組織名は何ですか。
  [Unknown]:  x
都市名または地域名は何ですか。
  [Unknown]:  x
都道府県名または州名は何ですか。
  [Unknown]:  x
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:  ja
CN=ssipa, OU=x, O=x, L=x, ST=x, C=jaでよろしいですか。
  [いいえ]:  y
Rebuild APK
I: Using Apktool 2.0.3
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
Set Keystore
jarは署名されました。
続行するには何かキーを押してください . . .
 フォルダ内に XXX_rebuild.apk というファイル名で新しい apk が作成されます。この apk をインストールすれば完了。

 ↓テザリング OFF
photo_icon_03.png

 ↓これは テザリング中
photo_icon_04.png

 画像以外に、画面やメニューの文字列を差し替える事もできます。後 AndroidManifest.xml を変更して 本体リソースへのアクセスを制限するなんて事もできます。


■AtokSet(ATOK 入力モード改善)

 その昔、[es]用に AtokSet というアプリを作りました。タスク毎に ATOK の初期入力モードを設定出来るという物で、個人的には重宝しました。
 重宝したので、実は AtokSet for Windows(ExImeCtlSet) も作成。
 まじめに作るのが面倒だったので半分はスクリプトです。それでもしっかり動いていて、今もバリバリ現役。これが無いと結構不便です。ちなみに、AtokSet for Windows は ATOK で無くても動く筈。

 で、Android 版
 親切なアプリは適切な入力モードを選択してくれるのですが、中にはノーコンもあります。
 特にターミナルソフトはノーコン(初期入力が日本語になる)ものしか見つけられず、使っていて結構イライラします。
 とは言っても、Andoroid では自分以外のプロセスを原則コントロール出来ないので、はなから諦めていました。
 が、、、最近になって出来るかもしれない、、、 となり、トライ。
 紆余曲折の末、非常に幸運!な事に、完成できました。

  AtokSet for android

 なぜ「幸運」かと言うと、今回のやり方で制御出来るのは

 のみだからです。
 「Google日本語入力」も「nicoWnnG」もダメでした。(泣
 ただし上記の条件であれば(自分のTerrainでしか試してませんが)パーフェクトに制御できます。とりあえずは満足。
 それにしても Android の制約の多さにはイヤになります。特に 5.0 以降はヒドイ様です。将来は WindowsPhone もいいかな、と思ってしまいました。


■インテント発行

 今回も Terrain 固有の記事ではありません。
 EcoCtl のメニューに手動で同期を開始する機能がありますが、それを呼び出そうとすると EcoCtl の画面を呼び出さなければならないのが面倒です。
 作りとしては画面の Activity から Service に Intent を投げているので、他の手段でも Intent を投げれば処理を呼び出せる筈。
 調べてみると「am コマンド」を使えば出来るらしい。

◆画面の呼出、以下の様なコマンドをシェルから投入すれば出来ます。

am start -n com.jp.ssipa.ecoctl/.MainActivity
 -n の後ろに指定する 画面名(Activity名)は、 QucikShortcutMaker を使えば調べられます。

◆サービスの呼出、以下の様なコマンドでサービスにIntent送信出来ます。
am startservice -n com.jp.ssipa.ecoctl/.MyService --es SERVICE_STATUS setSyncForRequest
 --es はIntentにStringの情報を付加するオプション、「SERVICE_STATUS」はKEY 「setSyncForRequest」がvalue。
 これを付けたIntentを送ると EcoCtl は手動同期が動くように作ってある(何を送るかはアプリの作りに拠る)。

 で、これを投入してみるのですが、何故か動かず、、、
 いろいろトライした結果、Root権限で投入すると動きました。Webで調べた限りではそれっぽい情報は見つかりません、Terrain固有なのでしょうか?
 ちなみに、root権限が必要なのは、サービスに対するIntent送信だけの様です。
 BKLightCtl で画面輝度を任意に変更する事も可能。
画面)am startservice -n com.jp.ssipa.bklightctl/.MyService --es SERVICE_STATUS TEST_S --ei TESTVALUE {0-255}
キー)am startservice -n com.jp.ssipa.bklightctl/.MyService --es SERVICE_STATUS TEST_K --ei TESTVALUE {0-255}
 サービスの呼出は常駐していなくても、アプリがインストールされていれば動作します。

◆ブロードキャスト
 ブロードキャストの送信は、root権限不要。例えば MediaVolCtlのウィジェットを置いた状態で以下を送ると、メディア音量のミュートを切替られます。
ミュート)am broadcast -a com.jp.ssipa.mediavolctl.ACTION_MUTE
ミュート解除)am broadcast -a com.jp.ssipa.mediavolctl.ACTION_MUTE_OFF


■メディア音量調整

 今回は Terrain 固有の記事ではありません。
 Android で操作性の悪いメディア音量。「メディア音量」でググルと似たような話題がたくさん出てきます。私はヘッドフォンでしか音楽は聴かないので、ヘッドフォンの着脱に合わせてミュート/ミュート解除して欲しい。
 探せばアプリが有りそうですが、要望にぴったり合うアプリを探すのも面倒になったので自作。

  MediaVolCtl(メディア音量自動ミュート)

 ウィジェットなんて皆作っているから簡単なのかと思ったら結構難しかった。更に Bluetooth ヘッドフォンも対応してみたけど、それも難しかった。


■システムストレージのフルバックアップ

 新リカバリモードからシステムストレージのバックアップを取ってみます。
 アプリを入れシステムストレージを 1GB 程度を使用している状態で bu_data.sh の内容を元にバックアップを取ると、tar が途中で止まってしまいます、、、
 tar ではサイズが大きくなるとダメな様です。
 tar がダメなので、次ぎに ddコマンドでトライ。現在のパーティションサイズが 4GB なので 4GB を dd すると、これもまた最後でエラーになってしまいます。
 試しに 2GB だけを dd すると正常終了。パーティションサイズが 2GB 以下でないとバックアップがとれない、、、と思いましたが、dd なので二分割して 2GB × 2回で処理すれば問題無い筈です。
 以下、現在のシステムストレージパーティション。

13         2818048        11206655   4.0 GiB     8300  userdata
 以下、バックアップ手順(パーティションサイズが違う場合は、skip、count の値、回数を変える必要有り)
 SDカードの /external_sd/ 直下に、前半 2GB を userdata_bk1.bin 後半 2GB を userdata_bk2.bin としてコピーします。
D:\>adb reboot recovery
D:\>adb shell
RECOVERY:/ # mkdir /mnt/extsd
RECOVERY:/ # mount /dev/block/mmcblk1p1 /mnt/extsd
RECOVERY:/ # dd if=/dev/block/mmcblk0 of=/mnt/extsd/userdata_bk1.bin bs=512 skip=2818048 count=4194304
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.0GB) copied, 234.750984 seconds, 8.7MB/s
RECOVERY:/ # sync
RECOVERY:/ # dd if=/dev/block/mmcblk0 of=/mnt/extsd/userdata_bk2.bin bs=512 skip=7012352 count=4194304
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.0GB) copied, 208.850145 seconds, 9.8MB/s
RECOVERY:/ # sync
RECOVERY:/ # umount /mnt/extsd
RECOVERY:/ # exit
D:\>adb reboot
 正常にリストアできるか試してみます。↓バックアップ時のインストール状態。
photo_backup_01.png

 ↓A1 SD Bench をアンインストール。
photo_backup_02.png

 以下、リストア手順。
D:\>adb reboot recovery
D:\>adb shell
RECOVERY:/ # mkdir /mnt/extsd
RECOVERY:/ # mount /dev/block/mmcblk1p1 /mnt/extsd
RECOVERY:/ # dd if=/mnt/extsd/userdata_bk1.bin of=/dev/block/mmcblk0 bs=512 seek=2818048
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.0GB) copied, 417.448192 seconds, 4.9MB/s
RECOVERY:/ # sync
RECOVERY:/ # dd if=/mnt/extsd/userdata_bk2.bin of=/dev/block/mmcblk0 bs=512 seek=7012352
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.0GB) copied, 414.721318 seconds, 4.9MB/s
RECOVERY:/ # sync
RECOVERY:/ # umount /mnt/extsd
RECOVERY:/ # exit
D:\>adb reboot
 ↓アンインストールした A1 SD Bench が元に戻りました。起動等も問題なし。
photo_backup_03.png

 CLASS10 の SDカードで 4GB のシステムストレージのフルバックアップが約8分、フルレストアが約15分。
 単純にフルバックアップ、フルレストアが出来るのはありがたいです。


■音声通話問題の対処

 alex-kas 方式で root化すると音声通話で音声が聞こえなくなります(私だけ?)。一度スピーカー音声にして戻すと直って以後音声が出るようになりますが、再起動でまた同じ状態に戻るので、この状態で使い続けるのは厳しいです。
 一旦は全戻しをかけたのですが、組み合わせた状態でも使用できることに気が付きました。
 alex-kas 方式で root化し、必要な /SYSTEM 配下の変更を完了した状態で、bootイメージだけを戻します。
 以下手順例。

◆前作業

 ・SDカードの brnects0.715フォルダに、オリジナルの bootイメージを boot.current.bin として格納。
 ・デバッグモードの Terrain を PC に接続。

◆bootイメージ戻し

adb reboot recovery
adb shell
mkdir /mnt/extsd
mount /dev/block/mmcblk1p1 /mnt/extsd
dd of=/dev/block/mmcblk0p9 if=/mnt/extsd/brnects0.715/boot.current.bin
umount /mnt/extsd
exit
adb reboot
 これで通話が正常にできるようになりました。root権限、テザリングも使えるし、SYSTEMストレージは拡張した状態で使えます。
 この状態で出来ないのは /SYSTEM 配下の変更ですが、変更したい時は同じ手順で bootイメージを kas.boot.bin で差し替えれば /SYSTEM 配下を変更可能な状態に切替えられます。インストールアプリ、データはそのまま、何の影響も無く切替可能。
 /SYSTEM 配下をリアルに変更できないのはちょっと残念ですが、実際使う上で問題は殆ど無いので許容範囲。

 その他の変更、、、 新bootイメージの状態で、/system/xbin配下に、busyboxと、よく使うコマンドを ln で追加登録。
photo_unlock_10.png
 お世話になっていた Link2SD は不要になってしまったので削除。 SD Speed Increase も、なぜかバッファ追加すると落ちやすくなる?(気がする)ので削除。
 以上で、今回のカスタマイズは一旦完了です。


■出荷状態に戻す

 alex-kas 方式で root化した場合、標準の Factory data reset を呼び出しても戻らず、状態がおかしくなります。
 以下の手順で、出荷状態まで戻せました。
 手順については入力するコマンドだけを順番に羅列しています。root化を実施した人ならば、何をやっているかは分かると思います。

◆戻しに必要なファイル

 ・オリジナルのリカバリイメージ (◆準備 で取得したファイル)
 ・オリジナルのブートイメージ (◆ブートイメージの置換 で退避される boot.current.bin)
 ・オリジナルの build.prop (◆バックアップ の ./bu_system.sh で採取した system.tar を展開すると取り出せます)
 ・リカバリイメージの戻し用シェル restore_recovery.sh (元のリカバリパーティションが 618496 〜 638975 の前提で作成、違う場合は修正要)
 ↑4ファイルのアーカイブ reset for nec_terrain-master.zip (オリジナルのブートイメージはファイル名を kas.boot.bin に変えてあります)

 ・SYSTEMストレージのユーザ領域とPHONEストレージのバックアップ(◆バックアップ で SDカードの brnect08.715フォルダに退避)

◆前作業

 ・SDカードの brnects0.715 フォルダに以下を格納しておく。
  −オリジナルのブートイメージ boot.current.bin を kas.boot.bin にリネームして格納
  −オリジナルの build.prop
 ・/data/local/tmp 配下に以下を格納しておく。
  −オリジナルのリカバリイメージ org.recovery.bin
  −run_root_shell (root化作業で配置されています)
 ・/SYSTEM配下に自分で追加したファイルは削除されないので自分で削除しておく(更新したファイルは元に戻る)。
 ・デバッグモードの Terrain を PC に接続。

◆userdata、GROW パーティション戻し ◆リカバリーモード実行

・パーティションサイズ戻し
adb reboot recovery (リカバリモードにする)
adb shell
cd /rbin
gdisk
/dev/block/mmcblk0
d
13
d
14
n
13
2818048 ←元の No.13 開始セクタ
4456447 ←元の No.13 終了セクタ
8300
n
14
4456448 ←元の No.14 開始セクタ
13565951 ←元の No.14 終了セクタ
8300
c
13
userdata
c
14
GROW
w
y
exit

・再フォーマット
adb reboot recovery
adb shell
mkfs.vfat /dev/block/mmcblk0p14
mkfs.ext4 -b 1024 -i 4096 /dev/block/mmcblk0p13

・内容をバックアップから戻す
./rr_data.sh
./rr_system.sh (bu_system.shを実施している場合)

・終了
exit
◆su と Superuser の削除 ◆リカバリーモード実行
adb reboot recovery
adb shell
mount /dev/block/mmcblk0p12 /system
rm /system/xbin/su
rm /system/app/Superuser.apk
exit
◆boot.bin と build.prop の戻し(SDカードのファイルを登録) ◆リカバリーモード実行
adb reboot recovery
adb shell
cd /rbin
./flash_boot.sh
exit
◆recovery イメージの戻し(/data/local/tmp/org.recovery.bin を登録) ◆ノーマルブート実行
adb reboot
adb push restore_recovery.sh /data/local/tmp/restore_recovery.sh
adb shell
cd /data/local/tmp
chmod 755 ./restore_recovery.sh
./run_root_shell -c ./restore_recovery.sh

・終了
exit
adb reboot

■起動時にスクリプト実行

 alex-kas 方式では、起動時に動くシェルが有りません。
 Android で一般的なのは、起動スクリプトの /init.rc から呼び出される /system/etc/install-recovery.sh に処理を追記する方式です。
 しかし、Terrain では /system/etc/install-recovery.sh は存在しないし、/init.rc 内で /system/etc/install-recovery.sh の呼出がコメントアウトされているので、この方式は使えません。
 調べた限りでは rootin.7z 方式と同様、VpnFaker を使うのが一番無難な様です。
 以下、登録手順。

 1.Vpnfaker for nec_terrain-master.zip をダウンロード、任意のフォルダに展開する。
 2.Terrain のデバッガを ON にして、ADB を使用できる PC に USB接続。
 3.PC の CommandPrompt を開いて、カレントフォルダを展開したフォルダに移動。
 4.以下のコマンドを投入

adb push boot.sh /data/local/tmp/boot.sh
adb push busybox /data/local/tmp/busybox
adb push onBoot /data/local/tmp/onBoot
adb push run_root_shell /data/local/tmp/run_root_shell
adb push vpnfaker.sh /data/local/tmp/vpnfaker.sh
adb push VpnFakerV2.tar.gz /data/local/tmp/VpnFakerV2.tar.gz
 5.以下のコマンドを投入
D:\>adb shell
shell@android:/ $ su
shell@android:/ # chown 0.0 /data/local/tmp/busybox
shell@android:/ # chown 0.0 /data/local/tmp/run_root_shell
shell@android:/ # chmod 777 /data/local/tmp/boot.sh
shell@android:/ # chmod 755 /data/local/tmp/busybox
shell@android:/ # chmod 755 /data/local/tmp/onBoot
shell@android:/ # chmod 755 /data/local/tmp/run_root_shell
shell@android:/ # chmod 755 /data/local/tmp/vpnfaker.sh
shell@android:/ # exit
shell@android:/ $ cd /data/local/tmp
shell@android:/data/local/tmp $ ./run_root_shell -c ./vpnfaker.sh
Device detected: NEC-NE-201A1A (126460101)
Attempt acdb exploit...
NEC-NE-201A1A (126460101) is not supported.
Attempt fj_hdcp exploit...
Attempt msm_cameraconfig exploit...
Detected kernel physical address at 0x80208000 form iomem
Attempt put_user exploit...
VpnFaker install...
uid=0(root) gid=0(root)
 これで登録完了できた筈。
 起動時に /data/local/tmp/onBoot が呼び出され、onBoot から 一時root で /data/local/tmp/boot.sh が呼び出されます。
 なので、/data/local/tmp/boot.sh のスクリプトが起動時に自動実行されます。

 6.起動時に swapon を行うようにしてみます。
 今は LINK2SD を削除したので、SWAP は SDカードの2番目のパーティションになっています。boot.sh に以下のように記載。
#!/system/bin/sh
#mount SWAP(ext_SD 2nd partition)
/data/local/tmp/busybox swapon /dev/block/vold/179:34
echo 60 > /proc/sys/vm/swappiness
exit 0 #exiting
 ↓起動後に自動的に swapon されました。
shell@android:/ $ busybox free
busybox free
             total         used         free       shared      buffers
Mem:        671144       622996        48148            0        23540
-/+ buffers:             599456        71688
Swap:      1054716            0      1054716

■rooted & nand unlock

 alex-kas/nec_terrain による rooted & nand unlock を実施してみました。この方式で/SYSTEMの書き換え、パーティションの切り直し、等が可能になります。
 逆に今までは何をやっても Factory data reset で元に戻せたのですが、今回の作業後は Factory data reset は使えなくなります。 rooting7z方式 との差を簡単に整理すると、、、

メリット
 ・/SYSTEM配下の内容を直接変更できる
 ・SYSTEMストレージとPHONEストレージ(合計5248MB)の配分を変更できる
 ・SYSTEMストレージとPHONEストレージのフルバックアップ・レストアができる
 →たくさんインストールして使用容量が大きいとシェルが途中で停止します、通常のバックアップには使えません。
 →(2016/01/16) SYSTEMストレージのフルバックアップ・レストアできました。PHONEストレージも同様の手順で出来る筈。

デメリット
 ・失敗すると端末文鎮化
 ・Factory data reset が出来なくなる(別の手順で元に戻す事は可能)
 ・音声通話で音声が聞こえない、、、一度スピーカー音声にして戻すと直って以後音声が出るようになるが、再起動でまた同じ状態に戻る。(個人的には致命的)
 →(2015/12/29) bootイメージのみオリジナルに戻す事で回避しました。

 現時点で見えている使用上の大きな差異はこれくらいです。それを踏まえて「やるぞ!」と言う人はこの後に進んでみてください。
 基本 alex-kas/nec_terrain に書かれている手順に沿って進めていますが、異なる点は ※ で記載しています。
 バッチファイルを使わずコマンドを手投入しているので、投入するコマンドに下線を付けておきました。
 始める前に、手順を作ってくれた alex-kas/nec_terrain 、2ch Terrain スレの皆様、いつもながら助言して頂いた師匠に御礼申し上げたいと思います。


◆やっている事の概要 (The idea

 1.run_root_shell(一時root) を使用して、リカバリパーティションを移動
 2.run_root_shell(一時root) を使用して、移動したパーティションに root権限で動作する新しいリカバリイメージを格納
 3.新リカバリモード(root権限)で起動
 4.新リカバリモードから、新ブートイメージ置換、ストレージ切り直し、su格納を行う

◆準備 (Exploit mandatory pre-requisits

 以下が必要。
 ・Factory data reset した Terrain (初期化状態でないと上手く行きません)
 ・ADB接続できる PC
 ・microSDHC (4GB以上)を刺しておく
 ・alex-kas/nec_terrain の 「Download ZIP」から nec_terrain-master.zip をダウンロードする → 中身を展開してPCのどこかに配置。
 ・※ 32bitWinPC を使っている人 ADBドライバ NEC Terrain ADB and CDC Serial.zip(今回、再登録が必要です)
 ・※ もし今 root が使えているなら、オリジナルのリカバリイメージをバックアップする。ADBシェルから
  /system/bin/dd if=/dev/block/mmcblk0 of=/data/local/tmp/org.recovery.bin bs=512 skip=618496 count=20480
  ↑のコマンドを投入。/data/local/tmp/org.recovery.bin に出力されるファイルを保存。(必須作業では無いが出荷状態に戻す時には必要)

◆GPTテーブルの確認 (Stock GPT. THE MOST CRUCIAL PART) ◆ノーマルブート実行

 Terrain にSDカードを刺しデバッグモードを ON にして、PCに接続します。
 WEBではいきなりGPTテーブル一覧が出てきてびっくりするけど 「一致しているか確認しろ」 と言っているだけ。そもそも、一致しているに決まっている筈。
 nec_terrain-master 内の recoveryフォルダ内 adbtestgpt.bat (↓以下の内容)を実行しろと書いてあるけど、、、

adb push run_root_shell /data/local/tmp
adb push sgdisk /data/local/tmp
adb shell chmod 755 /data/local/tmp/run_root_shell
adb shell chmod 755 /data/local/tmp/sgdisk
adb shell /data/local/tmp/run_root_shell -c '/data/local/tmp/sgdisk -p /dev/block/mmcblk0'
 ※ この通りにやっても上手く行きません。↑4行目までを1行ずつ手実行した後 ↓最後の行は以下の様に投入します。
D:\>adb shell
shell@android:/ $ /data/local/tmp/run_root_shell -c '/data/local/tmp/sgdisk -p /dev/block/mmcblk0'

Device detected: NEC-NE-201A1A (126460101)
Attempt acdb exploit...
NEC-NE-201A1A (126460101) is not supported.
 :
 一部省略
 :
Partitions will be aligned on 2-sector boundaries
Total free space is 348587 sectors (170.2 MiB)
Number  Start (sector)    End (sector)  Size       Code  Name
   1           32768          294911   128.0 MiB   0700  modem
   2          294912          425983   64.0 MiB    FFFF  flashbackup
   3          425984          557055   64.0 MiB    FFFF  fatallog
   4          589824          590335   256.0 KiB   FFFF  sbl1
   5          590336          590847   256.0 KiB   FFFF  sbl2
   6          590848          594943   2.0 MiB     FFFF  sbl3
   7          594944          595967   512.0 KiB   FFFF  aboot
   8          595968          596991   512.0 KiB   FFFF  rpm
   9          596992          617471   10.0 MiB    FFFF  boot
  10          617472          618495   512.0 KiB   FFFF  tz
  11          618496          638975   10.0 MiB    FFFF  recovery
  12          638976         2801663   1.0 GiB     8300  system
  13         2818048         4456447   800.0 MiB   8300  userdata
  14         4456448        13565951   4.3 GiB     FFFF  GROW
  15        13565952        13582335   8.0 MiB     8300  persist
  16        13582336        14319615   360.0 MiB   8300  cache
  17        14319616        14462975   70.0 MiB    8300  tombstones
  18        14462976        14465023   1024.0 KiB  FFFF  misc
  19        14465024        14465025   1024 bytes  FFFF  pad
  20        14465026        14465041   8.0 KiB     FFFF  ssd
  21        14465042        14471185   3.0 MiB     FFFF  modemst1
  22        14471186        14477329   3.0 MiB     FFFF  modemst2
  23        14477330        14483473   3.0 MiB     FFFF  fsg
  24        14483474        14483985   256.0 KiB   FFFF  sbl2_bkp
  25        14483986        14488081   2.0 MiB     FFFF  sbl3_bkp
  26        14488082        14489105   512.0 KiB   FFFF  aboot_bkp
  27        14489106        14490129   512.0 KiB   FFFF  rpm_bkp
  28        14490130        14491153   512.0 KiB   FFFF  tz_bkp
  29        14491154        14511633   10.0 MiB    FFFF  recovery_bkp
  30        14511634        14532113   10.0 MiB    FFFF  fota_config
  31        14532114        14990865   224.0 MiB   FFFF  MM
 ↑Terrain のストレージ全体の GPT が出力されます。全部を確認する必要は無く、以下をチェックする。
  ・No. 3 が 〜557055
  ・No. 4 が 589824〜
  ・No.11 が 618496 〜 638975
  ・No.13 が 2818048〜
  ・No.14 が 〜13565951
 もし万一、この数字が違う場合はこの後の手順内で一部数字を変える必要有り。

◆SDカードの準備 (micro-SD card

 いろいろ書いてあるけど、普通に FAT32 でフォーマットして刺しておけば大丈夫な筈。

◆リカバリパーティションの移動とリカバリイメージの置換 (Installing new recovery) ◆ノーマルブート実行

 flash_recovery.sh が勝手にやってくれますが、ここが今回の最も中核の作業。
 flash_recovery.sh の中身は以下↓ 下線の数字が GPT No.3の終了+1、No. 4の開始-1 になっている必要がある。flash_recovery.sh でリカバリパーティションの移動とリカバリイメージ(kas.recovery.bin)の置換を行っています。
#!/system/bin/sh
# remapping recovery partition to a standard hole
/data/local/tmp/sgdisk -d 11 /dev/block/mmcblk0 #deleting
/data/local/tmp/sgdisk -n 11:557056:589823 /dev/block/mmcblk0 #re-creating
/data/local/tmp/sgdisk -c 11:recovery /dev/block/mmcblk0 #naming
#/data/local/tmp/sgdisk -t 11:FFFF /dev/block/mmcblk0 -v
# flashing recovery
/system/bin/dd if=/data/local/tmp/kas.recovery.bin of=/dev/block/mmcblk0 bs=512 seek=557056 #flashing
/system/bin/sync #syncing
exit 0 #exiting
 ※ 元の WEB に 〜you must save it under the name kas.boot.bin locally on your pc〜 という記述があるけど誤記、nec_terrain-master 内の recoveryフォルダ内の kas.recovery.bin をそのまま使えば良い。
 nec_terrain-master 内の recoveryフォルダ内 recovery\adbr.bat (↓以下の内容)を実行する。
 ※ run_root_shell と sgdisk はその前の手順で格納されているので、不要。
adb push run_root_shell /data/local/tmp
adb push sgdisk /data/local/tmp
adb push kas.recovery.bin /data/local/tmp
adb push flash_recovery.sh /data/local/tmp
adb shell chmod 755 /data/local/tmp/run_root_shell
adb shell chmod 755 /data/local/tmp/sgdisk
adb shell chmod 755 /data/local/tmp/flash_recovery.sh
adb shell /data/local/tmp/run_root_shell -c '/data/local/tmp/flash_recovery.sh'
 ※ adbtestgpt.bat が上手く行かなかったので、この後の全ての作業は .bat の内容を1行ずつ手実行しています。(シェルは、adb shell内から実行)なので、bat を直接実行した時の見え方・動作については確認していません、、、

 ファイルを格納後 flash_recovery.sh を adb shell から実行する。
D:\>adb shell
shell@android:/ $ cd /data/local/tmp
shell@android:/data/local/tmp $ ./run_root_shell -c '/data/local/tmp/flash_recovery.sh'

Device detected: NEC-NE-201A1A (126460101)
Attempt acdb exploit...
NEC-NE-201A1A (126460101) is not supported.
Attempt fj_hdcp exploit...
Attempt msm_cameraconfig exploit...
Detected kernel physical address at 0x80208000 form iomem

Attempt put_user exploit...
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
20480+0 records in
20480+0 records out
10485760 bytes transferred in 1.582 secs (6628166 bytes/sec)
◆ブートイメージの置換の準備 (Placing new boot image) ◆ノーマルブート実行

 新しいブートイメージ(kas.boot.bin)と build.prop をSDカードの brnects0.715 フォルダに移送します。
 nec_terrain-master 内の bootフォルダ内 adbb.bat (↓以下の内容)を実行する。
adb shell "mkdir /mnt/external_sd/brnects0.715"
adb push kas.boot.bin /mnt/external_sd/brnects0.715
adb push build.prop /mnt/external_sd/brnects0.715
◆新リカバリモードで起動(ADBドライバの再登録) (Placing new boot image) ◆リカバリーモード実行

 PCから adb reboot recovery を投入。
D:\>adb reboot recovery
 Terrain 上で NEC ロゴがでて再起動し、真っ黒画面になります。
 ※ 本来であれば、ここで新リカバリモードに adb shell で入れるのですが、初回は PC がデバイスを認識できない筈。リカバリモードのベンダーIDとプロダクトIDが変わっている為と思われます。
 デバイスマネージャを開くと、↓こうなっている。

unlock_01
 nec_terrain-master 内の systemフォルダ内の adbfb.tar.gz に 新リカバリモード向けの 64bit用adbドライバ一式があるのでそれを解凍。
 解凍内の Android Composite ADB Interface フォルダ内に、◆準備で用意した32bit用ドライバの i386フォルダーをコピー。(64bitWinを使っている人は不要)
 デバイスマネージャのエラー項目(NEC-NE-201A1A)を右クリックし「ドライバーソフトウェアの更新」から↑のドライバを登録すると、デバイスを認識できる筈(認識後のデバイス名は Android Composite ADB Interface)。

 PC が認識すれば、adb shell で接続できます。以後の作業は、新リカバリモード上から実施していきます。
D:\>adb shell
RECOVERY:/ # ← root権限で動作
◆ブートイメージの置換 (Placing new boot image) ◆リカバリーモード実行

 新リカバリイメージ内に用意されている /rbin/flash_boot.sh を実行。
 flash_boot.sh の中身は↓以下。オリジナルを boot.current.bin にバックアップ。kas.boot.bin と build.prop を置換してます。
#!/sbin/sh
SBRD='/mnt/extsd/brnects0.715'

mkdir /mnt/extsd
mount /dev/block/mmcblk1p1 /mnt/extsd
mkdir $SBRD
dd if=/dev/block/mmcblk0p9 of=$SBRD/boot.current.bin
dd of=/dev/block/mmcblk0p9 if=$SBRD/kas.boot.bin
mount /dev/block/mmcblk0p12 /system
cd /system
cp $SBRD/build.prop .
chown 0:0 build.prop
chmod 644 build.prop
cd /
umount /system
umount /mnt/extsd
exit 0
 書き込み前に、オリジナルの bootイメージが SDカードの brnects0.715フォルダに boot.current.bin としてバックアップされます。flash_boot.sh を2回動かすと、オリジナルが消えてしまうので、原則1回だけ実行しましょう。
 flash_boot.sh を adb shell から実行した結果↓
RECOVERY:/ # cd /rbin
RECOVERY:/rbin # ./flash_boot.sh
mkdir: can't create directory '/mnt/extsd/brnects0.715': File exists
20480+0 records in
20480+0 records out
10485760 bytes (10.0MB) copied, 0.388006 seconds, 25.8MB/s
20480+0 records in
20480+0 records out
10485760 bytes (10.0MB) copied, 2.041355 seconds, 4.9MB/s
 完了したら、adb shell から抜け、adb reboot で再起動します。
RECOVERY:/rbin # exit
D:\>adb reboot
◆バックアップ (Backup) ◆リカバリーモード実行

 SYSTEMストレージのユーザ領域とPHONEストレージのバックアップを、SDカードの brnect08.715フォルダに取ります。(この後のパーティションサイズ変更でフォーマットをかける為、その後の戻し用)
 新リカバリイメージ内に用意されている /rbin/bu_data.sh を実行する。
 bu_data.sh を実行した結果↓
D:\>adb reboot recovery
D:\>adb shell
RECOVERY:/ # cd /rbin
RECOVERY:/rbin # ./bu_data.sh
app/
app-private/
backup/
backup/pending/
backup/pending/journal-2014489731.tmp
backup/com.android.internal.backup.LocalTransport/
 :
 一部省略(数百行)
 :
Notifications/
Notifications/hangout_dingtone.m4a

※元の手順にはありませんが、初期状態に戻すときには /SYSTEM のバックアップが有った方が良いので取っておきます。(必須作業では無いが出荷状態に戻すときには必要)

RECOVERY:/rbin # ./bu_system.sh
◆パーティションサイズ変更 (Actual re-partitioning) ◆リカバリーモード実行

 新リカバリイメージ内に用意されている gdisk を使って、SYSTEMストレージとPHONEストレージのパーティションサイズを変更します。
 No.13 の開始の 2818048、No.14 の終了の 13565951 は変えられません。
 サイズの計算方法は ( 終了セクタ − 開始セクタ + 1 )/ 2048 = ××× MB
 ↓オリジナルのサイズ
  13         2818048         4456447   800.0 MiB   8300  userdata
  14         4456448        13565951   4.3 GiB     FFFF  GROW

 ↓WEBの手順での見直しサイズ
  13         2818048        13303807   5.0 GiB     8300  userdata
  14        13303808        13565951   128.0 MiB   FFFF  GROW

 ※ PHONEストレージが128MBでは少なすぎると思われたので、今回はこのサイズにしました。
  13         2818048        11206655   4.0 GiB     8300  userdata
  14        11206656        13565951   1.1 GiB     8300  GROW
 gdisk は対話形式で作業を行います。使うコマンドは以下。
  ・p パーティション一覧の表示
  ・d パーティションの削除
  ・n パーティションの作成
  ・c パーティション名の変更
  ・w 結果を反映して終了
  ・q 結果を反映しないで終了

 gdisk を対話実行した結果↓ 最後に adb reboot recovery で再起動します。
RECOVERY:/rbin # gdisk
gdisk
GPT fdisk (gdisk) version 0.8.4
Type device filename, or press  to exit: /dev/block/mmcblk0
/dev/block/mmcblk0
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): d
d
Partition number (1-31): 13
13
Command (? for help): d
d
Partition number (1-31): 14
14
Command (? for help): n
n
Partition number (13-32, default 13): 13
13
First sector (34-15269854, default = 2801664) or {+-}size{KMGTP}: 2818048
2818048
Last sector (2818048-13565951, default = 13565951) or {+-}size{KMGTP}: 11206655
11206655
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8300
8300
Changed type of partition to 'Linux filesystem'
Command (? for help): n
n
Partition number (14-32, default 14): 14
14
First sector (34-15269854, default = 11206656) or {+-}size{KMGTP}: 11206656
11206656
Last sector (11206656-13565951, default = 13565951) or {+-}size{KMGTP}: 13565951
13565951
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8300
8300
Changed type of partition to 'Linux filesystem'
Command (? for help): c
c
Partition number (1-31): 13
13
Enter name: userdata
userdata
Command (? for help): c
c
Partition number (1-31): 14
14
Enter name: GROW
GROW
Command (? for help): p
Disk /dev/block/mmcblk0: 15269888 sectors, 7.3 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 98101B32-BBE2-4BF2-A06E-2BB33D000C20
Partition table holds up to 32 entries
First usable sector is 34, last usable sector is 15269854
Partitions will be aligned on 2-sector boundaries
Total free space is 348587 sectors (170.2 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1           32768          294911   128.0 MiB   0700  modem
   2          294912          425983   64.0 MiB    FFFF  flashbackup
   3          425984          557055   64.0 MiB    FFFF  fatallog
   4          589824          590335   256.0 KiB   FFFF  sbl1
   5          590336          590847   256.0 KiB   FFFF  sbl2
   6          590848          594943   2.0 MiB     FFFF  sbl3
   7          594944          595967   512.0 KiB   FFFF  aboot
   8          595968          596991   512.0 KiB   FFFF  rpm
   9          596992          617471   10.0 MiB    FFFF  boot
  10          617472          618495   512.0 KiB   FFFF  tz
  11          557056          589823   16.0 MiB    8300  recovery
  12          638976         2801663   1.0 GiB     8300  system
  13         2818048        11206655   4.0 GiB     8300  userdata
  14        11206656        13565951   1.1 GiB     8300  GROW
  15        13565952        13582335   8.0 MiB     8300  persist
 :
 一部省略
 :
  31        14532114        14990865   224.0 MiB   FFFF  MM
Command (? for help): w
w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
y
OK; writing new GUID partition table (GPT) to /dev/block/mmcblk0.
The operation has completed successfully.
RECOVERY:/rbin # exit
D:\>adb reboot recovery
◆フォーマット (Formatting) ◆リカバリーモード実行

 パーティションを切り直した領域を、リカバリモード内からフォーマットします。
 No.13 のフォーマットは時間が少しかかり、途中で止まっているように見える所もありますが、じっと待ちましょう。
D:\>adb shell
RECOVERY:/ # mkfs.vfat /dev/block/mmcblk0p14
RECOVERY:/ # mkfs.ext4 -b 1024 -i 4096 /dev/block/mmcblk0p13
mke2fs 1.41.12 (17-May-2010)
 :
 一部省略
 :
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
◆バックアップから復元 (Restoring your files) ◆リカバリーモード実行

 パーティション変更前の◆バックアップから復元します。新リカバリイメージ内に用意されている /rbin/rr_data.sh を実行する。
 rr_data.sh を実行した結果↓
RECOVERY:/ # cd /rbin
RECOVERY:/rbin # ./rr_data.sh
app/
app-private/
backup/
backup/pending/
backup/pending/journal-2014489731.tmp
backup/com.android.internal.backup.LocalTransport/
 :
 一部省略(数百行)
 :
Notifications/
Notifications/hangout_dingtone.m4a
RECOVERY:/rbin # exit
D:\>adb reboot
◆su、Superuser.apk の登録 (Placing su and Superuser.apk) ◆リカバリーモード実行

 adb reboot recovery でリカバリモードにします。
D:\>adb reboot recovery
 nec_terrain-master 内の systemフォルダ内 adbs.bat を実行するのですが adbs.bat の内容が間違っています。
 ※ カレントフォルダをnec_terrain-master 内の systemフォルダに移動した後、adbs.sh の内容を参考に ↓以下の内容を実行する。
adb push su /tmp
adb push Superuser.apk /tmp
adb push flash_superuser.sh /tmp
adb shell chmod 755 /tmp/flash_superuser.sh
adb shell /tmp/flash_superuser.sh
 最後にノーマルリブートして全完了です。
D:\!Data\system>adb reboot
◆動作確認
D:\>adb shell
shell@android:/ $ su
shell@android:/ # ← root権限で動作!
 ↓SYSTEMストレージが 3.75GB になりました。今までの使用アプリをインストール済&一切SDに移動していない状態でも余裕有りです。
photo_unlock_02.png photo_unlock_04.png

 ↓PHONEストレージは 1.12GB。
photo_unlock_03.png

 ↓テザリングも普通に使えました。
photo_unlock_05.png

 ↓日本語を表示すると、例によって中華フォント。例えば「今」がおかしいです。
photo_unlock_06.png

 /system/fonts 配下
photo_unlock_07.png

 ESファイルエクスプローラのrootモードで、/system/fonts 配下を更新。
 元の DroidSansFallback.ttf → DroidSansFallback_.ttf にリネーム。日本フォントの DroidSansFallback.ttf を新規追加できました。
photo_unlock_08.png

 再起動すると「今」の表示が直りました。同じようにして、キーマップも書き換え出来ました。
photo_unlock_09.png

 rootin.7z の root化方式と比較して足りてない点(必要ならば自分でやりましょう)。
 ・/system/xbin/busybox の格納(/system/xbin/配下に直接追加できます)
 ・APN の登録
 ・不要なプリインストールアプリのDisable化
 ・日本語化(MoreLocale2 を入れる)
 ・XposedInstaller のインストール

 使っていたアプリを全てインストールして数日使いましたが、前述のデメリット以外は安定性を含めて全く問題有りません。
 後、標準の Factory data reset をすると黒画面のまま返ってこなくなります。電池を抜けば無理矢理再起動できますが、状態はおかしくなっています。
 購入状態に戻すにはそれなりの手順が必要ですが、それについてはこちらで。
 & BOOT時の swapon 呼出方法についてはこちらで。


■以前の記事

inserted by FC2 system inserted by FC2 system