Android学习之Build环境初探

这里略过对android在手机上的文件系统框架的阐述(google或者baidu都能帮助你找到对应的信息),主要看google是如何把生成合适的rootfs的工作整合到它的build体系当中,同时,会顺带看一下CyanogenMod中对应各种机型的build机制。

首先,来看一下Android的build系统中,使用到的编译选项和相关工具

具体的目录在:mydroid/build/tools/下

|-- acp

这是一个稍微改良的cp命令,用来应付在windows/MAC/Linux下的cp命令的缺陷,其中的README很值得一看!

|-- adbs

这是一个用来查看crash问题的工具,详细请看《Android调试工具之adbs》

|-- Android.mk

|-- apicheck

用来进行发布前的API检查(参见mydroid/build/core/tasks/apicheck.mk),是否新编译的系统中有破坏API兼容性或是非法的API

这里的代码是用Java写的用来检查编译时生成的API相关信息的xml文件(mydroid/framework/base/api/中),可以参考里面对于xml文件解析的代码

|-- apriori

实现prelink的工具,简单介绍参见(mydroid/bionic/linker/README.TXT)

|-- atree

为android SDK服务的一个工具,用来按照指定xxx.atree文件中的内容进行一些文件操作

|-- bin2asm

不太明白具体的用处,应该是用来应付mac上编译android一些与gcc相关的问题

|-- buildinfo.sh

生成target中的各种xxx.prop文件,如system.prop, build.prop等

|-- check_builds.sh

包装了diff,用来看2个发布版本之间变化

|-- check_prereq

device上进行ota升级时的工具之一

|-- compare_fileslist.py

与check_builds.sh配合完成版本比较的脚本

|-- droiddoc

Android更具javadoc的一些移植

|-- dump-package-stats

简单的查看一个jar/apk文件内的dex和其它文件的大小信息

|-- event_log_tags.py

处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

|-- fileslist.py

简化的列出指定目录下所有文件及大小的脚本 -- 可以放入自己的工具库了使用:)

|-- findleaves.py

在指定目录中(可多个)找指定文件的脚本 -- 可以放入自己的工具库了使用:)

|-- fixlinebreaks.sh

把windows中的换行改为linux下的 -- 可以放入自己的工具库了使用:)

|-- fs_config

列出指定文件夹及文件的权限

|-- fs_get_stats

得到指定文件夹下文件的简单stats信息

|-- iself

判断文件是否是ELF格式

|-- isprelinked

判断文件是否是prelink过的

|-- java-event-log-tags.py

处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

|-- kcm

key character map的工具, 相关资料参照:#androidKeymapKeyCharMap

|-- lsd

!!!!!! ???

|-- merge-event-log-tags.py

处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

|-- mktarball.sh

与fs_get_stats配合而执行的打包工具

|-- print_module_licenses.sh

显示当前目录下所有module信息

|-- releasetools

-- check_target_files_signatures

|-- common.py

|-- edify_generator.py

|-- img_from_target_files

|-- ota_from_target_files

`-- sign_target_files_apks

|-- rgb2565

rgb转换工具

|-- signapk

命令行下对jar包签名的工具

|-- soslim

Android定制的编译工具之一,简单介绍参见(mydroid/bionic/linker/README.TXT)

|-- warn.py

解析Android系统编译log的工具

`-- zipalign

zipfile的对齐工具,参见该文件夹下的README.TXT

在来看看Android编译系统中定义的一些通用XXX.mk文件

mydroid/build/core/

|-- armelflib.x

|-- armelf.x

|-- armelf.xsc

|-- base_rules.mk

|-- binary.mk

|-- build_id.mk

|-- build-system.html

|-- checktree

|-- cleanbuild.mk

|-- cleanspec.mk

|-- clear_vars.mk

|-- combo

|-- config.mk

|-- copy_headers.mk

|-- definiTIons.mk

|-- device.mk

|-- dex_preopt.mk

|-- distdir.mk

|-- droiddoc.mk

|-- dumpvar.mk

|-- dynamic_binary.mk

|-- envsetup.mk

|-- executable.mk

|-- filter_symbols.sh

|-- find-jdk-tools-jar.sh

|-- help.mk

|-- host_executable.mk

|-- host_java_library.mk

|-- host_naTIve_test.mk

|-- host_prebuilt.mk

|-- host_shared_library.mk

|-- host_staTIc_library.mk

|-- java_library.mk

|-- java.mk

|-- legacy_prebuilts.mk

|-- main.mk

|-- Makefile

|-- mulTI_prebuilt.mk

|-- native_test.mk

|-- node_fns.mk

|-- notice_files.mk

|-- package.mk

|-- pathmap.mk

|-- phony_package.mk

|-- prebuilt.mk

|-- process_wrapper_gdb.cmds

|-- process_wrapper_gdb.sh

|-- process_wrapper.sh

|-- product_config.mk

|-- product.mk

|-- proguard.flags

|-- proguard_tests.flags

|-- raw_executable.mk

|-- raw_static_library.mk

|-- root.mk

|-- shared_library.mk

|-- static_java_library.mk

|-- static_library.mk

|-- tasks

|-- user_tags.mk

`-- version_defaults.mk

这里,目录在mydroid/build/core/tasks/有一些特别的task

|-- apicheck.mk, 判断api是否符合AOSP的规范

|-- cts.mk cts测试, 可以在代码根目录, make cts, 编译结束之后,进入out/host/linux-x86/bin/下,执行cts命令

|-- ide.mk  IDE开发环境

|-- product-graph.mk

`-- sdk-addon.mk

NDK的build环境没有包含在标注难得AOSP的/build/目录下

而是在mydroid/ndk/build下

$ cd ndk/build/tools

$ export ANDROID_NDK_ROOT=aosp-root/ndk

$ ./make-release --help

一些小技巧

如何显示每次编译所包含的所有xxx.mk文件

找到build/core/main.mk

把include $(subdir_makefiles)替换为

[plain] view plaincopy $(foreach subdir_makefile, $(subdir_makefiles),

$(info Including $(subdir_makefile))

$(eval include $(subdir_makefile))

)

subdir_makefile :=

如果遇见API相关的PACKAGING/checkapi-current-timestamp] Error 38

需要执行:make update-api

如何在AOSP代码目录之外编译

[plain] view plaincopy # Paths and settings

TARGET_PRODUCT = generic

ANDROID_ROOT = /home/karim/android/aosp-2.3.x

BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc

PRODUCT_OUT = $(ANDROID_ROOT)/out/target/product/$(TARGET_PRODUCT)

CROSS_COMPILE =

$(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

# Tool names

AS = $(CROSS_COMPILE)as

AR = $(CROSS_COMPILE)ar

CC = $(CROSS_COMPILE)gcc

CPP = $(CC) -E

LD = $(CROSS_COMPILE)ld

NM = $(CROSS_COMPILE)nm

OBJCOPY = $(CROSS_COMPILE)objcopy

OBJDUMP = $(CROSS_COMPILE)objdump

RANLIB = $(CROSS_COMPILE)ranlib

READELF = $(CROSS_COMPILE)readelf

SIZE = $(CROSS_COMPILE)size

STRINGS = $(CROSS_COMPILE)strings

STRIP = $(CROSS_COMPILE)strip

export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF

SIZE STRINGS STRIP

# Build settings

CFLAGS = -O2 -Wall -fno-short-enums

HEADER_OPS = -I$(BIONIC_LIBC)/arch-arm/include

-I$(BIONIC_LIBC)/kernel/common

-I$(BIONIC_LIBC)/kernel/arch-arm

LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker

$(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o

$(PRODUCT_OUT)/obj/lib/crtend_android.o

-L$(PRODUCT_OUT)/obj/lib -lc -ldl

# Installation variables

EXEC_NAME = example-app

INSTALL = install

INSTALL_DIR = $(PRODUCT_OUT)/system/bin

# Files needed for the build

OBJS = example-app.o

# Make rules

all: example-app

.c.o:

$(CC) $(CFLAGS) $(HEADER_OPS) -c {1}lt;

example-app: ${OBJS}

$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)

install: example-app

test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)

$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)

clean:

rm -f *.o $(EXEC_NAME) core

distclean:

rm -f *~

rm -f *.o $(EXEC_NAME) core

如何增加一个新的设备

[plain] view plaincopy $ cd ~/android/aosp-2.3.x

$ . build/envsetup.sh

$ mkdir -p device/acme/coyotepad

$ cd device/acme/coyotepad

进入AndroidProducts.mk

PRODUCT_MAKEFILES :=

$(LOCAL_DIR)/full_coyotepad.mk

对于full_coyotepad.mk

$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)

$(call inherit-product, $(SRC_TARGET_DIR)/product/full.mk)

DEVICE_PACKAGE_OVERLAYS :=

PRODUCT_PACKAGES +=

PRODUCT_COPY_FILES +=

PRODUCT_NAME := full_coyotepad

PRODUCT_DEVICE := coyotepad

PRODUCT_MODEL := Full Android on CoyotePad, meep-meep

在BoardConfig.mk中

TARGET_NO_KERNEL := true

TARGET_NO_BOOTLOADER := true

TARGET_CPU_ABI := armeabi

BOARD_USES_GENERIC_AUDIO := true

USE_CAMERA_STUB := true

打开vendorsetup.sh

add_lunch_combo full_coyotepad-eng

android 网络文件系统,android在手机上的文件系统框架的阐述相关推荐

  1. android 网络通信方式,Android中基于TCP协议的网络通信

    一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...

  2. android动态图制作,Android 教程:如何在手机上制作高质量的 GIF 图片

    相比于静态图片的一动不动,GIF 图片显得十分生动活泼,并且能表现一定的情节.虽然已经有 GIF 快手.美图 GIF 这类易用的 GIF 制作应用,但其有着诸多的限制,像时长.分辨率等都不可自行调节. ...

  3. android icloud云盘,现在 Android 用户也可以在手机上使用 iCloud 了

    在 2020 年为自家的云服务推出移动版网站还真是新潮呢 如果你是 Macbook 或 同时拥有 iPhone 手机的 Android 用户的话,那么一个好消息是,今天 Apple 终于为自家的云服务 ...

  4. android 网络信号,Android获取移动网络信号强度的方法

    判断有没有 SIM 卡 获取移动网络的信号,一定要判断是否插了 SIM 卡,没插卡肯定是没法获取的 /** * 判断是否包含SIM卡 * * @return 状态 */ public static b ...

  5. android网络转圈,android基于dialog加载时转圈圈很好的demo

    [实例简介] 这是一个android基于dialog加载时转圈圈很好的完整demo,很适合新手学习,希望对有需要的朋友能得到帮助 [实例截图] [核心代码] dialog_anim └── dialo ...

  6. 基于Http协议的Android网络编程

    之前写过一篇Android网络编程<浅谈android网络编程>,随着了解了更多Android知识,我意识到HttpClient已经不推荐使用了,更是在Android 6.0中被废弃了,原 ...

  7. 让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行

    本节目录 1. 一些传统的方法 2. 将程序的代码生成二维码图片 3. 使用手机扫描生成的二维码,并将其转化为py脚本 前言 最手机上写脚本是一件每场辛苦的事情,虽然SL4A人性化的为我们提供了API ...

  8. python写手机脚本脱离电脑_让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行...

    本节目录 1. 一些传统的方法2. 将程序的代码生成二维码图片3. 使用手机扫描生成的二维码,并将其转化为py脚本 前言 最手机上写脚本是一件每场辛苦的事情,虽然SL4A人性化的为我们提供了API快速 ...

  9. 如何给Android添加可视化工具,可视化实现在手机上抓包 方便调试 OkNetworkMonitor...

    OkNetworkMonitor 一个基于 stetho 的 OKhttp 抓包工具,可以实现在手机上面的抓包,可以方便平时开发中的调试. 目前可以看到 请求头.响应头.响应数据 等,后续还会再增加. ...

  10. android 图片放大缩小_贴在手机上的显微镜,轻松放大400倍,化身“蚁人”玩转微观世界...

    记得在漫威电影<蚁人>里,男猪脚只要穿上那套黑科技制服,按下开关,"咻"的一声就缩到蚂蚁大小,并操控蚂蚁.昆虫和自己并肩作战!!简直不要太酷! 蚁人"进入微观 ...

最新文章

  1. mybatis CRUD操作
  2. css毛玻璃效果白边_css3毛玻璃效果白边问题
  3. ssh免密码登陆设置
  4. 揭开网络编程常见API的面纱【下】
  5. win8系统如何开服务器,Win8.1怎么打开IIS服务器?Win8.1专业版64位系统中打开IIS服务器的方法...
  6. Java中方法和数组
  7. tomcat源码分析--初始化与启动
  8. 假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。...
  9. 比Excel还简单的SQL语句查询
  10. Oracle动态性能视图学习之v$session_longops
  11. Qualcomm笔记
  12. python原生是什么意思_什么是 云原生?
  13. v u e + ts excel表的导入解析转换 加下载excel表格式(个人笔记)
  14. ViewBag和ViewData的用法和区别
  15. 校园IPTV数字电视教学直播系统方案-淮安生态文旅区实验小学
  16. 电话机器人效果怎么样,电话机器人代理
  17. Apriori算法及例题
  18. 错误提示——0x0FE1E63C (ucrtbased.dll)处(位于 liaoabiao _2019.12.21.exe 中)引发的异常: 0xC0000005: 写入位置 0x005FA000
  19. flash制作打地鼠游戏代码,打地鼠游戏编程代码
  20. mysql无法停止slave_遇到诡异的问题 stop slave 无法停止

热门文章

  1. 【Day4.3】大皇宫内蹭讲解
  2. 解决JSONNull导致的JSONObject序列化问题
  3. 厂级监控系统镜像服务器,厂级监控信息系统(SIS).PDF
  4. 【读书笔记】两个天才 发挥孩子的创造力 4岁以上 蒲蒲兰绘本
  5. android vendor接口,HIDL众多service在那启动的--/vendor/etc/init/android.hardware.*@2.0-service.rc...
  6. LCS(最大公共子序列)问题
  7. CyanogenMOD移植教程]
  8. 成功解决pyinstaller打包时报错:lib not found的问题
  9. Mac垃圾文件清理指南
  10. 模拟游戏在设计上是如何处理对仿真性的追求的?