您的位置:首页 > 移动开发 > Android开发

Android product development

2016-01-20 11:14 393 查看

Building

Check Android Version

build/core/version_defaults.mk -> android version tag

Addproject in lunch menu

"lunch XXXX" procedure is related with the followingcodes

build/core/envsetup.sh:453:function lunch()

build/core/envsetup.mk:114:include $(BUILD_SYSTEM)/product_config.mk

Howto build bootloader separately

android build bootloader command is "makebootloader"

#Build swith of Kernel and bootloader

Android/device/..../*.mk

Key variable:

TARGET_NO_BOOTLOADE

TARGET_NO_KERNEL

AddKernel Makefile in Android system

Configurepath of kernel build

-> vi device/qualcomm/MSMxxx/AndroidBoard.mk

-include kernel/kernel/AndroidKernel.mk

-> vi kernel/kernel/AndroidKernel.mk

$(MAKE) -C kernel O=../$(KERNEL_OUT) ARCH=armCROSS_COMPILE=arm-eabi- headers_install

.......

EXT4filesystem generation

Take Android make userdata.img forexample:

(1) make_ext4fs executable file codes' location:

./system/extras/ext4_utils/Android.mk:LOCAL_MODULE := make_ext4fs

(2) Direct shell script file who uses make_ext4fs

In android/system/extras/ext4_utils/mkuserimg.sh

(3) mkuserimg.sh callstack:

build/core/config.mk:MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg.sh

build/core/Makefile:593:INTERNAL_USERIMAGES_DEPS := $(MKEXTUSERIMG)$(MAKE_EXT4FS) $(SIMG2IMG) $(E2FSCK)

envsetup.sh

make snod //package tobuild system.img ....

mm GPSUI TARGET_PRODUCT=msmxxx

use '-h' help command to review all of envsetup.sh, like 'mm -h'

- croot: Changes directory to thetop of the tree.

- m: Makes from the top of the tree.

[b]- mm: Builds all of the modules in thecurrent directory.

- mmm: Builds all of the modules in thesupplied directories.
[/b]

(mmm external/sepolicy --just-print我们可以看到sepolicy编译时都干了些什么, [using make function])

- cgrep: Greps on all local C/C++ files.

- hgrep: Greps on all local C/C++ header files.

- jgrep: Greps on all local Java files.

- mkgrep: Greps on all local make files.

- rcgrep: Greps on all local .rc files.

- resgrep: Greps on all local res/*.xml files.

- shgrep: Greps on all local .sh files.

- godir: Go to the directory containing a file.

How to generate boot.img

(1) Overview

Kernel image格式是Linux标准的zImage,根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式

分区的具体格式见:system/core/mkbootimg/*.c *.h 生成mkbootimg (out/host/linux-x86/bin/)

(2) 单独编译kernel代码并生成boot.img

1. 编译kernel,生成zImage(skip)

NOTE 1: Final path of ".config" : android/out/target/product/garda3gcmcc/obj/KERNEL/.config

NOTE 2: 编译时使用:android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

2. 制作boot.img,原理是把内核和根文件系统从现成的boot.img抽取出来,替换kernel后再次打包。

抽取工具:unpackbootimg

打包工具:mkbootimg

上面两个工具来源于蓝点工坊,其把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。

解包命令:

unpackbootimg -i ./boot.img -o ./out

打包命令:

./mkbootimg --cmdline 'console=ttyS1,115200n8' --kernel kernel --ramdisk boot.img-ramdisk.gz -o boot.img --base 00000000

其中cmdline、base的值来源于unpackbootimg的输出, kernel即为替换的zImage
(3) 篡改ramdisk
gunzip boot.img-ramdisk.gz

mkdir root && cd root

cpio -i -F ../boot.img-ramdisk

//here you can modify some *.rc

cd ..

../mkbootfs root | ../minigzip > ramdisk.img

(4) 另外,直接利用Android的“make bootimage”生成boot.img

步骤:

. build/envsetup.sh

Lunch **

Make bootimage

会直接生成boot.img

打包userdata镜像

制作userdata.img

cd out/host/linux-x86/bin/

#./make_ext4fs -s -l 1605353472 -adata ../../../../out/target/product/msmxxx/userdata.img../../../../out/target/product/msmxxx/data

NDK

OVERVIEW

Native Development Kit

refer to : http://developer.android.com/sdk/ndk/index.html
Refer to : src/ndk/docs/OVERVIEW.html

Quote: The Android NDK is a set of tools that allows Android application developers

to embed native machine code compiled from C and/or C++ source files into their application packages.

1、NDK是一系列工具的集合。

? NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

? NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

? NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2、NDK提供了一份稳定、功能有限的API头文件声明。

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

3、NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。

1. 使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

2. 使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。

3. NDK促使专业so组件商的出现。(乐观猜想,要视乎Android用户的数量)

Android NDK解决了核心模块使用托管语言开发执行效率低下的问题,同时提高了代码的安全性

Android.mk语法规范

/*This segment may come from Internet*/

reference:

src/ndk/docs/text/ANDROID-MK.text

src/ndk/docs/text/OVERVIEW.text

build/core/Makefile (类似PRODUCT_COPY_FILES)

Overview

一个Android.mk file用来向编译系统描述你的源代码,该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。

LOCAL_PATH := $(call my-dir)

宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)

  include $( CLEAR_VARS)

  指向一个编译脚本,几乎所有未定义的LOCAL_XXX变量都在"Module-description"节中列出。你必须在开始一个新模块之前包含这个脚本。CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除了LOCAL_PATH 。

  LOCAL_MODULE := helloworld

  LOCAL_SRC_FILES := helloworld.c

  LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。

  include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量生成静态库。

  NDK编译系统保留下列变量名:

  -以LOCAL_开头的名字(例如 LOCAL_MODULE)

  -以PRIVATE_, NDK_ or APP_开头的名字(内部使用)

-小写名字(内部使用,例如’my-dir’)

Macro Function

以下是一些GNU Make的宏‘函数’,必须通过这样的形式调用:

'$(call <function>)'。

all-subdir-makefiles

返回‘my-dir’子目录下的所有Android.mk。比如,代码的结构如下:

sources/foo/Android.mk

sources/foo/lib1/Android.mk

sources/foo/lib2/Android.mk

如果sources/foo/Android.mk里有这样一行:

include $(call all-subdir-makefiles)

那么,它将会自动地includesources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk

这个函数能将深层嵌套的代码文件夹提供给生成系统。注意,默认情况下,NDK仅在

source/*/Android.mk里寻找文件。

this-makefile

返回当前Makefile(译者注:指的应该是GNU Makefile)的路径(即,这个函数是在哪里调用的)

parent-makefile

返回在列入树(inclusion tree)中的父makefile的路径。

即,包含当前makefile的那个makefile的路径。

grand-parent-makefile

猜猜看...(译者注:原文为Guess what...)

Variable

在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义其中的一些变量

用来向生成系统描述你的组件的

LOCAL_PATH

这个变量用来设置当前文件的路径。你必须在Android.mk的开始处定义它,比如:

LOCAL_PATH := $(call my-dir)

这个变量不会被$(CLEAR_VARS)消除

LOCAL_MODULE

定义组件的名称

LOCAL_SRC_FILES

用它来定义所有用来生成组件的源文件

注意,所有文件名都是相对于LOCAL_PATH的

LOCAL_CPP_EXTENSION

这是一个可选的变量,可用它来指明C++源文件的扩展名。默认情况下是'.cpp',

但你可以改变它。比如:

LOCAL_CPP_EXTENSION := .cxx

LOCAL_C_INCLUDES

添加包含的头文件路径

like,LOCAL_C_INCLUDES += external/libiconv/include

like,LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

LOCAL_CFLAGS

一个可选的编译标记集,在生成C与C++源文件时,将解析它。

例如:LOCAL_CFLAGS := -O2 -Wall -DLINUX

LOCAL_CPPFLAGS

一个可选的编译标记集,*仅*在生成C++源文件时解析它。在编译器的命令行里

它将在LOCAL_CFLAGS之后出现。

LOCAL_STATIC_LIBRARIES

一份static libraries组件的名单(以BUILD_STATIC_LIBRARY的方式生成),它将被

连接到欲生成的组件上。这仅在生成shared library组件时有意义。(译者注:将指定

的一个或多个static library module转化为一个shared library module)

LOCAL_SHARED_LIBRARIES

一份该组件在运行期依赖于它的shared libraries *组件*。在连接时间(link time)里

与及为该生成的文件嵌入相应的信息都要用到它。

注意,它并不将这份组件名单添加入生成图表(build graph)。即,在你的Android.mk

里,你仍应该将它们加入到你的应用程序要求的组件。

LOCAL_LDLIBS

一份能在生成你的组件时用到的额外的连接器标记(linkerflags)的名单。在传递

有“-l”前缀的特殊系统库的名称时很有用。比如,下面的语句会告诉连接器在装载

时间(load time)里生成连接到/system/lib/libz.so的组件。

例如:LOCAL_LDLIBS += -lpthread

LOCAL_SHARED_LIBRARIES和LOCAL_LDLIBS是什么关系?

前者的话,编译时需要检测动态库是否需要重新编译,后者不需要。

在源码中使用libskia.so的话,要这样写:

LOCAL_SHARED_LIBRARIES = libskia

在NDK使用的话,要这样写:

LOCAL_LDLIBS = -lskia

若想知道在这个NDK版本可以连接哪些暴露的系统库(exposed system libraries),

请参见docs/STABLE-APIS。

LOCAL_ALLOW_UNDEFINED_SYMBOLS

缺省值情况下,当尝试生成一个shared library遇到没有定义的引用时,会导致“undefined

symbol”error。这对在你的源代码里捕捉bugs有很大的帮助。

但是,因为一些原因你须要disable这个检查,将这个变量设置为'true’。注意,相应

的shared library可能在运行期装载失败。

LOCAL_ARM_MODE

缺省值情况下,ARM目标二进制将会以‘thumb’模式生成,这时每个指令都是16-bit宽的。

如果你想强迫组件的object文件以‘arm’(32位的指令)的模式生成,你可以将这个变量

定义为'arm'。即:

LOCAL_ARM_MODE := arm

注意,你也可以通过将‘.arm’后缀添加到源文件名字的后面指示生成系统将指定的

源文件以arm模式生成。例如:

LOCAL_SRC_FILES := foo.c bar.c.arm

告诉生成系统总是以arm模式编译‘bar.c’,但根据LOCAL_ARM_MODE的值生成foo.c

注意:在你的Application.mk里将APP_OPTIM设置为'debug',这也会强迫生成ARM二进制

代码。这是因为工具链的调度器有bugs,它对thumb码的处理不是很好。

SKILLS

//print string“here here!” on terminal while building

$(warning herehere!)

//print variantvalue of BOARD_GPS_LIBRARIES on terminal while building

$(warning$(BOARD_GPS_LIBRARIES))

make -j4

make 2>&1 | tee /mnt/hgfs/UNIX_HOME/makeOutput.txt

定义变量

VAL := true

ifeq ($(VAL),true)

endif

Debugging

Common

Install busybox

chmod 777busybox

"./busybox--install ."

adb shell as root:

432 service adbd /sbin/adbd

433 class core

434 socket adbd stream 660system system

435 disabled

436 seclabel u:r:adbd:s0

+ user root

+ group root

serial console as root:

421 service console /system/bin/sh

422 class core

423 console

424 disabled

425 user root

426 group root

MISCPOINTS

dd if=/dev/block/mmcblk0p19of=/data/hibet.img bs=1048576 count=30 skip=778

echo “startup” >/dev/block/mmcblk0p19

mount -o remount,rw -t ext4/dev/block/platform/msmxxx-sdhc/by-name/system

adb shell dumpsys display OR “adbshell dumpsys | grep -e display -e lcd -e window -e LCD” //check displayresolution

ADB

#Smartisan T1 adb/mtp usage on ubuntu14.04

Add udev's rule file as per the following lines, restart udev ( sudo /etc/init.d/udev restart ) or reboot

serker:~$ cat /etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb",ATTRS{idVendor}=="29a9",ATTRS{idProduct}=="701a",MODE="0666"

SUBSYSTEM=="usb_device",ATTRS{idVendor}=="29a9",ATTRS{idProduct}=="701a",MODE="0666"

Notice that, adb debugging and MTP is not complienced, so choose one of them at one time.

ADBreference: android sdk doc/DevGuide/Developing/Tools

adb全称AndroidDebug Bridge

adb是客户端-服务器程序,由三个组件构成:

客户端:运行在开发主机上

服务器:同样运行于开发主机上,负责客户端与adb守护进程通信

adb daemon:在emulator或者android设备上

通过adb shell命令来运行adb客户端,如果发现adb服务器没有运行就将adb服务器启动。

adb命令:

adb [-d|-e|-s <serialNumber>]<command>

refer to “Listingof adb Commands”

adb bugreport 提取很多系统信息和日志,对分析问题很有帮助

adb jdwp //print a list of availableJDWP processes on given device . Refer to DalvikVMDebugMonitor.html for morepresentation

adb ppp <tty> [parm]... //i donot learn more.

查看adb所有的命令:adbshell ls /system/bin 或者 adb –help

adb shell dumpsys //dump each service

adb shell dumpstate //very useful infuture

adb shell procrank

adb shell service list

adb shell input //input string...

adb shell getevent ...//automaticallytest

adb shell sendevent .... //automaticallytest

adb shell getprop //we could check MCCand MNC and so on.

adb shell setprop <> <> //usage: setprop <key> <value>

adb remount

adb kill $PID //if PID is system_service , android would bereboot

adb shell cat /proc/kmsg //check real-time trace kernel log

adb shell dmesg //check trace kernel log from buffer orrecoreded file

adb shell cat /proc/camera //checkcamera info

catsys/class/power_supply/battery/batt_vol //check battery vol (check charge)

adb shell cat/sys/class/power_supply/battery/capacity //display percent of battery left

操作举例:关闭飞行模式

飞行模式状态的存储位置:

/data/data/com.android.providers.settings/databases/settings.db

# sqlite3 settings.db

sqlite> .table

sqlite> select * from system;

sqlite> update system set value =0 where _id = 75;

NOTE: Another way to set airplane mode ON/OFF

#AIRPLANE MODE ON

settings put global airplane_mode_on 1

am broadcast -a android.intent.action.AIRPLANE_MODE --ezstate true

Enlarge log buffer size

About android logcat buffer size, check below snappist

#define LOG_BUFFER_SIZE in LogBuffer.cpp

in android/system/core/liblog/

log_fds[LOG_ID_SYSTEM] =log_open("/dev/"LOGGER_LOG_SYSTEM, O_WRONLY);

each log size is set in kernel/driver/staging/android/...."logger.c"

addr2line 命令的使用

实例调试分析:

I/DEBUG ( 3411): pid: 3436, tid: 3475 >>> system_server <<<

I/DEBUG ( 3411): signal 11 (SIGSEGV), fault addr 00000000

I/DEBUG ( 3411): #00 pc 00000000

I/DEBUG ( 3411): #01 pc 000527e8 /system/lib/libandroid_runtime.so

I/DEBUG ( 3411): #02 pc 0000f1f4 /system/lib/libdvm.so

I/DEBUG ( 3411):

I/DEBUG ( 3411): code around lr:

I/DEBUG ( 3411): ad3527d8 69e19806 694c9000 1c191c10 9b059a04

I/DEBUG ( 3411): ad3527e8 b00247a0 46c0bd10 00017868 00006728

I/DEBUG ( 3411): ad3527f8 4c0fb570 447c4d0f 6b2e1965 d1112e00

I/DEBUG ( 3411):

I/DEBUG ( 3411): stack:

I/DEBUG ( 3411): 490ecd28 00000013

I/DEBUG ( 3411): 490ecd2c ad05f661 /system/lib/libdvm.so

I/DEBUG ( 3411): 490ecd30 410c2aec /dalvik-LinearAlloc

。。。。。。。

src/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line -e out/target/product/i850/symbols /system/lib/libandroid_runtime.so 000527e8

输出:frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:397

Panic

example [ 79.612000] [<c4533ee0>](unwind_backtrace+0x0/0xfc) from [<c48cc7ec>] (panic+0x58/0xdc)

0x58 means offset, 0xdc means size



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: