Android mk 编译学习

发布时间 2023-12-04 11:47:42作者: papering

 

 

Android mk 编译学习

1.引言

在手机/Tv开发的公司,往往会涉及到源码编译.将项目放在系统源码中编译.而我们通常都是通过gradle编译,打包的.并不适用于系统开发的项目.这节就学习下,常用的android mk 命令. so/ jar文件的编译.

2.正题

  • LOCAL_PATH := $(call my-dir)

一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

  • include $(CLEAR_VARS)

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.

  • LOCAL_MODULE := WeChat

LOCAL_MODULE 变量存储您要构建的模块的名称。请在应用的每个模块中使用一次此变量

  • LOCAL_MODULE_CLASS :=LIB

如果没有指定LOCAL_MODULE_PATH,LOCAL_MODULE_CLASS 取值如下:
ETC:默认将module放置在/system/ect目录下面
EXECUTABLES:默认将module放置在/system/bin目录下面
JAVA_LIBRARIES:默认将module放置在/system/framework
LIB:默认将module放置在/system/lib目录
APPS:默认将module放置在/system/apps目录

  • LOCAL_MODULE_TAGS :=optional

1、user:只有在user版本时该模块才被编译进去;

2、eng:只有在eng版本时该模块才被编译进去;

3、test:只有在tests版本时该模块才被编译进去;

4、optional:在所有版本中都编译该模块进去。

  • LOCAL_BUILT_MODULE_STEM := package.apk

表示编译链接后的目标文件的文件名,带后缀,如果本地模块指定了LOCAL_MODULE_STEM的话,它的值就 是(LOCAL_MODULE_STEM).(LOCAL_MODULE_SUFFIX),如果没有指定了的话就是(LOCAL_MODULE).(LOCAL_MODULE_SUFFIX),这里没有指定,所以是LOCAL_MODULE.apk。

  • LOCAL_MODULE_SUFFIX
    目标文件的后缀,有.apk .so .jar 等等

/build/core/config.mk 中已经定义了如下的变量:

COMMON_PACKAGE_SUFFIX := .zip

COMMON_JAVA_PACKAGE_SUFFIX := .jar

COMMON_ANDROID_PACKAGE_SUFFIX := .apk

所以平时是这样引用的:LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

  • LOCAL_CERTIFICATE := platform

编译时签名文件的配置.

android的标准签名key有:

testkey

media

platform

shared

可以在源码的/build/target/product/security里面看到对应的密钥

  • LOCAL_SRC_FILES

指定编译的源文件可以是 C文件/ apk. 指定源文件的路径

  • **LOCAL_C_INCLUDES += $(LOCAL_PATH)/src **

指定c文件的头文件路径

  • include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。

它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY :编译为静态库。

BUILD_SHARED_LIBRARY :编译为动态库

BUILD_EXECUTABLE :编译为Native C可执行程序

BUILD_PREBUILT :该模块已经预先编译
NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。

  • LOCAL_PREBUILT_JNI_LIBS

这个属性只适用编译第三方app,而且app依赖了so库(这里的例子是在编译32位Android基础上列举的,64位待更新),按照目录结构放置so即可。

 
LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libBDRC4_V1_1.so  \
@lib/armeabi/libfileobserver_jni.so \
@lib/armeabi/libfreetype-jni.so  \
@lib/armeabi/libKSOStatEncryption.so \
@lib/armeabi/libkwopdf.so  \
@lib/armeabi/libOoxmlDecrypt.so \
@lib/armeabi/libweibosdkcore.so
  • LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES

这个属性只适用编译第三方app,而且 app 依赖了.外部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
    ```
    

### 2.常用的mk配置

#### 2.1编译第三方apk,不包含so

```JAVA

LOCAL_PATH := $(call my-dir)

##############################
include $(CLEAR_VARS)
LOCAL_MODULE := ModuleName
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional$
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := ModuleName.apk 
LOCAL_PREBUILT_JNI_LIBS := \
        @lib/armeabi-v7a/lib37CF018B.so
# LOCAL_MULTILIB :=32
include $(BUILD_PREBUILT)

2.2编译第三方apk,包含so

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ModuleName
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional$
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := ModuleName.apk
LOCAL_PREBUILT_JNI_LIBS := \
    @lib/armeabi-v7a/libTxCodec_neon.so \
    @lib/armeabi-v7a/libPlayerCore_neon.so \
    @lib/armeabi-v7a/libp2pproxy.so \
    @lib/armeabi-v7a/libRSSupport.so \
    @lib/armeabi-v7a/libmarsxlog.so \
    @lib/armeabi-v7a/libckeygenerator.so \
    @lib/armeabi-v7a/librsjni.so \
    @lib/armeabi-v7a/libtv-ticket-tool.so \
    @lib/armeabi-v7a/libhttpdns.so \
    @lib/armeabi-v7a/libQQMMANDKSignature.so \
    @lib/armeabi-v7a/libart.so \
    #@lib/armeabi-v7a/librsjni_androidx.so

LOCAL_MULTILIB :=32
include $(BUILD_PREBUILT)

注意:引入第三方apk.假如apk中存在so文件.假如在mk中不声明引入的so.则 在启动编译好的apk之后,会崩溃



https://www.jianshu.com/p/9ba78d6f8892