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所在的路径。
 
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_CFLAGS:为C编译器传递额外的参数(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1
- LOCAL_PACKAGE_NAME:当前APK应用的名称。
- LOCAL_CERTIFICATE:签署当前应用的证书名称。
- LOCAL_MODULE_TAGS:当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是eng、user、debug、development、optional。其中,optional是默认标签。
- LOCAL_DEX_PREOPT:apk的odex优化开关,默认是false。
- LOCAL_FORCE_STATIC_EXECUTABLE:如果编译时候需要链接的动态库库存在静态库形式,那么在这个编译变量等于true的情况下,将会链接到对应的静态库而不是动态库。比如上面列出的libm,libz,libc,libcutils,libutils,liblog等动静态库都存在,那么在该变量被置true的时候,将会链接对应的静态库。当然对于本来就是静态库的libHWrecog.a来说,该变量值不会影响它是被静态链接的。所以可以想到这个参数的设置是和前面用gcc编译时候指定-static参数一样的效果, 推荐只是编译特殊ELF文件才用。

 

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 :=     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  目录 个人   组    其他