Android.mk的一些FAQ

本文详细介绍了Android开发中的编译目标概念,包括APK、JAVA库、C/C++程序等,并解释了如何将SO库编译到特定目录。此外,文章还阐述了如何引用静态Jar包,解决资源文件编译与库引用问题,以及如何将已编译的Apk放入系统目录。
基本语法


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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值