当前位置:首页 » 安卓系统 » makefileandroid

makefileandroid

发布时间: 2023-08-20 00:20:35

A. 请教linux makefile转换为android.mk的 步骤

项目中需要将linux的应用程序放在android下面编译
以前的编译用makefile,而android用android.mk
需要 linux makefile转换为android.mk ,
将生成 可执行文件、静态库、动态库 的规则对应到android.mk
还有对应makefile引入的文件顺序。

B. Android Studio手动配置Makefile、CMake

在Ubutu上编译出来的.so文件,怎么添加到Android项目中去使用呢?目前:可以通过
Makefile方式和CMake方式引入预编译静动态库(静态库.a 动态库.so)到项目中去使用。就目前而言CMake是Goole推荐使用方式,但是加入接手一个老的NDK项目是MakeFile方式,看不懂就GePi了,所以这里我们还是介绍一下MakeFile方式将静动态库加入到AS中,完成NDK项目的开发。废话不多说,直接撸步骤了:

1、在src/main目录下创建一个ndkBuild文件夹
2、在此文件中创建一个Android.mk文件

3、在此文件中创建一个test.c的源文件

4、将编译好的的.so库复制到src/main目录下
如图所示目录结构:

1、编辑Android.mk文件

2、编辑grade(app)文件

3、编辑test.c文件

4、使用编译好的.so库里面的函数

本结果运行在Android 5.1 系统上

再次运行在Android 8.0系统上

看以清楚知道,其实我们的APK包里面就没有libMainTest.so库,所以APP在8.0上会出现奔溃的现象。so...

1、在src/main目录下创建一个cmake文件夹
include:里面包含需要一些头文件
cmakeTest.c:需要编译的源文件
2、在app目录下创建一个文件:CmakeLists.txt

3、编辑grade(app)

4、编辑cmakeTest.c文件

4、引用编译好的libcmakeTest.so

Android 8.0.0系统:

Android 5.1.1系统:

C. android mk文件怎么打开

.mk后缀名文件类型:Makefile扩展名为.mk的文件是一个开发文件。Makefile规则如下所示目标:依赖文件列表命令列表1、目标通常是要产生的文件名称,目标可以是可执行文件或obj文件,也可是一个动作的名称.2、依赖文件是用来输入从而产生目标的文件

D. Android Makefile中是 如何识别 TARGET_PRODUCT 的

TARGET_PRODUCT 来决定编译定制proct.

首先, 编译Android 代码 通常情况下使用:

# make showcommands

这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk )

# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands

可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的

那如何编译特定产品的Android呢?

这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。

Android Makefile 的引用关系是这样的

Makefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/proct_config.mk

在build/core/proct_config.mk 中编译系统首先调用 build/core/proct.mk中定义的函数get-all-proct-makefiles ,来

遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProcts.mk, 不同子目录下的AndroidProcts.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/proct_config.mk 中的#$(mp-procts) 语句使控制台编译的时候输出所有proct 的信息) , 接着build/core/proct_config.mk 会调用resolve-short-proct-name 将TARGET_PRODUCT匹配的AndroidProcts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。

有了这个TARGET_DEVICE, 再回到 build/core/config.mk,

会include $(TARGET_DEVCIE)/BoardConfig.mk

board_config_mk := /
$(strip $(wildcard /
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
))

include $(board_config_mk)

而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等

另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk

TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))

TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/proct

PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)

再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来

#
# Typical build; include any Android.mk files we can find.
#

subdir_makefiles := /
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)

include $(subdir_makefiles)

我们再来看其中的

./build/target/board/Android.mk

,对了它引用了

include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由上面TARGET_DEVICE_DIR的定义,这下又进入了

vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Proct需要编译和安装app 和 script.

E. android makefile 将有空格的字符串赋给变量编译报错

想要了解一个系统,我常从makefile或是building system下手,以了解系统组成元素为何?目录结构为何?对于Android,我也不例外。透过了解building system,我们能知道如何新增、修改、删除程序,并保持其完整性,顺利编译出结果。
设置文件
Android building system 包括几种重要的设置文件,
·
Android.mk
·
AndroidProcts.mk
·
target_-.mk, host_-.mk and -.mk
o
BoardConfig.mk
o
buildspec.mk
Android.mk 是 mole 和 package 的设置文件,每个 mole/package 的目录下都会有一个 Android.mk。所谓的 mole 是指系统的 native code ,相对于用 Java 写成的 Android application 称为 package。
AndroidProcts.mk 则设定 proct 配置。 proct 即特定系统版本,透过编译不同 proct ,产生不同软件配置内容,安装不同的 application。 Proct 可视为特定项目,产生特定规格系统。
BoardConfig.mk 是为 proct 主板做设定,像是 driver 选择、设定。*-.mk 则是针对选择的操作系统和 CPU 架构,进行相关设定。
buildspec.mk 是位于 source 根目录下,为进行编译者所做之额外设定。例如,可在此选择要产生的 proct 、平台、额外的mole/package 等。
参数
build/envsetup.sh 实作一个 mm 指令,以编译单一 mole,不需编译整个 source tree。ONE_SHOT_MAKEFILE 这个 makefile 变量/参数就是用以实作这个功能。使用方法是在执行 make 时,将该变量指定为 mole 的 Android.mk。
o
make ONE_SHOT_MAKEFILE=
透过定义 CREATE_MODULE_INFO_FILE , building system 会将所有 mole 信息列在 $(PRODUCT_OUT)/mole-info.txt 档案里。
o
make CREATE_MODULE_INFO_FILE=true
设定 BUILD_TINY_ANDROID=true , building system 产生一个简单的 image ,以测试硬件的可用度。此功能用于移植的早期阶段,以快速 bring up 。
HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 产生 binary 的目的为 debug 或 release 。透过设定此二变量,能产生包含 debug information 的 binry 。
o
debug
o
release
这些参数,也可设于 buildspec.mk 里,以避免开发过程不断的重新指定。
Goals
一般编辑整个 Android 系统,就是使用 droid 这个 goal。 droid 会产生一个完整的系统,包括 bootloader、kernel、系统程序、模块和应用程序。
showcommands 和 droid 功能相同,但 droid 在编译过程不显示所使用的指令。透过 showcommands 这个 goal, building system显示过程中每一个步骤的详细指令。
Makefile 的流程
o
初始化相关变数
o
侦测编译环境和目标环境
o
决定目标 proct
o
读取 proct 的设定
o
读取 proct 所指定之目标平台架构设定
§
选择 toolchain
§
指定编译参数 (*-.mk)
o
清除输出目录
o
设定/检查版本编号
o
读取所有 BoardConfig.mk 档案
o
读取所有 mole 的设定
o
根据设定,产生必需的 rule
o
产生 image
以上的主要流程都是由 build/core/main.mk 所安排。
初始化和侦测
由 build/core/config.mk 所进行。 build/core/envsetup.mk 检查 developer 的设定 (buildspec.mk) ,并检查执行环境,以决定输出目录、项目。
build/core/config.mk 本身还依据参数,决定解译时的相关参数。像是 compiler 的路径、flags, lex 、yacc 的路径参数等。
关于 proct 的相关设定,则是由 build/core/proct_config.mk 所处理,使用 build/core/proct.mk 提供之 macro 加载。根据AndroidProct.mk 的内容, proct_config.mk 决定了
o
PRODUCT_TAGS
o
OTA_PUBLIC_KEYS
o
PRODUCT_POLICY
o
......
Proct 设定的读取
Android proct 的设定来自于 build/target/proct/AndroidProct.mk 和 vendor 子目录下的 AndroidProct.mk 。 building system透过 find 指令,找出所有可能的 AndroidProct.mk。 AndroidProct.mk 里定义 PRODUCT_MAKEFILES 变量,列举所有实际定义 proct 的 makefile。这些 makefile 各自定义独立的 proct 。proct 相关参数,存成 PRODUCTS. .形式的变数。并将makefile 路径存在 PRODUCTS 变量。因此,透过 PRODUCTS 能取得所有的 proct 路径/名称,并透过 PRODUCTS. .形式的变量取得内容。
Mole 设定的读取
Mole 是指 native code 的软件组件,而 Java application 则被称为 package。 build/core/definitions.mk 定义 mole/package 相关macro ,读取、检查 mole/package 定义档;分散 source tree 各处的 Android.mk 档案。 build/core/main.mk 使用 find 指令,在这些子目录下找出所有 Android.mk ,并将路径存在 subdir_makefiles 变量里。最后,include 这些档案。
这些 Android.mk 会 include 定义成变量 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等,和其目的相配的 makefile。这些makefile 会变 Android.mk 定义之内容,存成 ALL_MODULES. .mk>.形式。例如, Android.mk 定义了 LOCAL_MODULE_SUFFIX,变会存成 ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路径,当样会存于 ALL_MODULES 变量里

F. 如何使用自己的makefile编译android ndk项目

android ndk提供了一套自己的makefile管理方式,要将源码项目移植到android平台,需要按照android的makefile规则编写makefile,还要按android的规则部署源码目录,对一个有自己的makefile管理方法的大型项目来说,只是做一下makefile迁移工作就是一件很麻烦的事。
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本为例:
编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名称前缀 arm-eabi-
头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?
有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?
只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数
编译参数:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
链接参数:

-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:432
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:743
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:146
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:235
java驼峰 发布:2025-02-02 09:13:26 浏览:651
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:538
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726