1.前言:虽然Android.mk文件也只是偶然用到,但是前一段时间用到时花了不少的时间去弄,所以有空就整理一下。另外,这是在android6.0系统做的测试,一些例子也是依据源码的例子来的。
(1)整编过得android6.0源码教程:
2.先配置一个最简单的mk,编译生成一个目标文件
(1)在framework/下创建mytest文件夹,在里面创建Android.mk和main.c
//1.创建mytest文件夹
mkdir framework/mytest
//2.编写Android.mk
gedit Android.mk
//Android.mk文件的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= test
LOCAL_SRC_FILES := main.c
include $(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:= libtest
LOCAL_SRC_FILES := main.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)/out
include $(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:= libtest1
LOCAL_SRC_FILES := test1.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)/out
include $(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:= test
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_LDFLAGS := -L./../mytest1/out/ -ltest1
LOCAL_SRC_FILES := main.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)/out
include $(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:= test
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/head2 \
frameworks/mytest/head1
LOCAL_LDFLAGS := -L./../mytest1/out/ -ltest1
LOCAL_SRC_FILES := main.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)/out
include $(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 := Test
include $(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 := Test
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
10.后语
(1)使用vm 安装的ubuntu16.04请看:
(2)Android源码之路(二.环境配置与整编):