Android product development

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.
- mm:      Builds all of the modules in thecurrent directory.
- mmm:     Builds all of the modules in thesupplied directories.

(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 ."

 

Can not find devices by using adb devices

try add USB vendor ID into ~/.android/adb_usb.ini

try 51-android.rules

 

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值