Android源码之路(三.配置Android.mk文件)

来源:互联网 发布:湖南软件测试 编辑:程序博客网 时间:2024/06/06 13:43

1.前言:虽然Android.mk文件也只是偶然用到,但是前一段时间用到时花了不少的时间去弄,所以有空就整理一下。另外,这是在android6.0系统做的测试,一些例子也是依据源码的例子来的。

(1)整编过得android6.0源码教程:http://blog.csdn.net/github_38117599/article/details/77938339

2.先配置一个最简单的mk,编译生成一个目标文件

(1)在framework/下创建mytest文件夹,在里面创建Android.mk和main.c

//1.创建mytest文件夹mkdir framework/mytest//2.编写Android.mkgedit Android.mk//Android.mk文件的内容LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= testLOCAL_SRC_FILES := main.cinclude $(BUILD_EXECUTABLE)//3.创建main.c,编写最简单的c文件gedit main.c//main.c的内容#include<stdio.h>int mian(){    return 0;}

(2)使用mmm编译生成可执行文件

//1.在mydroid目录下执行:. build/envsetup.sh//2.继续执行lunch:lunch//3.选择1//4.使用mmm单独编译:mmm framework/mytest/

(3)mk文件每条语句对应的意义

LOCAL_PATH := $(call my-dir):  ——定义了当前模块的相对路径include $(CLEAR_VARS)           ——清空当前环境变量LOCAL_MODULE:= test             ——编译生成的目标名称LOCAL_SRC_FILES := main.c       ——编译该模块需要的源文件include $(BUILD_EXECUTABLE)     ——编译所生成的目标文件格式

3.生成动态so库,并指定输出路径

//生成动态so库:跟上面的操作一样,只需要把mk文件最后一行改成include $(BUILD_SHARED_LIBRARY)//指定输出的目录,目录会临时被创建:LOCAL_MODULE_PATH := $(LOCAL_PATH)/out//整个如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= libtestLOCAL_SRC_FILES := main.cLOCAL_MODULE_PATH := $(LOCAL_PATH)/outinclude $(BUILD_SHARED_LIBRARY)

4.生成静态库

//跟上面的操作一样,只需要把mk文件最后一行改成include $(BUILD_STATIC_LIBRARY)

5.引用系统的库

(1)首先在main.c中使用系统库

#include<stdio.h>#include<utils/Log.h>int main(){  ALOGI("main_");  return 0;}

(2)在mk文件添加

LOCAL_SHARED_LIBRARIES += liblog

(3)直接使用mmm进行单编译

//可以在mydroid下执行:      mmm framework/mytest///也可以这样执行cd framework/mytest/mmm .

(4)使用引用的系统库路径为

out/target/product/generic/obj/lib/liblog.so

6.引用第三方的库

(1)在framework下新建mytest1文件夹

(2)在mytest1下添加新的test1.c文件

void call_1(void){}

(3)编写mk文件,生成指定目录的动态库

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= libtest1LOCAL_SRC_FILES := test1.cLOCAL_MODULE_PATH := $(LOCAL_PATH)/outinclude $(BUILD_SHARED_LIBRARY)

(4)在mytest1目录下执行mmm .单编译生成动态库so,生成路径为:

frameworks/mytest1/out/libtest1.so

(5)回到mytest下改动main.c文件,调用call_1方法

#include<stdio.h>#include<utils/Log.h>int main(){  ALOGI("main_");  call_1();  return 0;}

(6)编写mytest的mk文件,引用第三方库

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= testLOCAL_SHARED_LIBRARIES += liblogLOCAL_LDFLAGS := -L./../mytest1/out/ -ltest1LOCAL_SRC_FILES := main.cLOCAL_MODULE_PATH := $(LOCAL_PATH)/outinclude $(BUILD_EXECUTABLE)

(7)在mytest进行单编

mmm .

7.引入第三方头文件

(1)在mytest目录下新建文件夹head1,添加head1.h头文件

#ifndef _HEAD1_#define _HEAD1_typedef void    head1_void;#endif //_HEAD1_

(2)在mytest目录下新建文件夹head2,添加head2.h头文件

#ifndef _HEAD2_#define _HEAD2_typedef void    head2_void;#endif //_HEAD2_

(3)在main.c

#include<stdio.h>#include"head1.h"#include"head2.h"#include<utils/Log.h>int main(){  ALOGI("main_");  call_1();  return 0;}

(4)在mytest的mk文件中加入导入头文件路径LOCAL_C_INCLUDES:(两种引入的方式)

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= testLOCAL_SHARED_LIBRARIES += liblogLOCAL_C_INCLUDES := \        $(LOCAL_PATH)/head2 \        frameworks/mytest/head1LOCAL_LDFLAGS := -L./../mytest1/out/ -ltest1LOCAL_SRC_FILES := main.cLOCAL_MODULE_PATH := $(LOCAL_PATH)/outinclude $(BUILD_EXECUTABLE)

8.生成apk

(1)参考packages/apps/Calculator的目录结构,packages/apps下放置一个自己的应用:

xhunmon@xhunmon:~/Desktop/mydroid/packages/apps/Test$ tree.├── AndroidManifest.xml├── Android.mk├── res│   ├── drawable│   ├── layout│   │   └── activity_main.xml│   ├── mipmap-hdpi│   │   ├── ic_launcher.png│   │   └── ic_launcher_round.png│   ├── mipmap-mdpi│   │   ├── ic_launcher.png│   │   └── ic_launcher_round.png│   ├── mipmap-xhdpi│   │   ├── ic_launcher.png│   │   └── ic_launcher_round.png│   ├── mipmap-xxhdpi│   │   ├── ic_launcher.png│   │   └── ic_launcher_round.png│   ├── mipmap-xxxhdpi│   │   ├── ic_launcher.png│   │   └── ic_launcher_round.png│   └── values│       ├── colors.xml│       ├── strings.xml│       └── styles.xml└── src    └── com        └── xhunmon            └── test                └── MainActivity.java

(2)其中最简单生成apk的mk文件

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := Testinclude $(BUILD_PACKAGE)#解析#LOCAL_PACKAGE_NAME := Calculator:生成apk名字#include $(BUILD_PACKAGE):编译生成apk

(3)根据输出的信息可以找到生成apk的路径

out/target/product/generic/system/app/Test/Test.apk

测试文件下载:https://gitee.com/xhunmon/Android.mkWenJianShengChengappXiangMutest

9.apk中到导入jar包

(1)首先要明确两个概念:

  • 静态jar包:include $(BUILD_STATIC_JAVA_LIBRARY)
    使用.class文件打包而成的JAR文件,可以在任何java虚拟机运行

  • 动态jar包:include $(BUILD_JAVA_LIBRARY)
    在静态jar包基础之上使用.dex打包而成的jar文件,.dex是android系统使用的文件格式。

(2)先有一个jar包,把packages/apps/Calculator下的arity-2.1.2.jar拷贝到packages/apps/Test目录下

(3)载MainActivity.java中引用一下jar里面的类

package com.xhunmon.test;import android.app.Activity;import android.os.Bundle;import android.util.Log;import org.javia.arity.Util;public class MainActivity extends Activity {    private final static String TAG = "MainActivity Test";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String s = Util.doubleToString(2.11, 5);//此处引用        Log.i(TAG,"s: "+s);    }}

(3)参考packages/apps/Calculator下的mk文件来修改自己的mk文件,对比7中的mk文件就知道引入的差别所在了

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_STATIC_JAVA_LIBRARIES := libarity LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := Testinclude $(BUILD_PACKAGE)##################################################include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jarinclude $(BUILD_MULTI_PREBUILT)# Use the following include to make our test apk.include $(call all-makefiles-under,$(LOCAL_PATH))

10.后语

(1)使用vm 安装的ubuntu16.04请看:http://blog.csdn.net/github_38117599/article/details/7792692

(2)Android源码之路(二.环境配置与整编):http://blog.csdn.net/github_38117599/article/details/77938339