android 中的make命令

本文介绍了在Android21文件夹中使用Makefile进行不同编译任务的方法,包括生成Settings APK、构建系统映像system.img、全量编译及SDK构建等步骤,并提供了具体的命令和注意事项。
如果android的source在android21文件夹(即Makefile文件的目录)下,先执行cd android21,
然后可以执行下面的命令;

1、make Settings
生成Settings.apk的文件

2、 make snod
等同于make droid
该命令生成一个新的系统映像system.img,速度比make快很多,但不稳定(有的时候不好用)
将这个系统映像拷贝至sdk下
cp out/target/product/generic/system.img \
out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/lib/images/
删除程序遗留的数据:
out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/emulator -wipe-data

3、make
映像编译成功后会在目录 ~/android/src/out/target/product/generic 下产生一些image文件
ramdisk.img system.img userdata.img
4、make sdk
注意:如果需要build SDK,需要安装sun-java5-jdk, 而不是sun-java6-jdk

sdk编译成功后会在~/android/src /out/host/linux-x86/sdk/ 生成sdk的文件目录和压缩包:

android-sdk_eng.justin_linux-x86

android-sdk_eng.justin_linux-x86.zip

并在~/android/src /out/target/product/generic(generic是默认的产品名)下打包所有的映像文件:

generic-img-eng.justin.zip
android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文 件。在 main.mk 文件中又会包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。 这些 Make 文件间的包含关系是相当复杂的,图 3 描述了这种关系,该图中黄色标记的文件(且除了 $开头的文件) 都位于 build/core/ 目录下。 Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件 等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指 的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块 的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 中定义了许多的常量, 这其中的每个常量描述了一种类型模块的编译方式,这些常量有: BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_
<think>嗯,用户询问如何使用Android make命令编译apk。我需要从提供的参考文献中提取相关信息,同时结合Android编译系统的实际知识来回答。 用户引用了四篇资料:[^1]讨论了Android.mk和Android.bp编译apk、jar、so的方法;[^2]是关于android源码编译apk的,包含Android.mk文件的示例;[^3]涉及反编译apk;[^4]展示了apk编译过程的部分命令行。 用户的核心需求是了解make命令编译apk的具体步骤。根据[^1]和[^2],编译apk的关键是编写正确的Android.mk文件并执行make命令。需要强调几个要点:环境初始化(source build/envsetup.sh),选择目标设备(lunch),模块编译(make module_name)。模块名称可以通过mm命令make全名指定。 在回答中,应该结构化地列出步骤:先说明准备工作(环境变量配置),再讲解Android.mk编写要点(参考[^2]的LOCAL_PATH等变量),最后说明编译命令(参考[^1]的make framework-minus-apex等示例)。需要提醒用户注意路径问题和编译类型(eng/userdebug)。 用户可能是Android系统开发者或ROM定制者,对源码编译有基础认知但需要具体指导。可以推测ta可能遇到的问题是不知道如何正确配置mk文件,或是找不到模块编译命令。因此在相关问题中可以延伸编译优化(如减少编译时间)、多模块编译等实用场景。 需要验证回答的可靠性:检查提供的make命令是否与最新AOSP兼容(mm命令仍有效),确认Android.mk基础语法未过时(虽然Google推荐bp,但mk仍广泛支持)。同时补充实用技巧,比如如何查找模块名(使用mmp快捷命令)——这是参考文献未提及但实际很有用的知识。 </think>以下是使用 Android `make` 命令编译 APK 的详细步骤和关键要点,基于 AOSP (Android Open Source Project) 源码环境: --- ### **步骤 1:初始化编译环境** 在 AOSP 源码根目录执行: ```bash source build/envsetup.sh # 加载环境变量和实用函数 lunch <target> # 选择目标设备,如 `aosp_arm64-eng` ``` - `<target>` 示例: `aosp_arm-eng` (32位模拟器) | `aosp_arm64-userdebug` (64位真机调试版) *执行 `lunch` 后按提示选择目标 [^1][^2]。* --- ### **步骤 2:编写编译配置文件** 在 APK 项目目录(如 `packages/apps/MyApp/`)创建 **`Android.mk`** ️ ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PACKAGE_NAME := MyApp # APK 名称 LOCAL_SRC_FILES := $(call all-java-files-under, src) # 指定源码目录 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res # 资源目录 LOCAL_CERTIFICATE := platform # 使用系统签名(系统级 APK 需此配置) LOCAL_PRIVILEGED_MODULE := true # 安装到 /system/priv-app(可选) include $(BUILD_PACKAGE) # 声明编译 APK ``` *关键配置说明:* - `LOCAL_CERTIFICATE`: - `platform`:系统签名(需系统权限时使用) - `PRESIGNED`:使用预签名 APK(如预编译的第三方 APK)[^2] - 若需依赖库,添加: ```makefile LOCAL_STATIC_JAVA_LIBRARIES := lib1 lib2 # 静态库 LOCAL_JAVA_LIBRARIES := android.test.runner # 动态库[^1] ``` --- ### **步骤 3:执行编译命令** #### 方式一:编译单个模块(推荐) ```bash mmm packages/apps/MyApp/ # 仅编译指定目录下的模块 ``` - 编译输出路径:`out/target/product/<device>/system/app/MyApp/MyApp.apk` #### 方式二:全量编译(耗时较长) ```bash make MyApp # 根据 LOCAL_PACKAGE_NAME 编译 ``` > ⚠️ **注意**:若出现 `MyApp nothing to do` 错误,检查: > 1. `Android.mk` 是否在正确路径 > 2. 模块名是否通过 `lunch` 正确注册 [^1][^2] --- ### **步骤 4:推送 APK 到设备** ```bash adb root && adb remount # 获取 root 并挂载系统分区可写 adb push out/.../MyApp.apk /system/app/MyApp/ # 推送 APK adb reboot # 重启生效 ``` --- ### **常见问题解决** 1. **依赖缺失错误**: 在 `Android.mk` 中添加: ```makefile LOCAL_STATIC_JAVA_LIBRARIES := androidx.appcompat_appcompat ``` 2. **资源编译失败**: 检查 `LOCAL_RESOURCE_DIR` 路径是否正确,或执行: ```bash make clean-MyApp && mmm packages/apps/MyApp/ ``` 3. **签名冲突**: 系统 APK 必须使用 `LOCAL_CERTIFICATE := platform` [^1][^2]。 --- ### **编译流程示意图** ```mermaid graph LR A[source build/envsetup.sh] --> B[lunch 选择目标] B --> C[编写 Android.mk] C --> D[mmm 或 make 编译] D --> E[生成 APK] E --> F[adb 推送并重启] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值