コンピュータカウボーイ見習いのメモ帳

仕事や趣味の備忘録です

【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 SDKlib/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オプションは適合しないコードを許可するらしい。

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」が必要な模様

Man page of PTHREAD_SPECIFIC

使うために必要なライブラリは「-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

やっぱり同じくエラーが起きてる人がいたので参考に

Shuiqing Wang: [Solved]"acp: file 'out/host/linux-x86/obj/EXECUTABLES/vm-tests_intermediates/tests/data' does not exist"

対処療法な気がするけど存在しないディレクトリを作成します。

$ 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' から出ます

キタ━━━━(゚∀゚)━━━━ッ!!やっと終わった

試行錯誤の過程全部書いちゃったから長い記事になってしまった^^;

ポーティング完了したらまとめ直そう。