Android.mk 之 编译生成

如何使用Android.mk编译生成apk?

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
//all-subdir-java-files 把底层所有java文件取到
LOCAL_SRC_FILES := $(call all-subdir-java-files)
//使用这个做编译可以生成一个 LocalPackage.apk
LOCAL_PACKAGE_NAME := LocalPackage
//会在 build/core 下去找编译生成apk的脚本来对我们的源码进行编译
include $(BUILD_PACKAGE)

我们拿系统自带的计算器应用的Android.mk来看。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
//需要引入一个静态的jar包
LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava
//要调用当前目录下所有的java文件
LOCAL_SRC_FILES := $(call all-java-files-under,src)
//指定当前SDK的版本,如果我们指定了某一个版本,那么在某些中,我们就不能访问系统隐藏的某些接口
LOCAL_SDK_VERSION := current
//Android应用名
LOCAL_PACKAGE_NAME := Calculator
//编译生成apk
include $(BUILD_PACKAGE)

 

如何编译生成jar包?

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
//源码文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)
//编译生成的jar包的名字
LOCAL_MODULE := com.test.myjar

//编译生成一个静态jar包
include $(BUILD_STATIC_JAVA_LIBRARY)
//编译生成一个动态jar包
//include $(BUILD_JAVA_LIBRARY)

说到这里,那么,静态jar包和共享jar包有什么区别吗?

静态jar包 [ include $(BUILD_STATIC_JAVA_LIBRARY) ]:它是使用 .class 文件打包而成的JAR文件,这个JAR文件可以在任何java虚拟机运行,也就是说,我们不是Android的虚拟机,也可以在其他的虚拟机上运行。

动态jar包 [ include $(BUILD_JAVA_LIBRARY) ]:它是在静态JAR包的基础上,再使用.dex打包而生成的JAR文件,.dex 是Android系统使用的文件格式,也就是说,我们 .dex 所打成的动态JAR包只能在Android系统中使用。

 

如何在APK中引用JAR包?

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

//引入静态JAR包
LOCAL_STATIC_JAVA_LIBRARIES := static-library
//引入动态JAR包
LOCAL_JAVA_LIBRARIES := share-library

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
include $(BUILD_PACKAGE)

 

如何预编译JAR包?

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

//指定重新编译所生成文件的类型
//JAVA_LIBRARIES 就是生成共享的Java Library库
LOCAL_MODULE_CLASS := JAVA_LIBRARIES

//生成的名字叫做 “com.test.share”
LOCAL_MODULE := com.test.share

//源文件可以指定原来我们已经有的一个JAR包
LOCAL_SRC_FILES := com.test.static

//重新把static的JAR包,生成一个share的JAR包
include $(BUILD_PREBUILT)

那么,预编译生成文件可指定哪些类型呢(LOCAL_MODULE_CLASS)?

JAVA_LIBRARIES            dex归档文件

APPS                                APK文件

SHARED_LIBRARIES       动态库文件

EXECUTABLES                二进制文件

ETC                                   其他文件格式

 

还是看系统的计算器的mk源码:

include $(CLEAR_VARS)

//重新生成一个静态JAR包;
//这个静态JAR包的名字叫libarty;静态JAR包的源文件是arity-2.1.2.jar;
//当我们重新编译的时候就会把arity-2.1.2.jar重新生成libarty。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarty:arity-2.1.2.jar

include $(BUILD_MULTI_PREBUILT)

 

如何在Android.mk中添加判断语句?

//如果$(VALUE)等于x
ifeq ($(VALUE),x)
  do yes
else
  do no
end if

如果是不等于,则应用ifneq作为判断。

ifneq ($(VALUE),x)

下面就是根据USED_SHARE是否为true,如果为true,就走的动态库;也就说,使用这个ifeq/ifneq就可以控制我们的编译分支。

USED_SHARE := true

include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc/

ifeq ($(USED_SHARE),true)
LOCAL_LDFLAGS := -L./lib/ -ltest
else
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest1.a
end if

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值