zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android.mk的一些FAQ

AndroidFAQ 一些 mk
2023-09-14 09:09:57 时间
基本语法


1. :=是赋值的意思,+=是追加的意思,$是引用某变量的值
2. 清理所有已经设定好的变量 include $(CLEAR_VARS)

支持的编译目标?


  1)APK程序,一般的Android程序,编译打包生成apk文件
  2)JAVA库,java类库,编译打包生成jar文件
  3)  C\C++应用程序,可执行的C\C++应用程序
  4)C\C++静态库,编译生成C\C++静态库,并打包成.a文件
  5)C\C++共享库, 编译生成共享库(动态链接库),并打包成.so, 有且只有共享库才能被安装/复制到您的应用软件(APK)包中。

在Android.mk中的写法:
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(BUILD_PREBUILT)
include $(BUILD_MULTI_PREBUILT)
如果你想引用所有子文件夹下的mk文件


LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)


如何把so库编译到/system/lib下面?


1. 在一个编译单元的Android.mk中,比如Jar,Apk,添加本地Native库, 这个库的位置假如是libs/armeabi/libxxx.so
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxxx
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES := libs/armeabi/libxxx.so
include $(BUILD_PREBUILT)

2. 如果是上一步编译的是Jar包,那么在包含这个Jar包的Apk中,添加:
LOCAL_REQUIRED_MODULES := libxxx
如果上一步编译的是Apk,直接添加在上一步所用的Android.mk中。

3. 整个系统编译,编译完系统,so库就进入到了system/lib下面

如何用一个静态Jar引用别的静态jar?


1. 写上引用Jar包的名字:
LOCAL_STATIC_JAVA_LIBRARIES := okhttp270 okhttpws okio

2. 需要让系统可以找到jar包,所以需要做一个映射,此时需要注意,系统中是不是有别的已经include好了的Android.mk已经定义好了这个名字,如果有,编译报错
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
okhttp270:libs/okhttp-2.7.0.jar \
okhttpws:libs/okhttp-ws-2.7.0.jar \
okio:libs/okio-1.6.0.jar

include $(BUILD_MULTI_PREBUILT)

如果这个Jar/APK需要别的Jar的资源,怎么办?


资源文件是单独由AAPT编译的,查wiki,AAPT是:
AAPT
aapt stands for Android Asset Packaging Tool. This tool is part of the SDK (and build system) and allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets.

Build scripts and IDE plugins utilize this tool to package the apk file that constitutes an Android application.

In the SDK, aapt is found in the $ANDROID_HOME/platforms/$SDK/tools/ directory of the SDK (where $SDK is the name of some Android version, like android-2.1).
In the Android open source build environment, aapt is found in $ANDROID_BUILD_HOME/out/host/linux-x86/bin

而基本做法是把所有引用到的Jar包里的R.java合成一个R.java,再放入一些需要引用的路径下。

怎么做呢?
1. 写上需要引用的路径:
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
$(LOCAL_PATH)/../../Support/res \
$(LOCAL_PATH)/../../AndroidSupport/res

2. 将生成的Resource,也就是R.java放到本地的一个package下面,从而使得代码不报编译错误。
LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages android.support.xxxx
--extra-packages android.support.xxxx这一句的意思是说在out生成的包里面形成一个/src/android/support/xxxx的路径,把R.java放进去,这样代码里import android.support.xxxx.R就能找得到了。


如何把一些已经编译好的Apk放入/system/app?


include $(CLEAR_VARS)
LOCAL_MODULE := xxxx
LOCAL_SRC_FILES := xxxx.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PREBUILT_JNI_LIBS := @lib/armeabi/libxxxx_jni.so
include $(BUILD_PREBUILT)