android_源码结构/安装后结构/启动过程/smali语言/源码buildApk





  Android2.1源码目录结构:
  Makefile
  bionic,bionic C库;核心思想,简单化;即C库应该只提供对内核功能的轻量级封装,不应该过于智能化,考虑太多的边界条件;和glibc相比,程序启动速度,提升近两个数量级;
  bootable,启动引导相关代码;eg.bootable/diskinstaller,android镜像打包器,x86可生产iso;bootable/recovery,系统恢复相关;
  build(存放系统编译规则及generic等基础开发包配置)
  cts,Android兼容性测试套件标准;CompatibilityTestSuite;eg.MediaCode能够处理ByteBuffer和Suface输入;/cts/tests/tests/media/src/android/media/cts/InputSurface.java
  dalvik(dalvik JAVA虚拟机)
  development(应用程序开发相关)
  external,android使用的一些开源的模组;eg.frameworks/base/core/java/com/android/internal
  frameworks,核心框架——java及C++语言;eg.frameworks/base/core/java/android/content/pm/PackageParser.java
  hardware(部分厂家开源的硬解适配层HAL代码)
  out(编译完成后的代码输出与此目录)
  packages,应用程序包;eg.日历/通讯录等apk在这个目录下。
  prebuilt,x86和arm架构下预编译的一些资源;eg.预编译monkeyrunner.jar/chimpchat.jar/draw9patch.jar;
  sdk(sdk及模拟器)
  system(底层文件系统库、应用及组件——C语言)
  vendor,厂商定制代码;eg.预编译的一些驱动,核心等;vendor,供应商,比如三星,MOTO,HTC等,vendor识别手机硬件供应商,软硬兼容等信息.制作自己的vendor,主要修改此目录.

  /frameworks/opt/可选部分。
  /frameworks/base/基本内容。
  /frameworks/base/camera/摄像头服务程序库.
  /frameworks/base/cmds/重要命令:am、app_proce等.
  /frameworks/base/core/核心库.
  /frameworks/base/data/字体和声音等数据文件.
  /frameworks/base/graphics/图形相关.
  /frameworks/base/keystore/和数据签名证书相关.
  /frameworks/base/location/地区库.
  /frameworks/base/media/媒体相关库.
  /frameworks/base/packages/设置、TTS、VPN程序.
  /frameworks/base/services/各种服务程序.
  /frameworks/base/vpn/VPN.
  /frameworks/base/wifi/无线网络.

  编译后:
  xdaDeveloper;有问题,开发问题找google;
  ramdisk.img是一个分区映像文件,即是一个文件系统(root file system),kernel启动时,ramdisk负责init;对应Android源码编译后root文件夹,包括system/data/bin/dev等目录;ramdisk.img是采用cpio打包/gzip压缩的;
  $file ramdisk.img;#查看文件格式; $mv ramdisk.img ramdisk_gz.img.gz; $gunzip ramdisk_gz.img.gz; $cpio -i -F ramdisk_gz.img; 或者$gunzip -S .img ramdisk.img;#强制执行;
  #内容与root文件夹一样;然后把源码编译后生成的system和userdata复制到ramdisk/system和ramdisk/userdata下,这样就得到一个完整的文件系统了;
  system.img包括了主要系统,系统app/包/库等文件;编译后的system目录,格式为yaff2文件系统;它将被init进程通过解析init.rc文件mount到/system目录下;$out/host/linux-x86/bin/mkyaffs2im system/ system.img;
  userdata.img包括了一些用户数据;格式为yaff2文件系统;它将被init进程通过解析init.rc文件mount到/data目录下;
  $./simg2img system.img system.img.ext4;#文件格式data->ext4;  $mount -t ext4 -o loop system.img.ext4 /mnt/cdrom/;#挂载后,就可以查看里面的文件了;
  $sudo umount /mnt/cdrom; #停止挂载;

  Android启动过程:
  由UBOOT传入一个init参数,这个init参数制定了开机的时候运行的第一个运行的程序,默认就是init程序,这个程序就在ramdisk.img中,它的源文件在system/core/init/init.c中;
  它会调用init.rc初始化这个文件,这个文件在out/target/product/generic/root下;
  android启动时首先加载的是ramdisk.img镜像,并挂载到/目录下,并进行一系列的初始化动作,包括创建各种需要的目录,初始化console,开启服务等;
  system.img是在init.rc中指定一些脚本命令,通过init.c进行解析并挂载到根目录下的/system目录下的;

  android系统根目录结构:
  cache:是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处;
  sdcard:是SD卡中的FAT32文件系统挂载的目录;
  etc:指向/system/etc,众所周知的配置文件存放目录;
  system:是一个很重要的目录,系统中的大部分东西都在这里了
  sys:用于挂载sysfs文件系统;在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值
  sbin:只放了一个用于调试的adbd程序;
  proc:proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用;
  data:存放用户安装的软件以及各种数据;
  dev:不用多说了,设备节点文件的存放地;
  下面是非目录的文件,runme.sh用于SD卡中EXT2文件系统的自动挂载动作的脚本;
  init.trout.rc/init.rc/init.goldfish.rc是初始化文件;
  init是系统启动到文件系统的时候第一个运行的程序;

  system目录结构:在Android文件系统占有及其重要的位置,基本上所有的工具和应用程序都在这个目录下,我看来是一个真正fs;他在Android手机中存放在nandflash的mtd3中,是一个yaffs2文件系统,在启动时被挂载在root的/system目录下;
  /system/xbin:下放了很多系统管理工具,这些工具不是到toolbox的链接,每个都是可执行程序;这些命令不常用,他们都是为系统管理员准备的,是一些系统管理和配置工具;这个文件夹的作用相当于标准Linux文件系统中的/sbin;
  /system/modules:使用来存放内核模块(主要是fs和net)和模块配置文件的地方;
  /system/framework:是JAVA平台的一些核心文件,属于JAVA平台系统框架文件;里面的文件都是.jar和.odex文件;备注,odex是被优化过的JAVA程序文件,体积通常是.jar的4倍左右,执行效率比.jar高;
  /system/fonts:很显然,这是字体库文件的存放目录;
  /system/etc:这里存放了系统中几乎所有的配置文件,根目录下的/etc就链结于此;
  /system/build.prop:是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似于/etc中的文件;
  /system/media:里面主要是存放了系统的铃声的,分为notifications(通知)/ui(界面)/alarms(警告)和ringtones(铃声)里面都是.ogg音频文件;
  /system/bin:众所周知,是存放用户常用的工具程序的,其中大部分是到toolbox的链接(类似嵌入式Linux中的busybox);toolbox应该是google简化版的busybox;  $mount命令就在此;
  /system/usr:用户的配置文件,如键盘布局/共享/时区文件等,您可以cat来看看;
  /system/app:顾名思义,存放的是Android系统自带的JAVA应用程序;
  /system/lost+found:yaffs文件系统固有的,类似回收站的文件夹,只有是yaffs文件系统都会有;
  /system/lib:存放几乎所有的共享库(.so)文件;
  /system/sd:SD卡中的EXT2分区的挂载目录;
  /system/init.rc:一个初始化脚本,用于将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏;

  PhoneWindowManager.java在/frameworks/base/policy/src/com/android/internal/policy/imp下;
  PackageParser.java在/frameworks/base/core/java/android/content/pm下;
  ViewRootImpl.java在/frameworks/base/core/java/android/view下;
 
  root流程:
  $adb shell getprop ro.product.name; #获取设备名称;属性值存储在/system/build.prop目录下;
  $adb shell cat /proc/sys/kernel/osrelease; #获取系统kernel版本;Android源码下无此属性,属于Linux内核内容;
  $adb shell mount; #列举设备挂载;该命令位于/system/bin/下;

  Smali:Dalvik虚拟机指令语言;
  Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种;dex格式文件的汇编器,反汇编器;冰岛语;Dalvik是一个冰岛渔村名字;
  方法签名;
  Smali代码注入只能应对函数级别的移植,对于类级别的移植是无能为力的;具体的说,如果你想修改一个类的继承/包含关系,接口结构等是非常困难的;但对于修改类成员变量访问控制权限,类方法实现,Smali代码注入的方法是可以实现的;
  主要是因为Samli级代码的灵活性已经远低于java源代码,而且经过编译优化后,更注重程序的执行效率;
  apktool可以反编译apk文件,里面包含smali语言的代码;可以修改smali语音代码,之后在apktool编译成apk文件,并进行运行;

  源码下build自定义apk:
  在packages/apps/smali直接放入工程文件,编写Android.mk;
  $mmm packages/apps/smali; #编译apk/jar文件;
  $make snod; #编译system.img包;


发布了8 篇原创文章 · 获赞 7 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/liu31187/article/details/24488783