Android中各类.mk文件的编写

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := test

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

##################################################
 include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
     jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
     logging:lib/commons-logging.jar \
     jackson-core:lib/jackson-core-asl-1.6.2.jar \
     javatar:lib/javatar-2.5.jar \
     log4j:lib/log4j-1.2.15.jar

include $(BUILD_MULTI_PREBUILT)

# Use the folloing include to make our test apk.
 include $(call all-makefiles-under,$(LOCAL_PATH))

以上是我的一个项目中所需要的第三方jar包,主要参考了Android源码中的Calculator应用,该应用也引用了一个第三方的jar包arity-2.1.2.jar。

需要注意的是,当你要引用的jar包不止一个时,有两个关键的地方需要注意的。

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
     jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
     logging:lib/commons-logging.jar \
     jackson-core:lib/jackson-core-asl-1.6.2.jar \
     javatar:lib/javatar-2.5.jar \
     log4j:lib/log4j-1.2.15.jar

xsocket jackson-mapper logging jackson-core javatar log4j这几个只是名字,可以随便取。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES后面才是真正其作用的地方。如:

xsocket:lib/xSocket-2.8.14.jar 引用的是lib目录中的xSocket-2.8.14.jar。

还要注意的是 := 不要写成了+=了哦。

附:编写各种类型的Android.mk,出处我忘记了,是以前浏览是拷贝下来的。如果侵犯了作者的权益,烦请联系我hopetribe@gmail.com。我及时删除。

一、编译一个简单的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 # Tell it to build an APK
 include $(BUILD_PACKAGE)

二、编译一个依赖静态.jar文件的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # List of static libraries to include in the package
 LOCAL_STATIC_JAVA_LIBRARIES := static-library
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 # Tell it to build an APK
 include $(BUILD_PACKAGE)
 注:LOCAL_STATIC_JAVA_LIBRARIES 后面应是你的APK程序所需要的JAVA库的JAR文件名。

三、编译一个需要platform key签名的APK (系统限制的权限)

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 LOCAL_CERTIFICATE := platform
 # Tell it to build an APK
 include $(BUILD_PACKAGE)
 注:LOCAL_CERTIFICATE 后面应该是签名文件的文件名

四、编译一个需要特殊vendor key签名的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 LOCAL_CERTIFICATE := vendor/example/certs/app
 # Tell it to build an APK
 include $(BUILD_PACKAGE)

五、装载一个普通的第三方APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Module name should match apk name to be installed.
 LOCAL_MODULE := LocalModuleName
 LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
 LOCAL_MODULE_CLASS := APPS
 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
 LOCAL_CERTIFICATE := platform
 include $(BUILD_PREBUILT)

六、装载需要.so(动态库)的第三方apk

LOCAL_PATH := $(my-dir)
 include $(CLEAR_VARS)
 LOCAL_MODULE := baiduinput_android_v1.1_1000e
 LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
 LOCAL_MODULE_CLASS := APPS
 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
 LOCAL_CERTIFICATE := platform
 include $(BUILD_PREBUILT)

#################################################################
 ####### copy the library to /system/lib #########################
 #################################################################
 include $(CLEAR_VARS)
 LOCAL_MODULE := libinputcore.so
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
 LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)
 OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
 include $(BUILD_PREBUILT)

七、编译一个静态java库

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Any libraries that this library depends on
 LOCAL_JAVA_LIBRARIES := android.test.runner
 # The name of the jar file to create
 LOCAL_MODULE := sample
 # Build a static jar file.
 include $(BUILD_STATIC_JAVA_LIBRARY)
 注:LOCAL_JAVA_LIBRARIES表示生成的java库的jar文件名。

在Android源码开发过程中,需要整合进第三方APP到系统中,作为内置应用。如果是第三方APP是以APK形式整合进项目中,那么根据平台和公司的要求,只需修改编译脚本就可以实现整合,这里不再赘述;本文讲解拿到的第三方app是源码,需要自己写android.mk文件实现编译apk功能。
       现在Android app ide主要是两个工具eclipse和android studio。Eclipse已经从google的android开发者网站中移除了下载链接,现在主流的android app开发工具就是Android studio。
        android 源码中package/app目录下的应用大部分还是eclipse的代码结构,第三方app如果是eclipse编写的,那么去源码中package/app目录下找一个应用的android.mk 类比改一下就可以。这里主要讲一下android studio 项目的android.mk怎么写。
       android studio编写的app,app源码代码结构就跟eclipse不一样,实际上有用的app目录下的内容。我的android.mk就放在app/src/main目录下(一般android.mk都放在应用目录下,但实际上android源码在编译时会遍历package/app目录下的android.mk文件,不放心可以在项目应用根目录下写android.mk)
       首先查看app/src/main目录下的build.gradle文件,在这个文件中会写明在开发中引用了哪些包,如果不是android源码中带有的(如android-support-v4,android-support-v7-xxx等),那么要去android studio的安装目录下找到这些jar包,放到app/src/main/libs/目录下(没有就自己创建一个),因为android studio在使用时会自动下载需要的包到安装目录下,所以在拿到源码时实际上这些包是没有的,在本地用android studio导入项目,它会自动联网同步这些包。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)  (经典开头两句)
LOCAL_PACKAGE_NAME := xxx(apk的名字,如果这个值写的是Test,那么编译出来的就是Test.apk)
LOCAL_CERTIFICATE := platform (系统签名)

LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
src_dirs := java/
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
##声明使用的java文件和资源文件地址,如果使用到aidl,需要特别声明,常见写法如下
#LOCAL_SRC_FILES += \
# src/xx/xx/xx/aidl/XxxOne.aidl \
# src/xx/xx/xx//aidl/XxxTwo.aidl
LOCAL_MULTILIB := 32(添加这句是为了防止在编译后使用apk时,提示so是32位而不是64位导致应用fc)
LOCAL_PREBUILT_JNI_LIBS_x86 := jniLibs/x86/libxxx.so
LOCAL_PROGUARD_ENABLED := disabled (添加这句是为了防止在编译后使用apk时,提示找不到so库中对应的方法导致fc)
#如果使用了jni就要这么写

LOCAL_STATIC_JAVA_LIBRARIES +=  design \
                                android-support-v4 \
                                android-support-v7-appcompat \
                                android-support-v7-recyclerview \
                                recyclerview-v7 \
                                itextpdf(第三方包名)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \
            itextpdf:libs/itextpdf-5.5.9.jar
#第三方包需要通过LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES声明

LOCAL_PROGUARD_FLAG_FILES := proguard.flags 
##在编译时如果提示包中有warning时,需要按照要求在文件中写dontwarn,proguard.flags需要自行创建,android studio不会创建这个文件
下面是我写的android.mk,以供参考:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := 应用名

LOCAL_CERTIFICATE := platform

#如果使用的系统的包,需要引入他们使用的资源文件,否则会提示编译资源找不到的错误
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
LOCAL_RESOURCE_DIR += frameworks/support/design/res

LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res

src_dirs := java/

LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))

#LOCAL_SRC_FILES += \
# src/xx/xx/xx/XxxOne.aidl \
# src/xx/xx/xx/XxxTwo.aidl

LOCAL_STATIC_JAVA_LIBRARIES +=  design \
                                android-support-v4 \
                                itextpdf \
                                android-support-v7-appcompat \
                                android-support-v7-recyclerview \
                                recyclerview-v7

LOCAL_PREBUILT_JNI_LIBS := jniLibs/xx/libxxx.so

LOCAL_MULTILIB := 32

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout
LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages android.support.design

LOCAL_PROGUARD_ENABLED := disabled

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \
itextpdf:libs/itextpdf-5.5.9.jar

include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

特别补充:
1.第三方APP如果使用到了design-xx.jar包中的类,编译可以通过,但是在使用时APP会出现crash问题,log反应是design中类找不到。design是android提供的jar包,出现这个问题是,要去framework/support/design/目录下执行mm编译出design对应的jar包,再编译app,这时编译出的apk就没有找不到类的异常了

2.可以把android.mk放到应用的跟根目录下,这时候需要修改java文件,资源文件,包的引用目录地址

Android 系统(181 )----Android中各类.mk文件的编写相关推荐

  1. android系统源码中添加app源码(源码部署移植)

    涉及到系统定制,需要在系统中加入自己的apk工程,但是上网找了很多资料都是不够全面的,或者看了还是没搞懂,我自己也是一点点摸索过来的,花了不少的时间,也是踩了不少的坑,因此特开一文,帮助大家渡河. 申 ...

  2. 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)

    该原创文章首发于微信公众号:字节流动 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP) 配置编译环境(Initial AOSP build e ...

  3. 【android系统】android系统升级流程分析(一)---recovery模式中进行update包升级流程分析

    今天我们直接来看下android中具体的升级过程是如何的. 升级流程概述 升级的流程图: 升级流程分析 第一步:升级包获取 升级获取可以通过远程下载,也可直接拷贝到指定目录即可. 第二步:准备升级 然 ...

  4. 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.今天让我先来分析下升级包update.zip. 一 ...

  5. android log抓取方法,Android系统之Android抓取各种log的方法

    Android系统之Android抓取各种log的方法 2018年11月25日 | 萬仟网移动技术 | 我要评论 android之android抓取各种log的方法 1.logcat (四类log b ...

  6. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  7. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...

    Android系统构架 PAGE 1 目 录 TOC \o "1-3" \h \z \u 一.Android系统构架 1 二.Linux内核层 2 三.系统运行库层 3 (一)系统 ...

  8. 注册表中shell文件不见了_win7系统注册表中的shell文件不小心被删除的解决方法...

    我们在操作电脑的时候,win7系统注册表中的shell文件不小心被删除的问题对于我们来说其实是比较少见的,一般情况下的正常使用都不会遇到win7系统注册表中的shell文件不小心被删除的状况.但在wi ...

  9. Cacti 插件中setup.php 文件的编写

    Cacti 插件中setup.php 文件的编写 名词: 初始化函数   预定义函数  cacti 插件存放在 /plugins 目录,由setup.php与cacti 做关联调用; setup.ph ...

最新文章

  1. nmap 命令行执行错误_Unimap:一款基于Nmap实现的扫描速度提升工具
  2. 15. Python 函数
  3. 软件项目送上门来了,还要学会说不,接了项目拿了定金噩梦才刚刚开始
  4. [转]十五分钟介绍 Redis数据结构
  5. 周鸿祎在美参加的信息安全大会已有两人确诊新冠肺炎
  6. Python学习:day21正则表达式
  7. 百度地图LBS云存储自定义poi热点
  8. 使用Inno Setup 打包.NET程序,并自动安装.Net Framework
  9. echarts官网下载源码文件一直失败,在这里直接复制源码
  10. 2017年《What Hi-Fi?》杂志评选KEF成最大赢家
  11. 计算机组成原理试题无答案,计算机组成原理试题及答案
  12. Chrome 任务栏图标变白色 解决方法
  13. Metrics 入门教程
  14. Elasticsearch Field Options Norms
  15. 最新!!! iOS app添加微信授权登录——Qt for IOS
  16. Robocup3D第一次笔记
  17. APISpace 的 星座配对API
  18. 神经网络 深度神经网络,最新的深度神经网络
  19. 企业微信实现扫码登录
  20. 神经机器翻译的前世今生--转自散文网

热门文章

  1. 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
  2. react如何卸载组件_18道 React 面试必考题含解答面试高频
  3. mysql数据还原命令_mysql数据备份和还原命令:mysqldump
  4. 电脑鸿蒙操作系统,鸿蒙操作系统面世 华为称“把不可能变为可能”
  5. Mycat高级进阶---Mycat注解
  6. spring @value
  7. oracle 批量杀死 死锁进程
  8. P1396 营救(并查集+二分)
  9. Mysql -- 外键的变种 三种关系
  10. 在java中使用ffmpeg将amr格式的语音转为mp3格式