Android起動プロセスと各ミラー間の関係

6652 ワード


Android起動プロセスと各ミラー間の関係
 
Android起動プロセスAndroidは起動時にUBOOTからinitパラメータが入力され、このinitパラメータは起動時に最初に実行するプログラムを指定し、デフォルトはinitプログラムであり、このプログラムはramdiskである.img中.
そのコードを分析して、その中でいったいどんな初期化タスクをしたのか、そのソースファイルがsystem/core/init/initにあるのかを見ることができます.c中.initに呼び出されます.rc初期化ファイル、このファイルはout/target/product/generic/rootで、起動後、ルートディレクトリは読み取り専用属性であり、sdcardのownerはsystemであり、このファイルの中でいくつかの手足を作って、それを変更して、ルートディレクトリの読み書きを実現することができます.これらのファイルを分析することにより、androidの起動時にramdiskを最初にロードすることも明らかになった.imgミラーは、/ディレクトリの下にマウントされ、様々な必要なディレクトリの作成、consoleの初期化、サービスの開始など、一連の初期化動作を行う.System.imgはinitです.rcではinitを介してスクリプトコマンドを指定します.c解析を行い、ルートディレクトリの下/systemディレクトリの下にマウントします.ramdisk.img、system.img、userdata.imgミラー生成プロセス:まずlinux端末の下でコマンドfile ramdiskを使用する.imgは、以下の文字ramdiskを印刷する.img:gzip compressed data,from Unixは、gzip圧縮のフォーマットであることがわかります.以下、それを解凍し、fedoraが持参したツールを使用して解凍するか、gunzipを使用して解凍(拡張子を.gzに変更する必要がある場合があります)し、新しいramdiskが解凍することがわかります.img、このramdisk.imgはcpio圧縮を用いる、cpioコマンドを用いて解凍することができる、cpio-i-F ramdisk.imgは、解凍するといくつかのフォルダとファイルが生成されていることがわかります.これらのファイルを見ると、rootディレクトリの下の内容と全く同じであることがわかります.ラムディスクについて説明した.imgは実はrootディレクトリのパッケージと圧縮です.次にシステムを分析する.imgのソース.build/core/Makefileの629行には、このような文字が表示されます.
# The installed image, which may be optimized or unoptimized.
  #
  
 INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
         ,      $(PRODUCT_OUT)     system.img
        , 662    copy-file-to-target,     system.img          /generic  。
 BUILD_SYSTEM    636 。
    system.img  /generic           system.img,           ,        。           out /target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates     system.img   /generic   。
 
今、システムを知っています.imgの由来を分析し、何が含まれているのかを分析します.
 Makefile line624
 $(BUILT_SYSTEMIMAGE_UNOPT): $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_MKUSERFS)
 $(call build-systemimage-target,$@)
build-systemimg-target Makefile line 605が呼び出されました
 ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)
 ## generate an ext2 image
 # $(1): output file
 define build-systemimage-target
 @echo "Target system fs image: $(1)"
 $(call build-userimage-ext2-target,$(TARGET_OUT),$(1),system,)
 endef
 else # TARGET_USERIMAGES_USE_EXT2 != true
 ## generate a yaffs2 image
 # $(1): output file
 define build-systemimage-target
 @echo "Target system fs image: $(1)"
 @mkdir -p $(dir $(1))
 *$(hide) $(MKYAFFS2) -f $(TARGET_OUT) $(1)*
 endef
 endif# TARGET_USERIMAGES_USE_EXT2
TARGET_が見つかりませんUSERIMAGES_USE_EXT 2の定義!!!しかし,上記の解析からyaffs 2ファイルシステムであるべきであると推定できる.
ここでMKYAFFS 2:(core/config.mk line 161)
 MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX)
定義MKYAFFS 2は、ディレクトリ/media/disk/mydroid/out/host/linux-x 86/binの下にある実行可能ファイルmkyafs 2 imageであり、このプログラムを実行すると次の情報が得られます.
#./mkyaffs2image
 mkyaffs2image: image building tool for YAFFS2 built Nov 13 2009
 usage: mkyaffs2image [-f] dir image_file [convert]
 -f fix file stat (mods, user, group) for device
 dir the directory tree to be converted
 image_file the output file to hold the image
 'convert' produce a big-endian image from a little-endian machine
このプログラムはyaffs 2のファイルシステムイメージを生成できることが分かった.さらに上の*$(hide)$(MKYAFFS 2)-f$(TARGET_OUT)$(1)*の機能も明らかになり、TARGET_OUTディレクトリをyaffs 2形式に変換して/media/disk/mydroid/out/target/product/generic/obj/PAKAGING/systemimage_に出力unopt_intermediates/system.img(つまり、最終的に/genericディレクトリの下で見たシステム.img).
今までシステムを知らなかった.imgの発生過程はsystemを明らかにしなければならない.imgの中身は、TARGET_を分析しますOUTディレクトリの内容です.(mountでsystem.imgをlinuxの下にマウントして中身を見たいのですが、yaffsとyaffs 2ファイルシステムはサポートされていません!!)
次のステップ:TARGET_の分析OUTはbuild/core/envsetup.shファイル(line 205)にTARGET_が見つかりましたOUTの定義:
 TARGET_OUT := $(PRODUCT_OUT)/system
すなわち/media/disk/mydroid/out/target/product/genericディレクトリの下にあるsystemディレクトリです.
#tree -L 1
 .
 |-- app
 |-- bin
 |-- build.prop
 |-- etc
 |-- fonts
 |-- framework
 |-- lib
 |-- usr
 `-- xbin
すべてが分かった最終的に見たのは
system.imgファイルは、linuxのルートファイルシステムに似たイメージ、androidが置かれたアプリケーション、プロファイル、フォントなど、そのディレクトリの下にあるsystemディレクトリのイメージです.
 
Userdata.imgはdataディレクトリから来ており、デフォルトではファイルはありません.
ramdisk.img、system.img、userdata.imgミラーの分解過程:1、ramdisk.img:RAM DISK(initrd)は、ブート時にカーネルが読み取り専用でマウントされる小さなパーティションミラーです./initと一部のプロファイルのみを保護します.他のファイルシステムミラーを初期化およびマウントするために使用されます.RADISKは標準的なLinux特性です.ramdisk.imgはGoogle android SDK($SDK_ROOT/tools/lib/images/ramdisk.img)に含まれており、コンパイルして生成することもできます($SDK_ROOT/out/target/product/$PRODUT_NAME/ramdisk.img).これはgzip圧縮CPIOファイルです.AndroidのRADISKミラーを修正するには、まずLinuxマシンにコピーし、次のコマンドで解除します.中のディレクトリが表示されます.user@computer:$ mv ramdisk.img ramdisk.cpio.gz gzip -d ramdisk.cpio.gz mkdir ramdisk cd ramdisk  cpio -i -F ../ramdisk.cpioが解けたら、無駄なファイルを修正して削除した後、次のコマンドでramdiskを再作成します.cpio: user@computer:$ cpio -i -t -F ../ramdisk.cpio | cpio -o -H newc -O ../ramdisk_new.cpioは、名前を変更して圧縮することができます.user@computer:$ cd .. gzip ramdisk_new.cpio mv ramdisk_new.cpio.gz ramdisk.img 2、SYSTEM、DATAミラーシステム.imgは、すべてのシステム実行可能ファイルを含むマウント/下のミラーです.userdata.imgは/dataの下のミラーにマウントされ、アプリケーションおよびユーザー関連のデータが含まれています.実際の物理装置ではramdiskのinitを通過する.rcスクリプトはファイルシステムとしてマウントされます.YAFFS 2、EXT 4、UBI-FSなど、さまざまなフォーマットがあります.Android構築システムによって生成され、物理デバイスにブラシされます.シミュレータの使用は異なる(以下参照):3、Androidシミュレータミラーシステム.imgはシミュレータの動作のために一時ファイルにコピーされます.シミュレータのルートディレクトリを変更すると、シミュレータが終了した後に失われます.userdata.imgは-wipe-dataパラメータを使用した場合にのみ使用されます.通常は~/.android/userdata-qemu.img(linux下)は/dataパーティションミラーとしてマウント、-wipe-dataを使用するとuserdataがコピーされます.imgの内容はuserdata-qemu.img. sdcard.img-sdcardパラメータを使用する場合は/sdcard cacheにマウントする.imgは、-cacheパラメータを使用して/cacheコンテンツを指定するために使用されます.このパラメータが指定されていない場合、シミュレータが起動すると、空の一時ファイルが/cacheにマウントされます.この一時ファイルは終了時に自動的に消去されます.シミュレータはsystemを変更しません.imgとuserdata.img. 4、Android’s YAFFS 2ミラーを解体するYAFFS 2ファイルはLinuxで「VMS Alpha executable」ファイルと識別される.user@computer:$ file ${SDK_ROOT}}/out/target/product/imx51_ccwmx51js/system.img ./out/target/product/imx51_ccwmx51js/system.img:VMSAlpha executable Googleコードステーションからunyaffsをダウンロードします.上記の実行可能ファイルがシステムで動作しない場合は、ソースコードをダウンロードして再コンパイルすることもできます.user@computer:$ gcc -o unyaffs unyaffs.c sudo chmod+x/complete/directory/path/to/unyaffsこのコマンドを使用してYAFF 2ミラーファイルを分解します.user@computer:$ mkdir image cd image unyaffs ../system.img 5、EXT 4ミラーを解体EXT 4ミラーがEXT 4であれば簡単で、直接マウントしてその内容を読み取ることができます.user@computer:$ mount -o loop -t ext4 system.img/media 6、JFFS 2ミラーの取り外しを補足として、ここではJFFS 2ミラーの取り外し方法について説明します.user@computer: modprobe mtdblock modprobe jffs2 modprobe mtdram total_size=65536 erase_size=256 mknod/tmp/mtdblock0 b 31 0 dd if=/pathtoimage/rootfs.jffs2 of=/tmp/mtdblock0 mount -t jffs2/tmp/mtdblock0/mnt