Android.mk
生成可执行文件:
- APK程序:一般的Android程序,编译打包生成apk文件。
- JAVA库:java类库,编译打包生成jar包文件。
- CC++应用程序:可执行的C/C++应用程序。
- CC++静态库:编译生产C/C++静态库,并打包成.a文件。
- CC++共享库:编译生成共享库,并打包成.so文件,有且只有共享库才能被安装/复制到APK包中。
LOCAL_PATH := $(call my-dir) //定义当前模块的相对路径
include $(CLEAR_VARS) //清除当前的环境变量
LOCAL_MODULE := test //编译生成的目标名
LOCAL_SRC_FILES := test.c //编译该模块需要的源文件
LOCAL_MODULE_PATH += $(LOCAL_PATH) //生成文件的位置
include $(BUILD_EXECUTABLE) //编译生成的文件格式
其中“my-dir”是由编译系统提供的宏函数,用于返回当前Android.mk所在的路径。
![](/qrcode.jpg)
Android可执行文件一般存放在data/local //最好最简单的地方
1.编译应用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
生成文件夹路径sdm660\out\target\product\sdm660_64\system\bin
BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。补充说明:include $(BUILD_PACKAGE)
则是编译出一个apk,include $(BUILD_STATIC_JAVA_LIBRARY)
则是编译出jar包
(菜鸟级别解释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。
- LOCAL_PATH:这个变量用于给出当前文件的路径,必须在Android.mk的开头定义,可以这样使用LOCAL_PATH := $(call my-dir),这样这个变量不会被$(CLEAR_VARS)清除,因为每个Android.mk只需要定义一次(即使一个文件中定义了多个模块的情况下)。
- LOCAL_SRC_FILES:当前模块包含的所有源代码文件。
- LOCAL_MODULE:当前模块的名称,这个名称应当是唯一的,并且不能包含空格。模块间的依赖关系就是通过这个名称来引用的。
- LOCAL_MODULE_CLASS:标识所编译模块最后放置的位置。ETC表示放置在/system/etc.目录下,APPS表示放置在/system/app目录下,SHARED_LIBRARIES表示放置在/system/lib目录下。如果具体指定,则编译的模块不会放到编译系统中,最后会在out对应product的obj目录下的对应目录中。
- LOCAL_SRC_FILES:这是要编译的源代码文件列表。只要列出要传递给编译器的文件即可,编译系统会自动计算依赖关系。源代码文件路径都是相相对于LOCAL_PATH的,因此可以使用相对路径进行描述。
- LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库,也叫Java动态库。例如framework.jar包。
- LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库,在Android里,导入的jar包和引用的第三方工程都属于Java静态库。
- LOCAL_STATIC_LIBRARIES:当前模块在运行时依赖的静态库的名称。
- LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库的名称。
- LOCAL_C_INCLUDES:c或c++语言需要的头文件的路径。
- LOCAL_CFLAGS:提供给C/C++编译器的额外编译参数。
- LOCAL_PACKAGE_NAME:当前APK应用的名称。
- LOCAL_CERTIFICATE:签署当前应用的证书名称。
- LOCAL_MODULE_TAGS:当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是eng、user、debug、development、optional。其中,optional是默认标签。
- LOCAL_DEX_PREOPT:apk的odex优化开关,默认是false。
2.编译静态库的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
生成文件夹路径为out/target/product/sdm660_64/obj/STATIC_LIBRARIES/helloworld_intermediates/
一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库.
3.编译动态库的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
生成文件夹的路径out/target/product/sdm660_64/obj/SHARED_LIBRARIES/helloworld_intermediates/helloworld.so.toc
一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个动态库。
另外,在Android.mk文件中,还可以指定最后的目标安装路径,
用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示system文件系统。
TARGET_OUT_DATA:表示data文件系统。
用法如:
CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
- TARGET_ROOT_OUT:表示根文件系统out/target/product/xxxxx/root。
- TARGET_OUT:表示system文件系统out/target/product/xxxx/system。
- TARGET_OUT_DATA:表示data文件系统out/target/product/xxxx/data。
- TARGET_OUT_SHARED_LIBRARIES:表示out/target/product/xxxx/system/lib
- TARGET_OUT_APPS:表示out/target/product/xxxx/system/app
- ANDROID_PRODUCT_OUT:out/target/product/xxxx/
- TARGET_OUT_JAVA_LIBRARIES:out/target/product/xxxx/system/framework
在编译核心时,常常要反复输入一长串命令,如
- make mrproper
- make menuconfig
- make dep
- make clean
- make bzImage
- .......
这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用户来说,会很方便。
用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。
先在/usr/src/linux-2.4.20目录下建立一个文件,取名为make_command,在其中输入如下内容:
- make mrproper &&
- make menuconfig &&
- make dep &&
- make clean &&
- make bzImage &&
- make modules &&
- make modules_install &&
- cp arch/i386/boot/bzImge /boot/vmlinuz_new &&
- cp System.map /boot &&
- vi /etc/lilo.conf &&
- lilo -v
文件建立好之后,以后每次编译核心,只需要在/usr/src/linux-2.4.20下输入source make_command
就行了。这个文件也完全可以做成脚本,只需稍加改动即可。如果你用的不是lilo来引导系统,可以把最后两行去掉,配置自己的引导程序来引导内核。
shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如 make mrproper && make menuconfig
,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。
1、source build/envsetup.sh
2、lunch,选择45. sdm660_64-userdebug
3、make –j32 选择make 的进程32代表32个进程一起执行
文件权限修改
chmod 777 文件名
R W X
4 2 2
-RWX RWX RWX 文件 个人 组 其他
dRWX RWX RWX 目录 个人 组 其他