Android.mk的一些FAQ
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)
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)
相关文章
- Android telephony_android获取真实时间
- Android adb install 命令安装apk
- android activity singletask,Android Activity启动模式之singleTask实例详解
- android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
- Android-json解析(三):原生JSONObject+JSONArray的解析、遍历及生成等
- android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解…
- android toast 自定义时间,Android 自定义 Toast 显示时间「建议收藏」
- 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
- android的四大组件_android sdk是什么
- android线程间通信的几种方法_Android进程间和线程间通信方式
- IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
- 【错误记录】Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1. )
- 【错误记录】未安装该应用 ( 在 Android 12 之后 组件设置 android:exported=“false“ 属性 )
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局详解手机开发
- [android] 绑定方式开启服务&调用服务的方法详解手机开发
- [android] 采用断点调试的方式观察pull解析的流程详解手机开发
- Android 工程师的一年
- Android中判断网络连接是否可用及监控网络状态
- android如何添加桌面图标和卸载程序后自动删除图标
- Android获取其他包的Context实例代码