MIPS Android(JZ4760)用nicoWnnG version 2011.1115.1 独自ビルド版

(2013/06/21 追記 start)
最新版は「MIPS Android(JZ4760)用nicoWnnG version 2013.0425.1 独自ビルド版」にて配布中。

(追記 end)


— 以下、元の記事 —
MIPS Androidで動作するnicoWnnGを2011/11/15時点での最新版(Version 2011.1115.1)にアップデートしました。(2011/11/15 12:10: 2011.1111.1→2011.1115.1 に差し替えました)

ダウンロード: nicoWnnG-2012.0325.1-mips.apk
ダウンロード: nicoWnnG-2011.1111.1-mips-2.apk (23:15 署名を忘れていたのを修正しました)
ダウンロード: nicoWnnG-2011.1115.1-mips.apk

[注意事項]
オリジナルのnicoWnnGがすでにインストールされていると、こちらの独自ビルド版はインストールに失敗します。
逆に、こちらの独自ビルド版があると、オリジナルのインストールに失敗します。

これは、この独自ビルド版は、オリジナルのnicoWnnGと同じソース・パッケージ名で作成されていますが、署名が異なっていることによるものです。

といっても、オリジナル版はMIPS用のライブラリが内蔵されていないので、そもそものインストールに失敗しますが・・・
なお、今回の独自ビルド版では、MIPS、MIPS-R2用のバイナリのみとし、オリジナル版に含まれるARM,x86用バイナリを削除しています。

ronzi(溶智) A3での動作確認をしました。(2011/11/14 23:15)

それ以外の機種での動作は未確認です。
過去のバージョンではAMT-7001を積んだICOO T22では動作しなかったようですが、MIPS-R2用バイナリを追加したこのバージョンでは動くといいんですが・・・

旧バージョン:
2011.0823.2版
2011.0503.1版

独自ビルド版のトピック
・いままでAndroid NDK for MIPSのr5bでコンパイルしていましたが、r6mに変更しました。
・いままでMIPS r1用のバイナリのみでしたが、MIPS r2用のバイナリも含めました。
・apk容量削減のため、MIPS用バイナリのみとしました。
・全体の再コンパイルは行わず、libディレクトリのみをapktoolを使って入れ替えています。

mbr-bootを作成してみる

NOVO7 Basicのfirmwareに入っていたx-bootのソースファイルからronzi A3で動くものを作ってみようと試みた。
目的としては、Cruz Tablet T301やNOVO7 BASICのように、SDカードに載せたupdate.zipからアップデートできないかなー、とか、そんなの感じで。

コンパイル手法は・・・
「make 機種名」で初期設定を行い
「make release_config」でデバグ系設定を取り除き
「make」でコンパイルを実行する
というものである。

ronzi A3の中を見ていると機種名として「lynx」とあったため、その関連と思われる設定を試した。

まず「nand」と「msc」という2種類のbootローダがあり、ronzi a3で必要なmbr-xbootを作成するのは、「msc」の方であった。

lynxのmsc向け設定は以下の3種類があり、コンパイルし書き込んで見たら、それぞれブラックアウトで起動してこなかった。
・lynx_msc_config
・lynx_jz4760b_msc_config
・lynx_jz4760b13_msc_config

画面が出てこないということは液晶操作系がうまくいっていないからかと判断。
とりあえず画面サイズである480×272を設定している箇所がどこかにないか調査。

boot/lcd/jz4760_lcd.c 内で設定されており、「CONFIG_JZ4760_ANDROID_LCD_AUO_A043FL01V2」という定数が指定されている場合に有効になる箇所に「480, 272」といった記載があることを発見。

この定数を定義しているのは「lepus_msc_config」の時のみだけであったため、「make lepus_msc_config」で作成してみたが、結果は変わらず。
「lepus_jz4760b_msc_config」は液晶コントローラが違うが、「make lepus_jz4760b_msc_config」で初期設定を行った後、手動でinclude/config.hに「#define CONFIG_JZ4760_ANDROID_LCD_AUO_A043FL01V2 1」を記載し、試行してみたがブラックアウト。

分解写真を見ると、液晶は「KD43G18-40NM-A1」らしい。
似た型番としえは「CONFIG_JZ4760_ANDROID_LCD_KD50G2_40NM_A2」というのがある。

型番の命名規則は以下のようになっているとのこと。(メーカであるK&DKD50G2-40NM-A2仕様書)
KD+「インチ」+「Productor Type」+「型番」-「インタフェースのPIN数」+「タッチパネルかどうか」+「LCDタイプ」-「レビジョン」

Productor Type: D=Digital photo frame DVD、G=GPS、M=MP、P=Mobil-Phone
タッチパネルかどうか: T=タッチパネル、N=Notタッチパネル
LCDタイプ: A=AUO、 M=CMO、 C=CPT、 P=PVI、 L=LG、 W=Wintek、 H=HSD、 T=Topply、 Y=Hydis、 I=Hitach、 S=Sharp

ということなので、GPS向けタッチパネル無しのCMO製の液晶を積んだモジュール、ということになるはずなんだけど、タッチパネル無しって・・・?

調べてみると「lepus_jz4760b_msc_config」が「CONFIG_JZ4760_ANDROID_LCD_KD50G2_40NM_A2」だったので、「make lepus_jz4760b_msc_config」で書き込んで見たが、かわらず。
次にboot/lcd/jz4760_lcd.c内のCONFIG_JZ4760_ANDROID_LCD_KD50G2_40NM_A2に関する定義で「800×600」を設定している箇所を「480×272」に変更したが、状況は変わらず。

それと平行して、どうやったらupdate.zipからのfirmware適用ができるのかを調べてみた。
発動条件が、ボリュームUPキーを押しながら電源ONということだったので、機種毎の設定があるinclude/configs/のファイルを見比べた。
その結果、「GPIO_KEY_VOLUME_INC」がボリュームUPキーの定義で、NOVO7 Basicの設定ファイルであろうnpm701.hでは「XBOOT_SEL_RCVR_KEY」に関連づけられていた。
もう1つ、「XBOOT_SEL_FAST_KEY」という機能は、ボリュームDOWNキーに割り当てられている。

Cruz Tablet T301の設定ファイルであるtablet_p2.hでは、「XBOOT_SEL_RCVR_KEY」は「GPIO_SW1=VOL ADD=ボリュームUP」に割り当てられており、「XBOOT_SEL_FAST_KEY」については未定義になっている。

さて、ronzi A3について見てみる。lynx.hかlepus.hのどちらがそうなのかによって、状況が違う。
lynx.hでは「XBOOT_SEL_RCVR_KEY」は「GPIO_KEY_MAIN」、おそらくMAINキーとはHOMEボタンに割り当てられている。
「XBOOT_SEL_FAST_KEY」は「GPIO_KEY_VOLUME_INC」に割り当てられているが、存在はしていない。

lepus.hでは「XBOOT_SEL_RCVR_KEY」は「GPIO_KEY_VOLUME_DEC」、ボリュームDOWNボタン
「XBOOT_SEL_FAST_KEY」は「GPIO_KEY_VOLUME_INC」、ボリュームUPボタンに割り当てられている。

このことから、ronzi A3は、やっぱりlynxなんじゃないかなーとは思う。

で、これを見る限りでは、ronzi A3でも、ちゃんとupdate.zipを作ってやれば、アップデートできる可能性があるのではないかと思う。

(recovery.img.cpioはsplit_bootimg.plでkernelとcpio.gzに分離できた。)

ronzi A3カスタムfirmware 20111024版

比較的おとなしいカスタマイズのカスタムfirmwareを用意しました。
具体的にはframework-res.apkの書き換えをやめて、ronziA3オリジナルのままにしています。
(2013/01/15 ダウンロードリンクを修正)

firmware base: ronzi公式配布のRK43_60WFRT_RZA3_20110511_1

Warning: wifi MAC address will be changed. All data lost! Also, /mnt/sdcard data lost, too!

change
* remove chinase apk.
* add LatinIME.apk and nicoWnnG.apk
* update market apk and google apk from slatedroid.com:[GUIDE] Cruz T10x / T301: Rooting, Dalvik Turbo, Removing Bloatware, Gapps & Market & More

– Android Market 3.1.3
– Google Maps 5.9.0
– Google Books 1.1.4
– Google Talk 1.3
– OI File Manager 1.16
– Spare Parts 2.3.5
– YouTube 2.0.26

* change some /system/build.prop value, it’s from Ramos V65PRO.
* add Dalvik Turbo VM and /data/local.prop
* support /system/etc/init.d/ files.
* add IngenicScreenCalibration.apk from Ramos V65Pro firmware
* add Japanese font file(/system/fonts/DroidSansJapanese.ttf).It’s MTLc3m.ttf.
* 132 dpi setting.

警告:
・無線LANのMACアドレスが変わります(USBtoolで適用するとかならず変わります)
・全部のデータが消えます。/mnt/sdcard のデータも消えます。(/mnt/sdcard1 は消えません)

変更点
・中華なapkを消しました
・英語圏用IMEと日本語圏用IME(nicoWnnG)を追加しました
・nicoWnnGの初期設定ファイル(/data/data/net.gorry.android.input.nicownng/shared_prefs/net.gorry.android.input.nicownng_preferences.xml)を置き、nicoWnnGを手動で有効にすればそれなりの設定ですぐ使えるようにした。
・マーケットなど以下のapkを[GUIDE] Cruz T10x / T301: Rooting, Dalvik Turbo, Removing Bloatware, Gapps & Market & More から入手したファイルで置き換えました

– Android Market 3.1.3
– Google Maps 5.9.0
– Google Books 1.1.4
– Google Talk 1.3
– OI File Manager 1.16
– Spare Parts 2.3.5
– YouTube 2.0.26

・/system/build.propをRamos V65PROで採用されているパラメータに変更しました
・高速化を狙ってDalvik Turbo VMを入れてみました。
・/system/etc/init.d/ においたファイルを起動時に実行するようにしました
 (/system/etc/init.d/99end を消すと起動が途中で止まるので注意してください)
・IngenicScreenCalibration.apkをRamos V65Proから持ってきました。
 設定-表示にてキャリブレーションができるようになります。
・MTLc3m.ttfを/system/fonts/DroidSansJapanese.ttfとして配置しました。
・「ro.sf.lcd_density=132」設定

* flashtool :USBbootTool_20110426.rar my dropbox folder: MIPS/ronziA3/USBbootTool_20110426.rar
* firmware: ronziA3_20111024.zip my dropbox folder: MIPS/ronziA3/customrom/ronziA3_20111024.zip

How to flash firmware.
English guide: ronzi A3 firmware update guide
日本語: ronzi A3 その4 firmwareアップデート

ronzi A3カスタマイズメモ 20111024版

ronzi A3をカスタマイズしていくときのメモ書きをいくつか・・・

・YouTubeアプリを最新版にするとHQモードが動かない、ということなので2.0.26を使用する。
その他、[GUIDE] Cruz T10x / T301: Rooting, Dalvik Turbo, Removing Bloatware, Gapps & Market & More にある以下のファイルを持ってきた。

– Android Market 3.1.3
– Google Maps 5.9.0
– Google Books 1.1.4
– Google Talk 1.3
– OI File Manager 1.16
– Spare Parts 2.3.5
– YouTube 2.0.26

・Dalvik Turboはfroyo-hard-float-r1を使用している
上記のCruz Tabletでは、froyo-soft-float-r1を使用しているようだけど、hard floatにしている。

・nicoWnnGの設定ファイル
デフォルト設定では以下となっている。

# pwd
/data/data/net.gorry.android.input.nicownng/shared_prefs
# ls -l net.gorry.android.input.nicownng_preferences.xml
-rw-rw---- app_33   app_33       1057 2011-10-24 01:48 net.gorry.android.input.nicownng_preferences.xml
# cat net.gorry.android.input.nicownng_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="nicoflick_mode_landscape">0</string>
<boolean name="change_alphanum_12key_portrait" value="true" />
<string name="nico_candidate_lines_portrait">3</string>
<boolean name="change_kana_12key_portrait" value="true" />
<string name="candidateview_height_mode2_landscape">2</string>
<boolean name="change_kana_12key_landscape" value="false" />
<string name="input_mode_landscape">input_normal</string>
<boolean name="change_alphanum_12key_landscape" value="false" />
<string name="nicoflick_mode_portrait">0</string>
<string name="input_mode_portrait">input_normal</string>
<string name="candidateview_height_mode2_portrait">2</string>
<string name="nico_candidate_lines_landscape">1</string>
<string name="flick_sensivity_mode_landscape">0</string>
<string name="flick_sensivity_mode_portrait">0</string>
<boolean name="new_preference_20110417a" value="true" />
<string name="mainview_height_mode2_landscape">2</string>
<string name="mainview_height_mode2_portrait">2</string>
</map>
#

設定を行うと↓のような感じになる。

# cat net.gorry.android.input.nicownng_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="nico_candidate_lines_portrait">3</string>
<string name="candidateview_height_mode2_landscape">1</string>
<boolean name="shrink_candidate_lines_landscape" value="false" />
<boolean name="change_alphanum_12key" value="false" />
<string name="candidate_font_size">0</string>
<string name="input_mode_landscape">input_normal</string>
<boolean name="popup_preview" value="true" />
<string name="flick_sensivity_mode">0</string>
<string name="candidateview_height_mode2_portrait">2</string>
<string name="nico_candidate_lines_landscape">1</string>
<boolean name="space_below_keyboard_landscape" value="true" />
<string name="nicoflick_mode">0</string>
<string name="flick_sensivity_mode_portrait">0</string>
<boolean name="space_below_keyboard" value="true" />
<string name="input_mode">input_normal</string>
<string name="keyboard_skin">keyboard_android_default</string>
<boolean name="show_candidate_fulllist_button_landscape" value="true" />
<boolean name="show_candidate_fulllist_button" value="true" />
<boolean name="is_skip_space_landscape" value="true" />
<boolean name="opt_enable_learning" value="true" />
<boolean name="shrink_candidate_lines" value="false" />
<boolean name="change_alphanum_12key_landscape" value="false" />
<boolean name="different_pl" value="true" />
<string name="key_sound_vol">1</string>
<string name="candidateview_height_mode2">1</string>
<string name="flick_sensivity_mode_landscape">0</string>
<string name="mainview_height_mode2_landscape">0</string>
<boolean name="nospace_candidate2_landscape" value="true" />
<boolean name="change_alphanum_12key_portrait" value="true" />
<string name="qwerty_kana_mode_landscape">0</string>
<string name="qwerty_kana_mode">0</string>
<boolean name="change_kana_12key_portrait" value="true" />
<boolean name="change_kana_12key" value="false" />
<boolean name="nospace_candidate2" value="true" />
<boolean name="flick_guide_landscape" value="true" />
<boolean name="nico_candidate_vertical" value="true" />
<boolean name="new_preference_20110417a" value="true" />
<string name="candidate_font_size_landscape">0</string>
<string name="nicoflick_mode_landscape">0</string>
<string name="mainview_height_mode2">0</string>
<string name="nico_candidate_lines">1</string>
<boolean name="flick_guide" value="true" />
<boolean name="opt_spell_correction" value="true" />
<boolean name="change_kana_12key_landscape" value="false" />
<boolean name="is_skip_space" value="true" />
<string name="nicoflick_mode_portrait">0</string>
<string name="input_mode_portrait">input_normal</string>
<string name="hidden_softkeyboard2">0</string>
<string name="hidden_softkeyboard2_landscape">0</string>
<string name="opt_prediction_mode">on_prediction</string>
<boolean name="nico_candidate_vertical_landscape" value="true" />
<string name="mainview_height_mode2_portrait">2</string>
</map>
#

・nicoWnnGを最初から有効にしておく方法(失敗)
設定を行うと、「/data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml」に記録されているように見える。

# cd /data/data/com.android.settings/shared_prefs
# ls -l
-rw-rw---- system   system        198 2011-10-24 01:47 com.android.settings_preferences.xml
# cat com.android.settings_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="net.gorry.android.input.nicownng/.NicoWnnGJAJP" value="true" />
</map>
#

ちなみにsystem:systemは数値で表現すると1000:1000である。

なお、開発オプションのUSB接続時にスリープにしない設定を入れたりすると、このファイルは以下の様になる。

# cat com.android.settings_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="allow_mock_location" value="true" />
<boolean name="enable_adb" value="true" />
<boolean name="keep_screen_on" value="true" />
<boolean name="location_network" value="false" />
<boolean name="net.gorry.android.input.nicownng/.NicoWnnGJAJP" value="true" />
</map>
#

しかし、実際に、上記の設定を行ってみても、設定は有効にはならないようで、Android内部に別途作成されるsqliteのデータベース上への登録が必須であるようだ。

・framework-res.apkの編集
apktoolでばらして再構築、なんだけど、失敗しやすくて難儀中・・・

framework-res/res/layout/status_bar.xml 内にボタンを配置するレイアウトを追加

framework-res/res/values/ids.xmlとframework-res/res/values/public.xml 内に上記で使用している「@id/status~」という記載を追加
idの値を被らないように注意が必要。

「apktool b 展開ディレクトリ」で再構築するけど、apkファイルは作らない。
buildディレクトリ内のファイルを利用する。

1. オリジナルのframework-res.apk を作業用にframework-res-new.apkとでもする。
2. 「apktool d framework-res-new.apk」で展開する
3. framework-res-newディレクトリにいろいろファイルが出来るが、その中のresディレクトリで作業を行う。
  res\layoutとres\valuesなどでいろいろやる
4. 「apktool b framework-res-new」で再構築する
5. 面倒なのでwindowsの7-zipを使ってframework-res-new.apkを開く
6. 7-zip内操作でframework-res-new.apk\res\layoutに移動し
  framework-res-new\build\res\layout内のファイルを上書きする
7. res\valuesのデータはやり方が違うので7-zipを閉じる
8. res\valuesのデータはresources.arscに含まれるが
  非圧縮でかいた方がいいので、7zipなどでframework-res-new.apk内のresources.arscを非圧縮で置き換える
  うちの場合はlinuxでやったので「7za u -mx0 -tzip framework-res-new.apk resources.arsc」とした。
9. 上記で完成したframework-res-new.apkをronzi A3に転送する。

ポイント
・framework-res.apkを自己署名とかでやってもうまくいかない。googleの署名が必要っぽいのでなんとかごまかす。
・framework-res.apkを7zipで開くとxmlファイルがあるのが見えるけど、開いてみるとxmlそのままじゃなくて処理されているので、そのまま置き換えは不可
・apktoolをうまく使いこなす必要がある
・zipの圧縮と非圧縮もうまく使いこなす

で、書き換えたのですが、statusbarにボリュームを表示させられたけど、そこから実際のボリュームを動かすには別の設定が必要な模様・・・

それはframework.jarの方っぽい

ronzi A3とRamos V65PROのframework.jarをapktoolでばらして、diffを取ってみると、おそらく以下のあたりが関連していそうな雰囲気。

--- framework-ronzi/framework.jar.out/smali/android/media/AudioService$SettingsObser
ver.smali       2011-10-24 17:07:11.000000000 +0900
+++ framework-v65/framework.jar.out/smali/android/media/AudioService$SettingsObserve
r.smali 2011-10-24 17:08:22.000000000 +0900
@@ -184,25 +184,6 @@

     aput v2, v0, v1

-    .line 1717
-    iget-object v0, p0, Landroid/media/AudioService$SettingsObserver;->this$0:Landroid/media/AudioService;
-
-    invoke-static {v0}, Landroid/media/AudioService;->access$2200(Landroid/media/AudioService;)[Landroid/media/AudioService$VolumeStreamState;
-
-    move-result-object v0
-
-    const/4 v1, 0x5
-
-    aget-object v0, v0, v1
-
-    sget-object v1, Landroid/provider/Settings$System;->VOLUME_SETTINGS:[Ljava/lang/String;
-
-    const/4 v2, 0x2
-
-    aget-object v1, v1, v2
-
-    invoke-virtual {v0, v1}, Landroid/media/AudioService$VolumeStreamState;->setVolumeIndexSettingName(Ljava/lang/String;)V
-
     .line 1730
     :cond_1
     :goto_0
diff -ur framework-ronzi/framework.jar.out/smali/com/android/internal/R$id.smali fra
mework-v65/framework.jar.out/smali/com/android/internal/R$id.smali
--- framework-ronzi/framework.jar.out/smali/com/android/internal/R$id.smali     2011
-10-24 17:07:24.000000000 +0900
+++ framework-v65/framework.jar.out/smali/com/android/internal/R$id.smali       2011
-10-24 17:08:36.000000000 +0900

.field public static final status_date:I = 0x1020180

-.field public static final status_volume_add:I = 0x10201f6
-
-.field public static final status_volume_sub:I = 0x10201f5
+.field public static final status_home:I = 0x10201f3

 .field public static final stopSelectingText:I = 0x1020029

これだけではうまく動かなかった。

ちなみに、これで調査中にみつけたこと
・V65proのframework.jar.out/smali/android/media/MediaFile.smaliにFLACサポートっぽい記述がある

 

ronzi A3のframeworkを入れ替えてみる

ronzi A3に、IQQ M1用とかRamos V65PRO用のfirmwareからもってきたファイルをいろいろ書き込んで見ている。

・/system/app/Launcher2.apk
 ronzi A3, IQQ M1, V65ので違いがある

・/system/framework/ の中身全部
 IQQ M1のを入れても、V65のを入れてもそこそも動く。
 ただ、PowerManager関連でエラーがでる。
 V65の場合、ステータスバーにボリューム調整ボタンが無くなる。
 IQQ M1のやつのが無難か?
 
 ただ、書き換えようによっては、無限再起動に陥るようだ。
 (そうなってもUSBbootoolで修正firmwareを書き込めるので問題は無い)