一. 首先在android源代码目录下的build目录下,有个脚本文件envsetup.sh,执行这个脚本文件后,就可以获得一些有用的工具:
USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh
注意,这是一个source命令,执行之后,就会有一些额外的命令可以使用:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
这些命令的具体用法,可以在命令的后面加-help来查看,这里我们只关注mmm命令,也就是可以用它来编译指定目录的所有模块,通常这个目录只包含一个模块。
二. 使用mmm命令来编译指定的模块,例如Email应用程序:
USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/
编译完成之后,就可以在out/target/proct/generic/system/app目录下看到Email.apk文件了。Android系统自带的App都放在这具目录下。另外,Android系统的一些可执行文件,例如C编译的可执行文件,放在out/target/proct/generic/system/bin目录下,动态链接库文件放在out/target/proct/generic/system/lib目录下,out/target/proct/generic/system/lib/hw目录存放的是硬件抽象层(HAL)接口文件,后面的文章里面,我们会陆续提及到,敬请关注。
三. 编译好模块后,还要重新打包一下system.img文件,这样我们把system.img运行在模拟器上时,就可以看到我们的程序了。
USER-NAME@MACHINE-NAME:~/Android$ make snod
四. 参照Ubuntu上下载、编译和安装Android最新源代码一文介绍的方法运行模拟器:
USER-NAME@MACHINE-NAME:~/Android$ emulator
这样一切就搞定了。
B. 如何定制android源码的编译选项 amp;后期安装
文件build/core/version_defaults.mk用来检查一些跟版本相关的变量是否定义;如果未定义,则使用默认值。
这些变量包括
PLATFORM_VERSION # 如 2.2.5
PLATFORM_SDK_VERSION # 8, 对应2.2.5
PLATFORM_VERSION_CODENAME # REL,即发行版
DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME
BUILD_ID # 默认为UNKNOWN
BUILD_NUMBER # 默认eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。
version_defaults.mk首先包含进build_id.mk。用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。
---------------------------------------------------------------------------
关于调试功能(adb)的开启
编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。
其中也从以下文件中引入了一些编译设置:
device/${CHIPSET_VENDOR}/vendorsetup.sh
我们这里使用的CHIPSET_VENDOR为amlogic。
比如我们有文件device/amlogic/vendorsetup.sh,内容为"产品名-编译类型(flavor)"列表(称为combo),如下:
add_lunch_combo m1ref-eng
add_lunch_combo m1ref-user
add_lunch_combo m2ref-eng
add_lunch_combo m2ref-user
add_lunch_combo stvm3-eng
add_lunch_combo stvm3-user
其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。
除此前缀外可选的combo值有: eng, user, userdebug, tests。
(参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)
我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。
以下是各个编译类型的特点:
eng: 工程模式,用于平台级的调试,是默认的编译类型。
待安装的模块tag有: eng, debug, user, development.
安装不带tag的非APK模块;
所安装应用由产品定义文件给出;
默认属性: ro.secure=0, ro.deuggable=1, ro.kernel.android.checkjni=1
adbd默认开启,adb以root身份运行。
user: 即最终用户版;
待安装的应用tag有: user
安装不带tag的非APK模块;
所安装应用由产品定义文件给出;
默认属性有ro.secure=1, ro.debuggable=0;
默认关闭adbd服务(但可通过应用settings来打开,且adb以shell身份运行);
userdebug: 与user类似,除了:
支持有限的调试功能;
待安装的应用tag有:debug;
默认属性有ro.secure=1, ro.debuggable=1;
默认打开adbd服务,adb以shell身份运行;
例如,由文件build/core/main.mk可以看出,当使用含有userdebug的combo值时,此文件中的临时变量enable_target_debugging会保持为true,相应地,编译过程会执行:
ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 persist.service.adb.enable=1
这意味着目标系统中根目录下的文件/default.prop文件(对应变量 INSTALLED_DEFAULT_PROP_TARGET )会含有以下行(参考文件build/core/Makefile):
persist.service.adb.enable=1
由此,目标系统会默认开启adbd服务,你就可以通过其它PC来连接目标系统了。
所以,如要默认开启adbd服务,可在设备(如stvm3)定制文件device/amlogic/vendorsetup.sh中增加以下行:
add_lunch_combo stvm3-userdebug
这样在执行bash的lunch函数时,选择此combo就可以默认打开adbd服务(adb以shell身份运行)。
但是,即使adbd已经开启,你仍可能无法通过网络连接到Android进行调试,这涉及到Android的二个属性:
service.adb.tcp.port (优先级高)
persist.adb.tcp.port (优先级低)
注:可查看源码文件system/core/adb/adb.c。
默认地,这两个属性值是5555。有两种方法来设置此变量:
1)(永久性改变)在Android配置文件/init.rc或/init.$MANUFACTUROR.rc中添加一行:
setprop service.adb.tcp.port 5555
2)(临时性改变)在命令行上(你可能需要先通过串口开一个终端)执行如下命令:
setprop service.adb.tcp.port 5555
检查adbd是否支持通过网络链接Android:执行命令
netstat -l -n | grep ":5555"
如果有LISTEN状态的输出,则表示adbd支持网络模式 :) 。
C. 编译调试Android系统原生App - 以Settings为例
本文已过时,最新文章:向大家推荐《使用 AS 开发 System App》 https://xiaozhuanlan.com/system-app
Android原生系统带有许多原生的App,比如 浏览器、录音机、计算器、设置 等,有些时候,我们需要用到一些系统的功能,或者是对已有的功能做二次开发,比如我上学时给一个公司做过一个Launcher和Wizard,就需要用到系统设置中的某些功能,比如Wifi、声音、显示等功能,于是就需要从Settings源码中提取出需要的功能。
特别是公司自己定制Android系统,需要在上面做一些 系统级的App 的时候,原生App已有的功能就可以通过编译其源码的方式直接拿过来改改就能用,而且可用度很高。
这里有两种情况,分为 原生 的和 公司定制 的系统。无论是原生的还是定制的,类似于Settings这样需要使用到 系统级或隐藏API 的App,都需要系统签名文件和编译系统源码后得到相应的jar包才可以在IDE中编译,因为标准SDK根本没有那些API可供调用。
举个栗子:
需要额外的Jar就需要自己编译系统源码啦,这个是比较麻烦的,有兴趣可以试试自己编译定制自己的Android系统。
** 注意,既然是定制的,源码、jar、签名文件,还有系统都是一一对应的,你不能拿其他公司的系统签名来给你公司的系统app签名,这样无法运行的。 **
有了源码,下一步当然是要跑起来啦。
建议都使用Eclipse来编译,不要使用AS,因为AS编译大型的原生App能卡到你吐血,而且出错提示也不友好。但是用过AS的人都不想再碰Eclipse了有没有??别急,可以先用Eclipse编译过了,再贴到AS中,这样好很多,也很节省时间。
初始化:
放入源码:
修正res错误:
修正src错误:
使用到系统级API的,或者AndroidManifest.xml文件中声明了
那么没有系统签名,直接debug签名运行是不行的,需要向底层工程师要系统的签名文件,在源码目录
build\target\proct\security
下的 platform.pk8 和 platform.x509.pem ,如果你想看此次编译Settings是否已成功了,可以适当的在入口加一下Log,然后导出未签名的apk,使用系统签名进行签名后,放到 /system/app/ 下替换掉Settings.apk,然后重启系统,打开设置,看看Logcat是否输出里加入的Log。
在不知道系统签名可以转换成debug签名前,老实说我一直都是用Log的方式调试,太特么痛苦了。现在知道后整个人都懵逼了。
我们都希望可以像调试普通app那样调试系统app,以下是如何通过 openssl 将 platform.pk8 和 platform.x509.pem 转换成 debug.keystore 文件:
三个命令
此方法来自: http://curlog.com/2016/08/30/android-pk2debug-keystore/
Mac自带openssl,linux和Win需要安装。
然后就可以使用得到的debug签名配置到eclipse后愉快的调试啦,当然,得先把系统中已经存在的app先删除掉。然后重启系统,至于如何配置eclipse的debug签名,请Google。
使用过AS后,当然希望在AS中也可以调试系统App,抽空再写篇相关编译和调试的文章。如果这篇文章帮到你了,给个赞呗。
D. 如何单独编译安卓系统源码指定模块
Android源码目录下的build/envsetup.sh文件,描述编译的命令
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh 脚本设置环境
m:编译所有的模块
mm:编译当前目录下的模块,当前目录下要有Android.mk文件
mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
下面举个例子说明,假设我要编译android下的\hardware\libhardware_legacy\power模块,当前目录为源码根目录,方法如下:
1、. build/envsetup.sh
2、mmm hardware/libhardware_legacy/power/
编译完后 运行 make snod
会重新将你改过的模块打入到system.img中
E. Android源码编译
在编译喊猛源码之前需要做一悄闭些准备操作, 详细步骤如下:
1. 安装JDK, google官方要求编译2.3源码需要JDK1.6.
注意: ubuntu自带的源中速度比较慢, 有些软件找不到启渗裂, 所以需要修改为国内的源, 修改源步骤如下:
执行完上面几步, 数据源就更新完成了, 下面就开始安装编译依赖的软件, 同样, 在终端中以行为单位依次输入以下命令:
F. 如何编辑和调试android源码
在源码中,存在idegen模块,该模块专门用来为idea工具生成系统源码的project.
在开始编译该模块之前,首先确保你已经编译过Android源码了,如果没有,可以参考上篇文章进行编译.
和编译普通的模块一样,我们用mmm命令编译idegen.在开始编译之前,检查out/host/linux-x86/framework/目录下是否存在idegen.jar文件,存在则说明你已经编译过该模块,否者,则需要编译.执行如下命令即可:
soruce build/envsetup.sh
mmm development/tools/idegen/
sudo ./development/tools/idegen/idegen.sh123123
其中mmm development/tools/idegen/执行完成后会生成idegen.jar,而sodo ./development/tools/idegen/idegen.sh则会在源码目录下生成IEDA工程配置文件:android.ipr,android.iml及android.iws.
简单的说明一下这三个文件的作用:
android.ipr:通常是保存工程相关的设置,比如编译器配置,入口,相关的libraries等
android.iml:则是主要是描述了moles,比如moles的路径,依赖关系等.
android.iws:则主要是包含了一些个人工作区的设置.
G. 如何搭建android源码编译环境搭建
分为五个步骤来完成Android开发环境的搭建。
第一步:安装JDK。
要下载Oracle公司的JDK可以网络“JDK”进入Oracle公司的JDK下载页面,选择自己电脑系统的对应版本即可。
第二步:配置Windows上JDK的变量环境 。
JAVA_HOME
先设置这个系统变量名称,变量值为JDK在电脑上的安装路径:C:Program FilesJavajdk1.8.0_20。创建好后则可以利用%JAVA_HOME%作为JDK安装目录的统一引用路径。
Path
PATH属性已存在,可直接编辑,在原来变量后追加:;%JAVA_HOME%in;%JAVA_HOME%jrein 。
CLASSPATH
设置系统变量名为:CLASSPATH 变量值为:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar 。
注意变量值字符串前面有一个"."表示当前目录,设置CLASSPATH的目的,在于告诉Java执行环境,在哪些目录下可以找到所要执行的Java程序所需要的类或者包。
第三步: 下载安装Eclipse(已上传附件,电脑打开可下载)。
Eclipse为Java应用程序及Android开发的IDE(集成开发环境)。Eclipse不需要安装,下载后把解压包解压后,剪切eclipse文件夹到你想安装的地方,打开时设置工作目录即可。
第四步:下载安装Android SDK 。
配置了JDK变量环境,安装好了Eclipse,这个时候如果只是开发普通的JAVA应用程序,那么Java的开发环境已经准备好了。要通过Eclipse来开发Android应用程序,那么需要下载Android SDK(Software Development Kit)和在Eclipse安装ADT插件,这个插件能让Eclipse和Android SDK关联起来。
第五步:为Eclipse安装ADT插件。
前面已经配置好了java的开发环境,安装了开发Android的IDE,下载安装了Android SDK,但是Eclipse还没有和Android SDK进行关联,也就是它们现在是互相独立的,就好比枪和子弹分开了。为了使得Android应用的创建,运行和调试更加方便快捷,Android的开发团队专门针对Eclipse IDE定制了一个插件:Android Development Tools(ADT)。
H. android 编译服务器大概需要什么配置 5
工欲善其事,必先利其器”,要想提高团队整体的开发效率,尽可能的提前完成开发任务,必须要配备一套配置给力的开发设备。源码编译服务器硬件配置的高低,直接影响着系统固件升级和ROM版本发布的速度和效率。
由于目前Google发布的最新版本的Android系统源码体积越来越大,因此,越是定制高版本的系统,对编译服务器的硬件配置要求就越高,这里根据调研,给出目前Android
6.0及以下版本源码定制开发的基本配置,供大家参考。
首先进行一波企业级android源码编译服务器的推荐,这类推荐网上绝无仅有,这还是我进行了很久的调研,询问很多朋友【其中包括不乏6年以上系统开发的大牛,也有之前公司的主管等】,也查了很多资料才挑选出来,提出需求后让上级审批,目前上一级已经认可比审批,等待领导签字。给力。
详细
I. 如何定制android源码的编译选项
现仅就工作遇到的问题做个总结。所用硬件平台为amlogic stvm3。---------------------------------------------------------------------------关于版本号:文件build/core/version_defaults.mk用来检查一些跟版本相关的变量是否定义;如果未定义,则使用默认值。这些变量包括 PLATFORM_VERSION # 如 2.2.5 PLATFORM_SDK_VERSION # 8, 对应2.2.5 PLATFORM_VERSION_CODENAME # REL,即发行版 DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME BUILD_ID # 默认为UNKNOWN BUILD_NUMBER # 默认eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。 version_defaults.mk首先包含进build_id.mk。用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。---------------------------------------------------------------------------关于调试功能(adb)的开启编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。其中也从以下文件中引入了一些编译设置: device/${CHIPSET_VENDOR}/vendorsetup.sh我们这里使用的CHIPSET_VENDOR为amlogic。比如我们有文件device/amlogic/vendorsetup.sh,内容为"产品名-编译类型(flavor)"列表(称为combo),如下: add_lunch_combo m1ref-eng add_lunch_combo m1ref-user add_lunch_combo m2ref-eng add_lunch_combo m2ref-user add_lunch_combo stvm3-eng add_lunch_combo stvm3-user其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。除此前缀外可选的combo值有: eng, user, userdebug, tests。(参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。以下是各个编译类型的特点: eng: 工程模式,用于平台级的调试,是默认的编译类型。
J. 如何制作Android源码编译脚本
编译生成的 boot.img, system.img, userdata.img 用fastboot 就可以直接刷到机器去啊!由于android源码里不包含手机的驱动,所以编译前需要将驱动先提出来以备后用!