【BeagleBoard】Androidのポーティング【ビルド編】
前回の記事から大分時間が開いてしまいましたが、ソースコードの準備ができたのでビルドを実行したいと思います。
とりあえず実行すると下記のエラー達が
$ make TARGET_PRODUCT=beagleboard -j2 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=2.2 TARGET_PRODUCT=beagleboard TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER ============================================ build/core/Makefile:19: 警告: ターゲット `out/target/product/beagleboard/system/usr/keylayout/qwerty.kl' へのコマンドを置き換えます sdk/emulator/keymaps/Android.mk:13: 警告: ターゲット `out/target/product/beagleboard/system/usr/keylayout/qwerty.kl' への古いコマンドは無視されます host Java: apicheck (out/host/common/obj/JAVA_LIBRARIES/apicheck_intermediates/classes) Header: out/host/linux-x86/obj/include/libpng/png.h ...省略 host Java: dx (out/host/common/obj/JAVA_LIBRARIES/dx_intermediates/classes) 注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。 Notice file: frameworks/base/libs/utils/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libutils.a.txt ...省略 host Java: junit (out/host/common/obj/JAVA_LIBRARIES/junit_intermediates/classes) 注:一部の入力ファイルは推奨されない API を使用またはオーバーライドしています。 注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。 注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。 host Java: androidprefs (out/host/common/obj/JAVA_LIBRARIES/androidprefs_intermediates/classes) Notice file: prebuilt/common/commons-compress/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//framework/commons-compress-1.0.jar.txt host Java: archquery (out/host/common/obj/JAVA_LIBRARIES/archquery_intermediates/classes) 注:一部の入力ファイルは推奨されない API を使用またはオーバーライドしています。 注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。 注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。 ...省略 Notice file: prebuilt/common/jfreechart/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//framework/jfreechart-1.0.9-swt.jar.txt host Java: descGen (out/host/common/obj/JAVA_LIBRARIES/descGen_intermediates/classes) cts/tools/utils/DescriptionGenerator.java:40: パッケージ com.sun.javadoc は存在しません。 import com.sun.javadoc.AnnotationDesc; ^ ...省略 cts/tools/utils/DescriptionGenerator.java:578: シンボルを見つけられません。 シンボル: クラス MethodDoc 場所 : DescriptionGenerator.TestClass の クラス for (MethodDoc method : superClass.methods()) { ^ エラー 32 個 make: *** [out/host/common/obj/JAVA_LIBRARIES/descGen_intermediates/javalib.jar] エラー 41 make: *** 未完了のジョブを待っています....
上のほうに出てくる警告はあとから対処するとしてまずはエラーを消していきます。
host Java: descGen (out/host/common/obj/JAVA_LIBRARIES/descGen_intermediates/classes) cts/tools/utils/DescriptionGenerator.java:40: パッケージ com.sun.javadoc は存在しません。 import com.sun.javadoc.AnnotationDesc; ^
sunのjavadocが無いとでてる...
ちょっと調べたら下記のサイトを発見。
com.sun.javadoc パッケージは、ドックレット API を定義するいくつかのインタフェースで構成されています。これらのインタフェースは、Java 2 SDK の lib/tools.jar ファイルに含まれています。
libの下にあるtools.jarが必要なのか〜前回設定した「bashrc」の参照は「bin」からになっていたので読み込めなかったんだという仮定のもとその上から参照するように変更してみます。
$ vim ~/.bashrc
最終行というかJAVAの参照を下記のように変えます。
PATH=$PATH:/usr/local/jdk1.5.0_22/ #JDK Java5
これで再度実行してみます
$ make TARGET_PRODUCT=beagleboard -j2 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=2.2 TARGET_PRODUCT=beagleboard TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER ============================================ build/core/Makefile:19: 警告: ターゲット `out/target/product/beagleboard/system/usr/keylayout/qwerty.kl' へのコマンドを置き換えます sdk/emulator/keymaps/Android.mk:13: 警告: ターゲット `out/target/product/beagleboard/system/usr/keylayout/qwerty.kl' への古いコマンドは無視されます host C: acp <= build/tools/acp/acp.c host C++: libhost <= build/libs/host/pseudolocalize.cpp host C: libhost <= build/libs/host/CopyFile.c target Generated: libclearsilver-jni <= out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar target Generated: libclearsilver-jni <= out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar host C: libneo_util <= external/clearsilver/util/neo_err.c ...省略 host C++: aapt <= frameworks/base/tools/aapt/Command.cpp In file included from frameworks/base/tools/aapt/AaptAssets.h:18:0, from frameworks/base/tools/aapt/AaptAssets.cpp:5: frameworks/base/tools/aapt/ZipFile.h:65:5: 警告: ‘typedef’ was ignored in this declaration [デフォルトで有効] In file included from frameworks/base/tools/aapt/AaptAssets.h:18:0, from frameworks/base/tools/aapt/Main.h:14, from frameworks/base/tools/aapt/Command.cpp:6: ...省略 frameworks/base/tools/aapt/Resource.cpp:566:98: 警告: 書式 ‘%ld’ は引数の型が ‘long int’ であると予期されますが、第 2 引数の型は ‘size_t {aka unsigned int}’ です [-Wformat] host C++: aapt <= frameworks/base/tools/aapt/SourcePos.cpp host C++: aapt <= frameworks/base/tools/aapt/ZipEntry.cpp host C++: aapt <= frameworks/base/tools/aapt/ZipFile.cpp In file included from frameworks/base/tools/aapt/ZipFile.cpp:26:0: frameworks/base/tools/aapt/ZipFile.h:65:5: 警告: ‘typedef’ was ignored in this declaration [デフォルトで有効] ...省略 frameworks/base/libs/utils/RefBase.cpp: メンバ関数 ‘void android::RefBase::weakref_type::trackMe(bool, bool)’ 内: frameworks/base/libs/utils/RefBase.cpp:483:67: エラー: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive] make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] エラー 1 make: *** 未完了のジョブを待っています....
以前出ててたjavaのエラーがなくなってC++のエラーが発生したorz
これはjavaのほうがうまくいったのか、ただ参照できなくなってコンパイル出来なかったのかわからないな(´・ω・`)
とりあえずC++のエラーを潰します。
エラーメッセージでググったら海の向こう側の人も同じエラー出てたみたい
Building Android: error: passing ‘const android::RefBase::weakref_impl’ | Bicosyes – since evermore…
frameworks/base/libs/utils/Android.mkに「fpermissive」オプションをつければ良いみたい。
fpermissiveオプションは適合しないコードを許可するらしい。
とりあえず情報を鵜呑みにしてmakeファイルを書き換えます。
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive
再度実行してみたら結局javadocが見つからないエラーが...
さっきjavaのエラーが出なかったのはmake cleanしてなかったから一度終わったjavaのところ飛ばしてたっぽい(凡ミス
問題のエラーの出ているmakeファイル「/cts/tools/utils/Android.mk」に
LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR) $(LOCAL_PATH)/lib/junit.jar
無理やり参照を追加してみた
LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR) $(LOCAL_PATH)/lib/junit.jar /usr/local/jdk1.5.0_22/lib/tools.jar
参照を加えたら加えた部分のエラーは発生しなくなった模様(・∀・)
大元の参照に追加したらうまく行くかも(´・ω・`)ってことで先程のmakeファイルから参照を定義している大元を調べて書き換えてみた(^^)
/build/core/config.mk
HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh)
HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh) /usr/local/jdk1.5.0_22/lib/tools.jar
shell読むの大変なのでまずは直書き
これで実行すると下記のエラーが^^;
$ make TARGET_PRODUCT=beagleboard -j2 ...省略 /home/sho/myFroyo/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific' out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set': /home/sho/myFroyo/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create' /home/sho/myFroyo/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific' collect2: ld はステータス 1 で終了しました make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] エラー 1 make: *** 未完了のジョブを待っています.... host Executable: dexlist (out/host/linux-x86/obj/EXECUTABLES/dexlist_intermediates/dexlist) true
「pthread_key_create」とかが参照できないっぽい(´・ω・`)
調べてみると「pthread.h」が必要な模様
使うために必要なライブラリは「-lpthread」らしい。
エラーが出ているソースのある「system/core/libcutils/Android.mk」の中を見ると「-lpthread」の参照はある。そこでもう少し調べてみると下記の記事が
endroid: fix Android building error on ubuntu 11.10
完全に同じエラーで困ってる(´・ω・`)
この直し方を鵜呑みにして下記のように「frameworks/base/tools/aapt/Android.mk」(元記事では「appt」になってたけど実際は「aapt」)と「frameworks/base/tools/localize/Android.mk」を変更します。
ifeq ($(HOST_OS),linux) LOCAL_LDLIBS += -lrt endif
ifeq ($(HOST_OS),linux) LOCAL_LDLIBS += -lrt -lpthread endif
書き換えてからビルドすると今度は下記のエラーが
$ make TARGET_PRODUCT=beagleboard -j2 ...省略 Exception in thread "main" java.lang.NoClassDefFoundError: /usr/local/jdk1/5/0_22/lib/tools/jar make: *** [out/host/linux-x86/obj/EXECUTABLES/vm-tests_intermediates/tests] エラー 1 make: *** 未完了のジョブを待っています....
なぜこれで直るのか全然わからないけどとりあえず同じ事例を見つけたのでやってみる(´・ω・`)
AndroidFAQ < Android4SAM < TWiki
「/etc/security/limits.conf」の最終行を下記のように変更
#@student - maxlogins 4 # End of file
#@student - maxlogins 4 * soft nofile 8192 * hard nofile 8192 # End of file
次はこのエラー^^;
$ make TARGET_PRODUCT=beagleboard -j2 ...省略 Install: out/host/linux-x86/framework/cts-dalvik-buildutil.jar acp: file 'out/host/linux-x86/obj/EXECUTABLES/vm-tests_intermediates/tests/data' does not exist make: *** [out/host/linux-x86/bin/../cts_dalviktests/timestamp] エラー 1
やっぱり同じくエラーが起きてる人がいたので参考に
対処療法な気がするけど存在しないディレクトリを作成します。
$ mkdir -p out/host/linux-x86/obj/EXECUTABLES/vm-tests_intermediates/tests/data
とりあえずやってみたけどなんで結果出力先に必要なディレクトリが生成されないんだろう?
それについては後で調べるとして再度実行
$ make TARGET_PRODUCT=beagleboard -j2 ...省略 Image Name: Linux-2.6.32 Created: Sun Jul 13 01:19:10 2014 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2618364 Bytes = 2557.00 kB = 2.50 MB Load Address: 80008000 Entry Point: 80008000 Image arch/arm/boot/uImage is ready make[1]: ディレクトリ `/home/sho/myFroyo/kernel' から出ます make -C external/ti_android_sgx_sdk ANDROID_ROOT_DIR=`pwd` TOOLS_PREFIX=prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- make[1]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk' に入ります make[1]: 警告: jobserver が利用不可: -j1 を使い, 親 make ルールに `+' を追加しましょう Installing OMAP35x Android Graphics SDK... make[1]: ./internal_install_SDK.exp: コマンドが見つかりませんでした make[1]: *** [prepare] エラー 127 make[1]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk' から出ます make: *** [sgx] エラー 2
メッセージ見てたらそろそろ終わるかなと思った時に再びエラー
日本語で書いてあるけど「親 makeルールに`+' を追加しましょう」の意味がわからない^^;どこにだよ。。。
とりあえずオプションを「-j1」にして再度実行してみる。
$ make TARGET_PRODUCT=beagleboard -j1 ...省略 make -C external/ti_android_sgx_sdk ANDROID_ROOT_DIR=`pwd` TOOLS_PREFIX=prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- make[1]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk' に入ります Installing OMAP35x Android Graphics SDK... make[1]: ./internal_install_SDK.exp: コマンドが見つかりませんでした make[1]: *** [prepare] エラー 127 make[1]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk' から出ます make: *** [sgx] エラー 2
「親 makeルールに`+' を追加しましょう」は特になにもしなくてよかった感じ(・∀・)
コマンドが見つからないのはインストールされてないからだよなと思いつつ調べてみると案の定インストールされていないものがあった。
TI-Android-Froyo-DevKit-V2.2のビルドでinternal_install_SDK.expが見つからないとエラーが出るときの対処 - ゲームとかプログラムとかパソコンとか
$ sudo apt-get install expect
でインストールしてから再度実行
make TARGET_PRODUCT=beagleboard -j1 ...省略 Installation complete! make[2]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk/SDK' から出ます make[1]: ディレクトリ `/home/sho/myFroyo/external/ti_android_sgx_sdk' から出ます
キタ━━━━(゚∀゚)━━━━ッ!!やっと終わった
試行錯誤の過程全部書いちゃったから長い記事になってしまった^^;
ポーティング完了したらまとめ直そう。