MIPS Android用にbusyboxをコンパイルする


MIPS Android内のbusyboxでapkを展開しようとすると、以下のエラーがでる。

# busybox unzip ../ni*apk
Archive:  ../nicoWnnG-2011.1115.1-mips.apk
unzip: zip flags 1 and 8 are not supported
#

まぁ、これは、MIPS Androidに限らずARM系でも同じ。
busyboxのコンパイルオプション変更でなんとかならないかなぁ、と調査。

BusyBoxからソースファイルを入手し、コンパイル。

横着してAndroid SDK for MIPS内のコンパイラを使おうとしたら失敗した。
かなり初期段階でエラーがでた。

バイナリ配布のMIPS用クロスコンパイラを探したところ、MIPS DeveloperのCompiler紹介ページで紹介されているCodeSourcery G++ Lite Compilerが良さそうだったので使う。

Sourcery CodeBench Lite 2011.03-93 for MIPS GNU/Linux からAdvanced PackagesのIA32 GNU/Linux TARをダウンロードし、適当なディレクトリに展開した。

$ wget https://sourcery.mentor.com/sgpp/lite/mips/portal/package9055/public/mips-linux-gnu/mips-2011.03-93-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2
<略>
$  bzip2 -dc mips-2011.03-93-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2|tar xf -
$ cd mips-2011.03/bin
$ export PATH=`pwd`:$PATH
$

そのあと、busyboxをダウンロードしたディレクトリに移動。

$ make defconfig
$ make menuconfig

menuconfigを使って、いろいろカスタマイズを実施。
「CONFIG_LZOP_COMPR_HIGH」が圧縮率関連のパラメータっぽいなぁ、とyに変更。
「CONFIG_CROSS_COMPILER_PREFIX=”mips-linux-gnu-“」というポイントを忘れずに。
その他変えたポイントは・・・

CONFIG_STATIC=y
CONFIG_CROSS_COMPILER_PREFIX="mips-linux-gnu-"
CONFIG_FEATURE_SEAMLESS_Z=y
CONFIG_LZOP_COMPR_HIGH=y
CONFIG_FEATURE_VI_8BIT=y
CONFIG_TUNE2FS=y

そして「make」
….
できあがり、転送したが、実行できないバイナリだった。

$ file busybox-test
busybox-test: ELF 32-bit MSB executable, MIPS, MIPS64 version 1 (SYSV), for GNU/Linux 2.6.12, statically linked, for GNU/Linux 2.6.12, stripped
$
# ./busybox-test
./busybox-test: 1: Syntax error: "(" unexpected
#

「CONFIG_EXTRA_CFLAGS=”-march=mips32″」も付け加えてみる・・・不可

おかしいなぁ、と探してみると、busyboxのページでバイナリ配布の1.19.0を発見
以下の3種類があった。

$ file *
busybox-mips:   ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped
busybox-mips64: ELF 64-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, stripped
busybox-mipsel: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped
$

それぞれを、ronzi A3に転送して実行してみる。

# ./busybox-mips
./busybox-mips
./busybox-mips: 1: Syntax error: "(" unexpected
# ./busybox-mips ls
./busybox-mips ls
./busybox-mips: 1: Syntax error: "(" unexpected
# ./busybox-mips64 ls
./busybox-mips64 ls
./busybox-mips64: 1: Syntax error: newline unexpected
# ./busybox-mipsel ls
./busybox-mipsel ls
busybox         busybox-mips    busybox-mips64
 busybox-mipsel
#

実行できたのはbusybox-mipselでした。
つまり「ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV)」のファイルのみ。
そういえば、とsuバイナリを見てみると「su: ELF 32-bit LSB executable, MIPS, MIPS64 version 1 (SYSV), dynamically linked (uses shared libs), stripped」
少なくとも「32-bit LSB」にする必要があるようだ。

$ make CFLAGS="-EL -march=mips32" LDFLAGS="-EL -march=mips32"
<略>
$ file busybox
busybox: ELF 32-bit LSB executable, MIPS, MIPS64 version 1 (SYSV), for GNU/Linux 2.6.12, statically linked, for GNU/Linux 2.6.12, stripped
$

目的とするものが作成されました。

そして、

# ./busybox unzip /sdcard/nico*apk
./busybox unzip /sdcard/nicoWnnG-2011.1115.1-mips.apk
Archive:  /sdcard/nicoWnnG-2011.1115.1-mips.apk
  inflating: META-INF/MANIFEST.MF
  inflating: META-INF/OSAKANAT.SF
  inflating: META-INF/OSAKANAT.RSA
  inflating: assets/and3ime.png
<略>

ということで、無事、apkファイルを展開できるunzip機能をもったbusyboxが完成しました。

これが何のために必要だったのかというと・・・

# ../busybox unzip /sdcard/nicoWnnG-2011.1115.1-mips.apk lib/mips/libnicoWnnGEngDic.so lib/mips/libnicoWnnGJpnDic.so lib/mips/libnicownngdict.so
Archive:  /sdcard/nicoWnnG-2011.1115.1-mips.apk
  inflating: lib/mips/libnicoWnnGEngDic.so
  inflating: lib/mips/libnicoWnnGJpnDic.so
  inflating: lib/mips/libnicownngdict.so
# ls
lib
#

というような感じで、カスタマイズ時に必要なlibファイルの取り出しを自動化できるように、ということだったります。

コンパイルしたバイナリをbusybox-1.19.3-mips.zipに置きました。
中身は「busyboxバイナリ」と「busyboxをコンパイルする際に使う.config」です。

MIPS用suバイナリ ver3.0.1


GUIアプリからroot権限操作を行う場合、ChainsDDさんのSuperuser.apk+suバイナリが必要になる。

Superuser.apkは普通のAndroidアプリだが、suバイナリの方はARMアーキテクチャ用となっている。
じゃぁ、MIPSアーキテクチャ用のsuバイナリを用意しよう!
ということで、用意しました。

su-3.0.1.zip

zip内のsuファイルを/system/xbin/su もしくは/system/bin/su に置いてください。
そして、「chmod 6755 /system/xbin/su」もしくは「chmod 6755 /system/bin/su」と権限を与えてください。

ちなみに、Githubで公開されているソースは、ver 3.0.1のしかないようなので、このバージョンになっています。

Superuser.apkの方は公式のhttp://downloads.androidsu.com/superuser/Superuser-3.0.6-efgh-signed.zipをダウンロードしてください。
そして、system\app\Superuser.apkを使ってください。
注意点としては、Superuser.apkの中で、suバイナリのバージョンチェックとアップデートを行うことができますが、これをやってしまうと、suが動かなくなる、という点です。
それさえ注意すれば、問題なく動くかと思います。

ただ、これを使ってもRootexplorerは期待通りの動作をしてくれなかったり・・・
/systemに移動して「Mount R/W」ボタンを押しても、なにも動いてくれない・・・
どこら辺に問題があるかなぁ・・・

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アップデート