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
- Android源码之路(三.配置Android.mk文件)
- jni使用基础(三)之Android.mk文件详解
- 配置Android.mk文件
- 浅析Android下的Android.mk文件(三)
- JPEG源码Android编译之Android.mk
- Android JNI学习笔记(三)-编译文件Android.mk、Application.mk 与camke
- android源码编译--mk文件详解
- Android JNI 学习之Android.mk文件
- AndroidNDK初步开发之如何调用jni生成.so文件、Android.mk配置及第三方so不被删除的方法(二)
- cocos2d-x 配置Android.mk文件
- cocos2d-x配置Android.mk遍历文件
- Android.mk文件配置多个LOCAL_SRC_FILES
- Android.mk介绍(三)
- Android.mk文件语法规范(Android.mk File)
- Android.mk文件语法规范(Android.mk File)
- Android.mk文件语法规范(Android.mk File)
- Android.mk文件语法规范(Android.mk File)
- Android.mk文件语法规范(Android.mk File)
- Spring boot简单常用的注解
- IOS逆向--使用IDA的Patch更改汇编或二进制码并写入项目和deb重新打包
- 五、Spring Cloud系列:Eureka服务端与客户端常用配置
- 计算机内存不足
- Week2 215. Kth Largest Element in an Array
- Android源码之路(三.配置Android.mk文件)
- 洛谷 P1865 A % B Problem
- 并发框架类及其功能(2)
- jssdk的图像接口
- Webpack配置方法
- 点灯游戏
- vim configure
- 优雅实现request请求IOC
- C++中的文件尾条件--EOF