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

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.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请看:http://blog.csdn.net/github_38117599/article/details/7792692

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值