Android product development
2016-01-20 11:14
393 查看
Building
Check Android Version
build/core/version_defaults.mk -> android version tagAddproject in lunch menu
"lunch XXXX" procedure is related with the followingcodesbuild/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) OverviewKernel 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.imgcd 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 Kitrefer 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.textsrc/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 busyboxchmod 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.04Add 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
相关文章推荐
- Android 命名规范 (提高代码可以读性)
- Android的过度绘制
- Android getWidth和getMeasuredWidth的理解
- Android接收Jpush添加标签和别名
- Android学习历程1
- android 调用系统相机
- Android MVP模式 简单易懂的介绍方式
- [Android]基于RxJava、RxAndroid的EventBus实现
- Android使用put上传图片和所有类型的文件
- Android 内存泄漏总结
- Android 首次创建数据库或者更新时,SQLiteOpenHelper的使用与解析
- AndroidStudio操作笔记--简单介绍1
- Android中View的事件分发机制
- Android 版本AGC调节
- android 自定义AlertDialog 与Activity相互传递数据
- android splash界面实现
- Android中如何获得控件的尺寸
- android Context 使用,防止内存泄漏
- android 把字符串内容保存到指定路径
- android 时间工具类