IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 编写Android.mk把Android studio项目编译到AOSP源码中 -> 正文阅读

[游戏开发]编写Android.mk把Android studio项目编译到AOSP源码中

前言:

? ? ? ? ? ? ?在工作,我们利用Android studio开发apk是非常方便的,当我们要把工程代码放在android

源码中编译的时候,需要我们自己编写Andorid.mk 文件。以下内容是对Android.mk文件中的代码

解释说明。

Android.mk 编写:

#每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件

LOCAL_PATH := $(call my-dir)

#CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多 LOCAL_xxx.例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 但不清理LOCAL_PATH,这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

include $(CLEAR_VARS)

#LOCAL_MODULE_TAGS :=? user eng tests optional

user: 指该模块只在user版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译


LOCAL_MODULE_TAGS := optional

#LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ , java源码。

LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main/java)

#编译AndriodManifest.xml

LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml


# 编译的系统资源文件

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res


# 编译asset资源文件,必须要单独写出来,不然在工程中无法访问到asset路径下的资源文件

LOCAL_ASSET_DIR := $(LOCAL_PATH)/app/src/main/assets


#指定APP应用名称

LOCAL_PACKAGE_NAME := MyTestApp

#在指定分区中安装此模块

? ? ?一般有? system? ? system_ext? ? ?product? ? ?vendor? ? ?odm? ? ? ?分区? ? ?

#模块编译输出分区

#system :主要包含 Android 框架, google 官方实现

    #Android.mk 默认就是输出到 system 分区,不用指定
    #Android.bp 默认就是输出到 system 分区,不用指定

#system_ext: android11 新划分区

#vendor :SoC芯片商分区(系统级核心厂商,如高通), 为他们提供一些核心功能和服务,由 soc 实现

    #Android.mk LOCAL_VENDOR_MODULE := true
    #Android.bp vendor: true

#odm :设备制造商分区(如华为、小米),为他们的传感器或外围设备提供一些核心功能和服务

    #Android.mk LOCAL_ODM_MODULE := true
    #Android.bp device_specific: true

#product :产品机型分区

    #Android.mk LOCAL_PRODUCT_MODULE := true
    #Android.bp product_specific
#安装到product分区
LOCAL_PRODUCT_MODULE := true   

#LOCAL_PRIVILEGED_MODULE := true对于Android系统应用LOCAL_PRIVILEGED_MODULE 决定了app在编译后,放在ROM分区中的 app? 或者 priv-app位置

LOCAL_PRIVILEGED_MODULE := true

#如果配置为false 则编译到设备中的路径为  (system or product or vendor/app)
#如果配置为true  则编译到设备中的路径为  (system or product or vendor/priv-app)

#使用sdk的hide的api來编译,?Android P 之后,Android.mk 必须定义 LOCAL_SDK_VERSION 和 LOCAL_PRIVATE_PLATFORM_APIS 变量中的一个, 这两种是或的关系,只需要定义一个

#如果需要使用系统隐藏 API编译 则需要定义:
LOCAL_PRIVATE_PLATFORM_APIS := true


#如果不需要使用系统隐藏API编译,则需要定义:
LOCAL_SDK_VERSION := current


#注意,两个是 if --else 的定义原则,根据实际情况选择

?#aapt 是编译和打包资源的工具。而aapt2是在aapt上做了优化

LOCAL_USE_AAPT2 := true???

#指定依赖的共享java类库,这个是编译时依赖,最终不会打包到apk中

LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net????

#指定依赖的静态java类库,最终会打包到apk里面。

?使用多个引用的时候,写法如下:

LOCAL_STATIC_JAVA_LIBRARIES := \
 com.android.vcard \
 bluetooth.cc\ 
 services.net \
libprotobuf-java-lite \ 

#指定依赖的模块。指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)

LOCAL_REQUIRED_MODULES := libjni_pinyin_test

#混淆配置,默认为full obfuscation,全代码混淆,disabled不开启

#不需要使用代码混淆的工具进行代码混淆
LOCAL_PROGUARD_ENABLED := disabled 

#默认为: 使用将该工程代码全部混淆
LOCAL_PROGUARD_ENABLE := full

# LOCAL_CERTIFICATE 用于设置不同的签名方式

用于设置不同的签名方式build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

????????1、testkey:普通APK,默认情况下使用。

????????2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

????????3、shared:该APK需要和home/contacts进程共享数据。

????????4、media:该APK是media/download系统中的一环。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

Settings.apk就是platform级别的签名,系统级应用都应该使用这个签名

LOCAL_CERTIFICATE := platform

#声明要调用android包,会打包到apk中,调用多个时,写法如下:

LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx-constraintlayout_constraintlayout \
lottie-2.8.0   //lottie 第三方aar

#aapt是Android的打包工具,

1、–auto-add-overlay意思是当不同文件夹有相同的资源id时,只将第一个资源合并打包进来,
2、–extra-packages android.support.v7.appcompat,意思是将extra-package包后边的文件包引入到当前代码框架中,就像给当前代码导入一个jar包,但是这里不限jar、library等等,这样引入编译之后就能合并在一起使用

LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.airbnb.lottie  //lottie 第三方aar的包名

#编译APK

include $(BUILD_PACKAGE)


延伸定义

BUILD_HOST_STATIC_LIBRARY 编译静态库(适用与主机)
BUILD_HOST_SHARED_LIBRARY 编译动态库(适用与主机)
BUILD_HOST_EXECUTABLE 编译可执行程序(适用与主机)
BUILD_HOST_PREBUILT 预编译(适用与主机)
BUILD_HOST_JAVA_LIBRARY 编译java包(适用与主机)
BUILD_JAVA_LIBRARY 编译java包
BUILD_STATIC_JAVA_LIBRARY 编译java静态包


BUILD_STATIC_LIBRARY 编译静态库
BUILD_SHARED_LIBRARY 编译动态库

官方解释是这样:
1、 LOCAL_STATIC_JAVA_LIBRARIES-静态库是在连接阶段直接拷贝到代码 中使用的,BUILD_STATIC_JAVA_LIBRARY指定生成静态库。编译出来的静态库(这里指jar包)里每个java文件对应的class文件都单独存在,可以直接导入Eclipse等IDE使用,
2、LOCAL_JAVA_LIBRARIES -而共享库是由加载器加载到内存,在运行时使用的。而编译出来的共享库(jar包),内部是Android字节码Dex格式的文件,一般无法导入Eclipse等IDE使用。Android.mk中由BUILD _ JAVA _ LIBRARY指定生成共享库


静态库和动态库本质上没有区别,可能就是说静态库是编译时期就把jar包中的代码整合到项目中了,动态库就是说在程序运行期,把jar包加载到内存中,每次使用再继续重新加载到内存


BUILD_EXECUTABLE 编译可执行程序
BUILD_PACKAGE 编译apk
BUILD_PREBUILT 预编译(针对单个预编译文件)
BUILD_MULTI_PREBUILT 预编译(针对多个预编译文件)
?

#Android.mk 文件结尾,make文件最后一句话

include $(call all-makefiles-under,$(LOCAL_PATH))

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:08:57  更:2022-04-26 12:10:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 22:03:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码