Androidのソースコードをダウンロードしました。今、私は自分のデバイス(LG GT540)用に作りたいと思っています。そのために「デバイス構成」を作成する必要があると聞きました。何人かの開発者が私のデバイスのデバイス構成をすでに作成していますが、学習のためだけに独自の構成を作成したいと思います。
BoardConfig.mk、AndroidProducts.mkなどのファイルをたくさん見ましたが、それらが何をするのかわかりません。その上、それらには多くの構成が含まれています。その上、そのための良いドキュメントはありません。
Androidの移植とデバイス構成の経験がある人は誰でも助けてくれますか?
4 に答える
そうです...独自のデバイスツリーを構築したいので、読み進めてください。
免責事項:これは完全なものではありません。頭のてっぺんをすべて説明し、自分のデバイスツリーにある特定のビットをコピーして貼り付けたため、省略があります。
たとえば、デバイスツリー/device/lg/gt540
は次のmakeファイルで構成されます。
- Android.mk-これにより、ビルドシステムに、デバイス専用のソースを含めてビルドするように指示されます。例については、以下を参照してください。
/device/lg/gt540/libsensors
これはデバイスとハードウェアに依存します。サンプルのデバイスツリーの下に、libsensors 、liblights、libcameraサブディレクトリを含めることができ/device/lg/gt540/liblights
ます/device/lg/gt540/libcamera
。 - AndroidBoard.mk-これはカーネル用です。ビルドシステムはこれを使用してカーネルイメージを所定の位置にドロップします(これについては数分で詳しく説明します)
- AndroidProducts.mk-ビルドに使用する適切なデバイスのmakeファイルを指定します。つまり
/device/lg/gt540/device_gt540.mk
、これも特定です。 - device_xxxxx.mk-最終出力にコピーするプロパティとエクストラを指定します。この場合、たとえば、
device_gt540.mk
- BoardConfig.mk-これがすべての要点です。ここで、コンパイラの条件付きフラグ、パーティションレイアウト、ブートアドレス、RAMディスクサイズなどが設定されます。
それらのそれぞれを覗いて、すべてがどこに収まるかを一瞥してみましょう。
Android.mk:
ifeq ($(TARGET_BOOTLOADER_BOARD_NAME),xxxxx)
include $(call all-named-subdir-makefiles, recovery libsensors liblights libcamera ....)
endif
これは、ビルドがリカバリ、センサー、ライト、カメラをビルドするためにそれを使用する方法です(もちろんもっとあります)、「Yo Builder、指定された各ディレクトリに移動し、それぞれのソースplskthxbaiをビルドします」
AndroidBoard.mk:
LOCAL_PATH := device/lg/gt540/
#
# Boot files
#
TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel
file := $(INSTALLED_KERNEL_TARGET)
ALL_PREBUILT += $(file)
$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)
$(transform-prebuilt-to-target)
これで、ビルドシステムに、このカーネルをout/target/product/lg/gt540
(デバイスツリーディレクトリとの相関関係に注意してください)にドロップできるように指示しています。
AndroidProducts.mk:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/device_gt540.mk
'Yo Builderのようにビルドを指示し、そのデバイスのmakeファイルを読んで、ビルドの完了時に処理してください。'
* device_xxxxx.mk:(この例では、device_gt540.mk)*
PRODUCT_NAME := lg_gt540
PRODUCT_DEVICE := gt540
PRODUCT_MODEL := LG GT 540
PRODUCT_COPY_FILES += \
... specific ...
PRODUCT_PROPERTY_OVERRIDES := \
ro.com.android.dateformat=dd-MM-yyyy \
... more stuff ...
この場合、ドライバー、独自のライブラリ、デバイス専用のサポートスクリプトなど、デバイスのすべての詳細がコピーされout/target/product/lg/gt540/system/
ます。プロパティのオーバーライドがどのように行われるかに注意してください。これらはbuild.prop
、AndroidROMのルートにあり/system
ます。
BoardConfig.mk:
LOCAL_PATH:= $(call my-dir)
TARGET_NO_BOOTLOADER := true
TARGET_PREBUILT_KERNEL := device/lg/gt540/kernel
TARGET_PREBUILT_RECOVERY_KERNEL := device/lg/gt540/recovery_kernel
# This will vary from device!
TARGET_BOARD_PLATFORM := msm7k
TARGET_ARCH_VARIANT := armv6-vfp
TARGET_CPU_ABI := armeabi
TARGET_CPU_ABI := armeabi-v6l
TARGET_CPU_ABI2 := armeabi
# OpenGL drivers config file path
BOARD_EGL_CFG := device/lg/gt540/egl.cfg
# Dependant, not to be taken literally!
BOARD_GLOBAL_CFLAGS += -DHAVE_FM_RADIO
# Dependant, not to be taken literally!
BOARD_KERNEL_BASE := 0x02600000
# this will be device specific, and by doing cat /proc/mtd will give you the correct sizes
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00480000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00480000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x0cf80000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0d020000
BOARD_FLASH_BLOCK_SIZE := 131072
これは抜粋です。カーネルのベースアドレスを指定する方法に注意してください。これは、boot.img
コンパイルが完了した後にgetが生成され、さらに、にドロップされる方法out/target/product/lg/gt540/boot.img
です。また、さらに重要なことに、ソースをクロスコンパイルするためにターゲットプラットフォームを使用するようにビルドシステムに指示しています(* TARGET_BOARD_PLATFORM * / * TARGET_CPU_ABI *)コンパイラに渡す条件付きフラグなどの詳細情報があります。例。HAVE_FM_RADIO
FMラジオシステムのソースを処理する場合、ソースの一部を条件付きでコンパイルするように指示するディレクティブを指定しました。繰り返しになりますが、これはハードウェア固有であり、走行距離は異なります。これは、起動用のアドレスにも適用されます。一言で言えば、これは言っています'Yo Builder、いまいましい変数を読んで覚えて、それらのソースファイルをクロスコンパイルするときに適用してください!'
これで、これらのAndroidビルドメイクファイルのそれぞれの内部が表示されます。
さて、そのvendor/
一部に、AOSPで、単純に、もう一度、相関関係があり、device/
この例を続けるように、ツリーに対応します。この例は、vendor/lg/gt540/
によって取得されますlunch
。そこにはさらに多くのmakeファイルがありますが、一般的なコンセンサスは、proprietary
コピーされるプロプライエタリライブラリ(クローズソースなどによる)を含むというディレクトリがあるということです。ライブラリのコピーオーバーは、ファイルdevice-vendor-blobs.mk(この場合は)で指定されますgt540-vendor-blobs.mk
。
次のようにして魔法が起こったとき:
. build/envsetup.sh
これは、各device/
サブディレクトリにあるエントリ全体を読み取り、「それらを記憶している」ため、ビルドシステムは使用されているターゲットのタイプなどを認識します。
が. lunch
呼び出されると、ビルドに必要なデバイスを選択するように求めるメニューが表示されます。ビルドを行うための最後の最後のステップです...
make -j5 > buildlog.log 2>&1
別の端末で実行multitail
し、ファイルを監視して、buildlog.log
ファイルが構築されていることを確認します。
この最後のステップは、コアの数(nコア+原則として1)によって異なり、ビルドには時間がかかります。ArchLinux 64ビットを実行しているラップトップではGBビルドに40分かかり、ICSビルドには約2時間30分かかります。したがって、走行距離は、マシンの馬力の種類によって異なります。
ビルドが完了すると、小さなベルが鳴り、ログファイルの下部に次のように表示されます。
Combining NOTICE files: out/target/product/xxxxx/obj/NOTICE.html
Target system fs image: out/target/product/xxxxx/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/xxxxx/system.img
out/target/product/xxxx/system.img+ total size is 108776448
興味深いことに、JBQ(Jean Baptiste Queru-Googleからのソースを管理/配布するための「ボス」)、彼のビルドステップはこれです...
make -j32
うん!32コア!それ.....はかなり強力です。
ここにいくつかの情報があります:http://elinux.org/Android_Device
デバイス用のAndroidを構築する人のための優れたリソースはここにあります: http ://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?bid = 98
(ODROIDでのAndroidプラットフォーム開発への実用的な現実世界のアプローチ)
そこにあるもののいくつかはODROIDボードに特有のものですが、それでもAndroidの内部動作と新しいボードに必要なカスタマイズについての優れた洞察を提供します。
あなたが物事のハードウェア側に入るのを探しているなら、おそらく私が見つけた唯一の最も有益なリソースは次のとおりです:
http://source.android.com/compatibility/overview.html
彼らがAndroidデバイスを構築しようとしているメーカーのために書いたドキュメントを読んでください、それはあなたが見つける最も徹底的で完全なリファレンスです。