ubuntu12.10 64bitで、
一昨日はjellybean(android 4.2)を、
昨日はgingerbread(android 2.3)を、
今日はfroyo(android2.2)をビルドしました(笑)
やっとほんの少しだけやり方が分かってきたかなー、くらいです。
最初は勉強でビルドしてみるか、くらいな感覚だったんですが、段々手持ちの実機(ht-03a)に突っ込まないと気が済まなくなっています。
jellybeanも、gingerbreadも、ht-03aに入れるには無理があったらしいので、やっとfroyoで普通に入れられそうに感じます。(実は、まだ入れてないんですけど)gingerbreadは、メモリ増強すればht-03aにも入るらしい(というか、自分でビルドしたバグだらけのgingerbreadだったらメモリ増強して昨日入れたんですが)ですが、やっぱりメモリ増強してまで無理に入れるとどこかおかしくなりそうなので、嫌です。
jellybean,gingerbreadは、一応大体同じ環境でビルドできたんですが、froyoは少し環境を変えないといけなかったようです。
それでも、jellybeanを最初にビルドした時の何も分かりません状態の時よりは作業が楽になりつつありますが。
今日の手順は、昨日一昨日(パニック状態)よりはちゃんと取りました(笑)
まず、ビルド。
1.repoでソースを落とす
設定
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2.3_r2.1
最後のandroid-2.2.3_r2.1がポイントで、そこがバージョンです。android-2.2.3_r2.1
ダウンロード
repo sync
2~4時間かかりました。ちなみに、syncはおそらくサーバのソースとの同期という意味なので、
レジューム可能です。一度中断したりもうダウンロードが終わっていたりした時に再実行しても、既に落としてある分を最初からやり直しで再ダウンロードしたりはしません。
2.makeのための環境変数をターミナルに設定?(多分)
source build/envsetup.sh
lunch full_sapphire-userdebug
source build/envsetup.sh
の方は、ビルド方法のリストを環境変数に格納するようなイメージなのかな、と今は思っている。
lunch full_sapphire-userdebug
の方は、 ビルド方法のリストの中から、1個を指定する感じなのかな、と。
sapphireの意味は、端末。僕の場合、ht-03aは、海外だとhtc sapphireと中身が同じようだと考えていたので(※)、sapphireを指定。これでht-03a用のビルドになると思われる。
(※ここが、重大です。違うんです。ソースにはdreamとsapphireとpassionがあったんですが、おそらく、ht03aはdreamなのではないかと今思っています。)
userdebugの意味は、
ここ
の、TARGET_BUILD_VALIANT。
要は、リリースビルドかデバッグビルドかの指定みたいなものかと。
3.ビルド
make -j2
オプションjの後にCPUのコア数を指定する。
多分、この場合2スレッドでのビルドになる。 多分1スレッドよりはずっとビルドが速い。
----------------------------------------------------------
ここまでが、昨日までで覚えたことだったのだが、今日は昨日の環境で、ソースだけFroyoのものに変えて3を行うと、エラーが起きた。まあ、今日出たエラーは昨日一昨日よりは簡単に解決したけれど。
[1]javaのバージョンがFroyo対応ではない
You are attempting to build with the incorrect version
of java.
Your version is: java version "1.6.0_45".
The correct version is: 1.5.
→見た目通り。javaのバージョンが、1.6じゃなくて、1.5じゃなきゃダメと言われている。
gingerbread以降ではJDK6で良かったが、FroyoではJDK6ではダメ。
とても苦労したが、環境のjavaのバージョンをJDK5に変えてとりあえずこのチェックは抜ける。
もうgingerbreadはビルドできないかも。
makeファイルを書き換えて解決という人もいるみたいだけど、個人的には、こういう場合、意地でもソースの修正より環境で解決するべきと考えます。
Java SE Development Kit 5.0u22
->
jdk-1_5_0_22-linux-i586.bin(32bit用)
→しかし、実は、64bit用のやつ(
jdk-1_5_0_22-linux-amd64.bin)があり、
僕の環境の場合、そちらを使うべきだったので、後述するが、最後のエラー[3]はそれで出た。
[2]GCCのバージョンが新しすぎて(?)エラー
エラーの内容は保存しなかったし、最初のバージョンが何だったかすら分からない(おそらく4.6よりは新しい)のだが、
FroyoのビルドはGcc4.4じゃないとダメらしい。
最初のエラーでは、4.6より前じゃないとダメと言われたので、4.6に変えて通過。
次のエラーでは、4.4じゃないとダメと言われて、さらに4.4に変更。
まあ、javaのバージョンを変えるよりはずっと楽です。
実は、javaのバージョンを変える時には元々あったjavaを全部消したので、Eclipseが死にました。
まあそんなのは(多分)インストールし直せばいいのでいいんですけど。
ubuntuでは、javaのバージョンの切り替えは、
update-java-alternatives
と言うコマンドで、
gccのバージョンの切り替えは
update-alternatives
と言うコマンドで一発でやってくれるらしく、少し感動しましたが、残念ながら、おそらく現在(2013/4/29)
update-java-alternatives
で切り替えられるのは、java6以降であり、java5には対応していないように感じました。
gccの方は使わせてもらいましたけど。
この辺で、2の前に、自分のht-03aの資産をソースにコピーした方した方が良いように感じ、
(昨日、それで超ハマったので)USBでht-03aをつなぎ、adbが効く状態にしてから、
/device/htc/sapphire/extract-files.sh
を実行。無事にht-03aからソースに何かをコピーしたようです。何をコピーしたかは知りません(TT)
でも、この後deviceのファイルがないとかいうエラーが出なかったのはこれのお陰かもしれない。もしかしたら。まあ、先にやってしまったので分からないんですが。エラーが出てからやれば良かったかも。
[3]Could not load 'clearsilver-jni'
[out/target/common/docs/api-stubs-timestamp] エラー 45
Could not load 'clearsilver-jni'とかでググると結構ヒットする。(ほとんど英語ですが)
割と有名なエラーなのかもしれない(笑)
英語はあまり読めないけど、日本語のサイトではjava5のバージョンが64bitだと起こり、32bitだといけるという人がいた。
しかし、僕のjava5は32bitで、エラーが出ている。
英語のサイトだと、逆に32bitじゃなく64bitじゃないと起こるエラーだと言う人もいるように感じる。
そして、OSが64bitなら64bitのjavaじゃないとダメ、という英語の書き込みのある掲示板があった気もする。
とりあえず、それを信じてjava5を64bitのやつに変えたら、これも通った。
後は最後まで行きました。
途中止まりすぎてビルド時間は全然分かりませんけど、4時間くらいでしょうか。
------------------------------------------------------------
次に、実機に入れる作業
(1)make -j2 otapackage
これで、out/target/product/sapphireに、
full_sapphire-ota-eng.僕のユーザ名.zip
というzipができる。これがROM。
(sapphireに作成されるのは、これがsapphire用ビルドだからだと思われる)
(2)adb push full_sapphire-ota-eng.僕のユーザ名.zip /sdcard/
で、sdcardにROMをコピー
(1)まで終われば、androidのROM焼きをやってる人なら、どうにでもできるはずです(笑)
----------------------------------------------------------------
●ht-03aはhtc sapphireと互換性があると思っていたんですが、htc sapphireではありませんでした。froyoのソースに用意されていたのは、dreamとsapphireとpassionですが、多分(それも、多分ですが)ht-03aと互換性があるのはdreamでしょう・・・。
ROM焼き時に「書き込めませんよ!」ってチェックに引っかかってしまいました・・・。
それでもなんとかなりそうなら
ROM内のupdater_scriptのチェック部分を外して焼くんですけど、
ROM内のupdater_scriptを見て諦めました。
assert(getprop("ro.product.device") == "sapphire" ||
getprop("ro.build.product") == "sapphire");
assert(getprop("ro.bootloader") == "1.33.0011" ||
getprop("ro.bootloader") == "1.33.2011" ||
getprop("ro.bootloader") == "1.33.3011" ||
getprop("ro.bootloader") == "1.33.0013" ||
getprop("ro.bootloader") == "1.33.2013" ||
getprop("ro.bootloader") == "1.33.3013");
の、sapphireかどうかのチェックはいいんですが、bootloaderのチェックは昨日散々ハマった所です。
このbootloaderの番号は、よく覚えているんですが、メモリ増強後のht-03aのやつが1.33.0013dで、1.33.0013とほぼ同じです。
多分、メモリを元に戻してしまったので、もう動かない系のROMじゃないかと思います。
昨日もgingerbreadのROMが1.33.0013や1.33.0013dかどうかチェックするROMだったのですが、それをメモリ増強してない状態で(その時は、1.33.0006だったかな?)チェックだけ外して無理やり焼いて動かしたら、20分くらいは起動せず、結局起動しないまま諦めたので多分それと同じな気がします。
また明日、設定をdreamにしたビルドでやり直しです。
きっとまた4時間かかりますから。今日(つってももう明日か)はもう無理です。