一、全部编译:
1、source build/envsetup.sh
初始化编译环境。
2、lunch sl8541e_1h10_oversea-user/userdebug
指定目标编译设备和编译类型,选择对应项目工程user是发布版本,userdebug是调试版本。
3、make -j12 2>&1 | tee build.log
-JX X表示数字,X表示可以使用CPU核数,build.log 查看编译信息。
cat /proc/cpuinfo | grep processor | wc -l 该linux命令可以查询服务器支持多少核。
该命令可以编译完整的android镜像文件包。
4、make -j12 otapackage 2>&1 | tee buildota.log
编译ota包
5、ota包制作命令:
./build/tools/releasetools/ota_from_target_files -i old.zip new.zip update.zip
二、模块编译:
1、apk模块编译
指令:mmm [module_path ] 解释: 编译指定路径下所有模块,但不包含依赖模块
列如:mmm packages/apps/Launcher3/ 编译Launcher3 模块
生成路径out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk
指令:mm 编译当前路径下所有模块,但不包含依赖模块
列如:cd packages/apps/Launcher3/ mm 在当前路径下编译模块
使用adb 工具可快速验证修改:
列如:
1、adb root 2、adb remount
3、adb push out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk system/priv-app/Launcher3/
4、adb shell stop 5、adb shell start
或者覆盖安装验证
adb install -r out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk
使用make snod 打包验证
由于launcher3 属于system镜像分区,我们可以使用make snod 进行重新打包烧录验证。
2、preloader编译
make -j24 pl 2>&1 | tee pl.log preloader
可实现更新logo bin文件的目的。
3、lk编译
make lk
4、kernel编译
make kernel
5、userdataimage编译
make userdataimage
6、vnod编译
make vnod
7、几个主要模块编译调试
三、其他指令
make clean 等同于rm -rf out/
make update-api 更新api文件
update-modem
代码搜索:
四、Android.mk
Android.mk是Android工程管理文件,类似于编译文件的说明书,用来向编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。Android.mk会被编译系统解析一次或多次,可以在每一个Android.mk文件中定义一个或多个模块,也可以多个模块使用同一个 .mk 文件
#定义当前模块的位置
LOCAL_PATH :=
(
c
a
l
l
m
y
−
d
i
r
)
L
O
C
A
L
P
A
T
H
是表示当前模块位置的变量,
m
y
−
d
i
r
是由系统提供的宏函数,返回当前文件所在的路径,
(call my-dir) LOCAL_PATH 是表示当前模块位置的变量,my-dir 是由系统提供的宏函数,返回当前文件所在的路径,
(callmy−dir)LOCALPATH是表示当前模块位置的变量,my−dir是由系统提供的宏函数,返回当前文件所在的路径,(call my-dir) 表示调用这个函数
#清除LOCAL_XXX变量
include $(CLEAR_VARS)
这句代码清除了 LOCAL_PATH 变量之外的 LOCAL_XXX 变量。所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的,在编译该模块之前可能编译过别的模块,产生了大量变量,会被系统误认为是属于该模块的,可能产生不可预知的错误。
#代表需要编译的文件
LOCAL_SRC_FILES :=$(call all-subdir-java-files)
all-subdir-java-files 函数返回LOCAL_PATH 子目录的所有java文件。
也可以直接写出需要编译的文件路径:
LOCAL_SRC_FILES :=com/android/launcher/Launcher.java
几个常用的获取源文件的方法:
$(call all-java-files-under, src) :获取指定目录下的所有 Java 文件。
$(call all-c-files-under, src) :获取指定目录下的所有 C 语言文件。
$(call all-Iaidl-files-under, src) :获取指定目录下的所有 AIDL 文件。
$(call all-makefiles-under, folder):获取指定目录下的所有 Make 文件。
#代表需要编译资源文件
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
#定义编译生成的模块名称
LOCAL_MODULE := Launcher3
Launcher3变量必须定义且唯一,作为模块的标识,编译系统会自动产生合适的前缀和后缀。
#签名属性
LOCAL_MODULE_TAGS := optional
常用的有:debug, eng, user,development 或者 optional(默认)。
#指定签名
LOCAL_CERTIFICATE := platform
platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试。
shared:该APK需要和 home/contacts 进程共享数据。
media:该APK是 media/download 系统中的一环。
#混淆代码
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
proguard.cfg:是一个混淆文件
disabled:是不混淆
#编译apk
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_LIBRARY) :编译成静态库
include $(BUILD_SHARED_LIBRARY) :编译成动态库
include $(BUILD_EXECUTABLE) :编译成可执行程序
include $(BUILD_STATIC_JAVA_LIBRARY) :编译成Java静态库
#代表APK生成的目录
LOCAL_MODULE_PATH:=$(TARGET_OUT)
通过 LOCAL_MODULE_PATH 变量,可以指定生成的 apk 目录
$(TARGET_OUT)代表 /system ,后续路径按需要补充完整
$(TARGET_OUT_DATA_APPS) 代表 data/app 目录
#表示APP生成在system/priv-app/目录下
LOCAL_PRIVILEGED_MODULE := true
#需要进行预编译的库
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar
include $(BUILD_MULTI_PREBUILT) 拷贝到本地编译
#引用静态jar库
LOCAL_STATIC_JAVA_LIBRARIES:= libarity
#这个表示获取当前目录以及子目录下的android.mk文件
include
(
c
a
l
l
a
l
l
−
m
a
k
e
f
i
l
e
s
−
u
n
d
e
r
,
(call all-makefiles-under,
(callall−makefiles−under,(LOCAL_PATH));
#代表不提取odex
LOCAL_DEX_PREOPT=false
#去掉某某APK
LOCAL_OVERRIDES_PACKAGES:= AlarmClock
#aapt 是Android Asset Packaging Tool的缩写,是编译和打包资源的工具。而aapt2是在aapt上做了优化。
LOCAL_USE_AAPT2 := true