Android Gradle编译改为mk编译

2023-05-16

原文地址:https://www.jianshu.com/p/8f00d4d692cd

最近出于工作需要,要将一个模块由gradle编译改为mk方式加入源码编译。遇到了一些问题,在这里记录一下。主要有以下几个问题:

  1. 项目中一些三方jar包的引用
  2. AIDL 文件的编译
  3. Dex 64K限制问题
  4. so 库文件的编译
  5. 根据编译版本类型编译不同的asset文件夹

1. 三方jar包的引用

#  fresco:libs/fresco.jar, 冒号前面的名字是随便取得,无所谓,后面跟上对应的jar包的路径,多个jar之间空格隔开
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := fresco:libs/fresco.jar   gson:libs/gson-2.3.1.jar 
include $(BUILD_MULTI_PREBUILT)

在需要引用地方:

# 这里引用的时候只需要引用上面定义的别名即可
LOCAL_STATIC_JAVA_LIBRARIES := \
    fresco \
    gson\

这里还有个问题:在gradle方式中 通过 compile 方式应用的三方库,我们当时并没有下载 jar 文件放到libs 文件夹下啊,咋办?

  • 其实 jar 包是被下载在项目的 External Libraries目录下,找到引用的 jar包,点右键 find in path,就得到了 jar 包的文件地址,把它塞到 libs 文件夹下,然后就在mk中像别的 jar 包一样处理就好了

2. AIDL 文件的编译

  • 最初我是按照下面这种方式将aidl文件加入编译,但是始终编译不过。
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    src/main/aidl/com/test/module/IScanCallback.aidl \
    src/main/aidl/com/test/module/IScanInterface.aidl \
Couldn't find import for class com.test.module.IScanCallback

但是以前我也有类似的经历,编译AIDL这么写是OK的啊,问题出在哪了呢?倒腾了几个小时,经查:

Android.mk在编译简单的AIDL,即传递的参数只有基本数据类型时,上面的写法没有问题。

  • 我的AIDL代码如下:
// IScanCallback.aidl
package com.test.module;
interface IScanCallback {
    boolean myXXX(boolean isOk);
}
// IScanInterface.aidl
package com.test.module;
import com.test.module.IScanCallback;
interface IScanInterface {
    void  startXXX(String filePath);
    void registerCallback(IScanCallback cb);
    void unregisterCallback(IScanCallback cb);
}

问题可能就出现在了 IScanInterface.aidl中引用了com.test.module.IScanCallback并作为参数传递了。

  • 这种情况,正确的写法如下:
# 不仅要在LOCAL_SRC_FILES  标签后加入 aidl文件路径,还要加入LOCAL_AIDL_INCLUDES  标签
aidl_dirs = src/main/aidl
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    src/main/aidl/com/test/module/IScanCallback.aidl \
    src/main/aidl/com/test/module/IScanInterface.aidl \
LOCAL_AIDL_INCLUDES  += $(LOCAL_PATH)/$(aidl_dirs)

3. Dex 64K限制问题

ERROR: Dex writing phase: classes.dex has too many IDs. Try using multi-dex  

DEX 64K 问题: 方法数超限65536
Android平台的Java虚拟机Dalvik执行Dex程序时,使用的是short类型来索引DEX文件中的方法。这就意味着单个Dex文件可被引用的方法总数被限制为64x1024, 即65536。其中包括:
Android Framework的方法 library的方法 我们自己写的方法 为突破这个限制,需要使用multidex来生成多个dex文件

在mk文件中添加以下两个标签即可

LOCAL_DX_FLAGS := --multi-dex
LOCAL_JACK_FLAGS := --multi-dex native

4. so 库文件的编译

和三方jar包的编译方式类似,只是标签不同

include $(CLEAR_VARS)
LOCAL_PREBUILT_LIBS := libaaaa:libs/arm64-v8a/lib_aaaa.so
LOCAL_PREBUILT_LIBS += libbbbb:libs/arm64-v8a/lib_bbbb.so
include $(BUILD_MULTI_PREBUILT)

在需要引用的地方:

LOCAL_JNI_SHARED_LIBRARIES := libaaaa   libbbbb

5. 根据编译版本类型编译不同的asset文件夹

这里主要是 LOCAL_ASSET_FILES标签的使用

ifeq ($(YOUR_JUDGEMENT),true)
LOCAL_ASSET_FILES     += assets/
else
LOCAL_ASSET_FILES     += assets-debug/
endif

6. 附上完整的mk文件:

LOCAL_PATH := $(call my-dir)

############### 三方jar包和so库的编译 ########################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.3.1.jar  fresco:libs/fresco.jar
LOCAL_PREBUILT_LIBS := libaaaa:libs/arm64-v8a/lib_aaaa.so
LOCAL_PREBUILT_LIBS += libbbbb:libs/arm64-v8a/lib_bbbb.so
include $(BUILD_MULTI_PREBUILT)

#######################################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    src/main/aidl/com/test/module/IScanCallback.aidl \
    src/main/aidl/com/test/module/IScanInterface.aidl \
 
######## 解决AIDL编译的问题 #############
aidl_dirs = src/main/aidl
LOCAL_AIDL_INCLUDES  += $(LOCAL_PATH)/$(aidl_dirs)

######## 根据需求编译不同的asset目录 ######
ifeq ($(YOUR_JUDGEMENT),true)
LOCAL_ASSET_FILES     += assets/
else
LOCAL_ASSET_FILES     += assets-debug/
endif

######## 三方jar包和so库文件的引用 #########
LOCAL_STATIC_JAVA_LIBRARIES := \
    gson \
    fresco \
    
LOCAL_JNI_SHARED_LIBRARIES := libaaaa   libbbbb

LOCAL_STATIC_ANDROID_LIBRARIES := \
    android-support-v4 \
    android-support-annotations \
    android-support-v7-recyclerview \
    android-support-v7-preference \
    android-support-v7-cardview \
    android-support-v7-appcompat \
    android-support-v7-palette \
    android-support-v14-preference \
    android-support-v17-preference-leanback \
    android-support-v17-leanback \

####### 解决 64K DEX限制问题  #######
LOCAL_DX_FLAGS := --multi-dex
LOCAL_JACK_FLAGS := --multi-dex native

LOCAL_PACKAGE_NAME := XXXXX
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

LOCAL_PROGUARD_ENABLED := disabled
LOCAL_PROGUARD_FLAG_FILES := proguard-rules.pro
include $(BUILD_PACKAGE)

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

具体 Android.mk 里面的标签还有很多,使用的过程中遇到问题的话会继续补充进来,使用方法网上相关的文章很多。



作者:最忆是深秋
链接:https://www.jianshu.com/p/8f00d4d692cd
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Gradle编译改为mk编译 的相关文章

  • 企业级spring-boot案例-自定义Spring Boot Starter

    文章目录 1 未使用Spring Boot Starter前的情况2 Spring Boot Starter简介2 1 什么是Spring Boot Starter xff08 启动器 xff09 2 2 Starter 模块整体结构2 3
  • 企业级spring-boot案例-Spring Boot 上传文件(图片)

    文章目录 1 添加依赖2 Spring配置3 添加Knife4j配置类4 添加枚举与实体类4 1 响应编码枚举4 2 上传文件信息4 3 统一返回前端的响应对象 5 文件上传接口与实现类5 1 文件上传接口5 2 文件上传接口实现类 6 初
  • Docker安装ElasticSearch和Kibana

    文章目录 1 安装docker2 拉取elasticsearch镜像3 启动elasticsearch3 1 目录结构 4 验证elasticsearch是否启动成功5 插件安装5 1 安装IK分词器5 2 分词器使用验证 6 kibana
  • IDEA远程调试Java代码

    文章目录 1 前言2 远程 Debug 调试原理2 1 理论基础2 2 远程调试分类 3 主动连接调试3 1 远程服务中开启 Debug 服务3 1 1 对于 SpringBoot3 1 2 对于 Tomcat 3 2 IDEA 中指定 D
  • Java 8 的异步编程利器 CompletableFuture 详解

    文章目录 一个例子回顾 Future一个例子走进CompletableFutureCompletableFuture使用场景创建异步任务supplyAsync方法runAsync方法 任务异步回调1 thenRun thenRunAsync
  • C语言头文件组织与包含原则

    文章目录 0 说明1 头文件作用2 头文件组织原则3 头文件包含原则4 代码文件组织原则5 注解题外话 转载自博客园 C语言头文件组织与包含原则 0 说明 本文假定读者已具备基本的C编译知识 如非特殊说明 xff0c 文中 源文件 指 c文
  • Spring 事件发布监听源码解析

    文章目录 初始化事件发布器流程注册事件监听器流程容器事件发布流程总结 Spring 事件监听机制离不开容器 IOC 特性提供的支持 xff0c 比如容器会自动创建事件发布器 xff0c 自动识别用户注册的监听器并进行管理 xff0c 在特定
  • 常见分布式ID生成方案

    文章目录 一 为什么要用分布式ID1 什么是分布式ID2 那么分布式ID需要满足哪些条件 二 分布式ID有哪些生成方式1 基于UUID2 基于数据库自增ID3 基于数据库集群模式4 基于数据库的号段模式5 基于Redis模式6 基于雪花算法
  • 【思维升级】这几个学习方法,打破你的思维惯性,带你走向高效人生

    文章目录 A 如何做好计划1 如何做好长期计划和总结 xff1f 2 如何做好日计划 xff1a 待办日程清单 xff0c 工作从容不迫的武器 B 如何让学习更有效率1 极其功利的少读书2 极其功利的配置资源3 不要从第一页开始读书4 学习
  • 写着简单跑得又快的数据库语言 SPL

    文章目录 数据库语言的目标SQL为什么不行SPL为什么能行游离记录有序性离散性与集合化分组理解聚合理解有序支持的高性能 SPL资料 数据库语言的目标 要说清这个目标 xff0c 先要理解数据库是做什么的 数据库这个软件 xff0c 名字中有
  • 怎样提高报表呈现的性能

    文章目录 报表性能问题出在什么环节 xff1f 数据准备的问题和优化数据传输的问题和优化其他环节的问题和优化报表内计算和呈现 大报表总结润乾报表资料 报表的性能很重要 xff0c 是一个总被谈及的问题 xff0c 跑的慢的报表用户体验恶劣
  • 高考的意义是什么

    文章目录 创立 xff1a 率世界之先 xff0c 开启大学全国统一考试之路重启 xff1a 担公平之义 xff0c 全面打开人才进阶通道奋进 xff1a 选栋梁之才 xff0c 积蓄国家发展能量探索 xff1a 掀改革之潮 xff0c 坚
  • 自定义Maven Archetype模板工程

    文章目录 Maven Archetype介绍什么是Maven Archetype为什么要有模板工程创建模板工程的三种方式 常用的archetypemaven archetype quickstartmaven archetype webap
  • 全文搜索引擎 ElasticSearch 还是 Solr?

    文章目录 什么是全文搜索为什么要用全文搜索搜索引擎Lucene xff0c Solr xff0c ElasticSearch xff1f LuceneSolrElasticSearch Elasticsearch vs Solr的选择历史比
  • 正面管教-读书笔记

    正面管教 读书笔记 文章目录 正面管教 读书笔记正面管教 价值正面管教 作者简介正面管教 正文一 什么是正面管教不同的教养方式是什么在起作用 xff1f 和善与坚定并行 二 为什么要使用正面管教一 阿德勒的基本概念二 赢得 孩子三 赢得合作
  • 内存数据库如何发挥内存优势?

    文章目录 指针式复用外键预关联序号定位集群维表备胎式容错回顾与总结SPL资料 与以磁盘存储为主的普通数据库相比 xff0c 内存数据库的数据访问速度可以高出几个数量级 xff0c 能大幅提高运算性能 xff0c 更适合高并发 低延时的业务场
  • git rm工作区文件删除后撤销

    文章目录 1 现象描述2 解决3 add了多余的文件需要从add中删除4 commit中撤销文件4 1 查看commit的内容4 2 撤销commit里的一部分内容 1 现象描述 今天add文件的时候 xff0c 不小心把一个不需要提交的也
  • 如何建立自己的认知体系

    文章目录 什么是以及为什么要搭建知识体系如何建立知识体系 什么是元认知 什么是程序类知识 什么是概念类知识 什么是事实类知识 搭建知识过程中的注意事项1 无用之用是为大用2 让知识间建立关系 xff0c 切记一定不要孤立3 寻找一切现象 x
  • 【springboot系列】springboot整合guava实现本地缓存

    概述 Guava Cache 是 Google 开源的一套开发工具集合 xff0c Guava Cache 是其中的一个专门用于处理本地缓存的轻量级框架 xff0c 是全内存方式的本地缓存 xff0c 而且是线程安全的 和 Concurre
  • 解决Windows莫名其妙地从休眠状态唤醒的问题

    因为经常写代码开很多个工作区 xff0c 电脑经常就是合盖休眠 xff0c 这样打开就能用 xff0c 但是总是在我不经意的时候发现电脑风扇在狂转 xff0c 不知道是哪个应用又在qj我的电源管理计划 xff0c 今天午休发现电脑风扇狂转

随机推荐

  • Ubunt装机后的必要设置及必备软件

    1 为 Ubuntu Dock 启用 Minimize on Click Ubuntu Dock xff08 位于屏幕左侧的任务栏 xff09 可以轻松打开 xff0c 并且切换和管理应用程序与正在运行的应用程序 你可以点击 Dock 中的
  • No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android 解决方法

    在ndk版本升级之后 xff0c 项目编译出现了问题 xff0c 提示没有对应的编译工具链 xff0c 目前最多的做法是 xff0c 下载之前的ndk版本 xff0c 然后再拷贝缺少的部分 这种做法确实可以解决问题 xff0c 但是既然新版
  • 来自一个前端大神转产品经理后的聊天感悟

    给的学习建议 xff1a 1 推荐给我一本书 锋利的jQuery 2 学会使用思维导图工具 3 课余时间学习理财 4 研发过程中 xff0c 多多留心一些交互 xff0c 自己完善反复琢磨自己的思路 xff08 保证是最简的 xff09 5
  • 08丨案例:编写最简单的性能脚本

    通常我们会遇到要手写脚本的时候 xff0c 就要针对一些接口编写脚本 这时候 xff0c 我们需要知道接口规范和后台的数据是什么 而有些性能测试工程师写脚本时 xff0c 并不知道后端的逻辑 xff0c 只知道实现脚本 xff0c 事实上
  • KindEditor图片上传相关问题 (转)

    size 61 x large 从众多的Web编辑器中选择KindEditor xff0c 主要是看重它的小巧 一个JS文件 两个CSS文件和一个GIF图片就是它的全部 所以在页面上的加载速度很快 xff0c 而且功能也相对齐全 目前Kin
  • hexo+Ubuntu+github搭建个人博客(详细)

    菜鸟初步搭建须知 xff08 是我没错 xff0c 备忘 xff09 相应知识 会一些基本的Linux命令和vim的操作命令 可以在实验楼上入门学习网上已经浏览了 官方文档安装ubuntu和git xff08 因为最近在学习用ubuntu
  • Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    前段时间 xff0c 公司同事开发了一个小工具 xff0c 在工具执行过程中 xff0c UI 界面一直处于卡死状态 通过阅读代码发现 xff0c 主要是由于 Dispatcher BeginInvoke 方法使用不当导致的 本文将通过一个
  • macos可以识别U盘但看不到U盘里的文件

    文章目录 1 问题描述2 解决 1 问题描述 以前U盘插上都可以直接操作的 xff0c 但是突然就不行了 可以看到 xff0c 我这个U盘是FAT32的格式网上有些说mac不可以直接读取fat32或者ntfs格式的文件 xff0c 或者说可
  • List的Clear方法与RemoveAll方法用法小结

    示例代码 using System using System Collections Generic namespace ListClearExp class Program static void Main string args Lis
  • 利用C#访问注册表获取软件的安装路径

    绝大多数软件 xff0c 基本上都会在注册表中记录自己的名字和安装路径信息 在注册表中记录这些信息的位置是 xff1a HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion
  • 使用ValidationRule类来检查用户输入的有效性

    1 新建WPF应用程序ValidationRuleExp 整个程序的结构如下图所示 程序运行起来后的效果如下图所示 用户操作程序时 xff0c 先输入固话 手机 Email 个人网站等信息 xff0c 再点击右侧的 点我记住你 按钮 xff
  • 关闭窗体后,进程仍然在运行的问题重现与解决

    1 问题陈述 在开发中 xff0c 遇到这样一个问题 xff1a 点击程序主窗体右上角的叉号关闭应用程序后 xff0c 程序的进程却没有关闭 通过查阅资料 xff0c 了解到 xff0c 产生此类问题的原因主要有以下两点 xff1a 1 x
  • Python判断一个字符串是否包含子串的几种方法

    1 使用成员操作符 in span class hljs prompt gt gt gt span s 61 span class hljs string 39 nihao shijie 39 span span class hljs pr
  • easyui-datagrid获取行和列数据

    1 获取当前行 span class hljs keyword var span row 61 span class hljs string 39 dg 39 span datagrid span class hljs string 39
  • No plugin found for prefix ‘tomcat7’ in the current project and in the plugin groups

    idea中开发javaweb应用 xff0c 使用mvn tomcat7 run命令运行应用时 xff0c 需要配置tomcat的maven插件 在没有配置的情况下会出现下面的错误提示 ERROR No plugin found for p
  • C#中的IComparable和IComparer接口

    C 中 xff0c 自定义类型 xff0c 支持比较和排序 xff0c 需要实现IComparable接口 IComparable接口存在一个名为CompareTo 的方法 xff0c 接收类型为object的参数表示被比较对象 xff0c
  • C#接口汇总

    1 IComparable和IComparer接口 用于比较和排序 IComparable 可比较的 xff0c 实现该接口的类 xff0c 便具有 可比较的 特性 IComparer 比较器 xff0c 实现该接口的类 xff0c 是一个
  • Python操作环境变量

    1 使用os读取环境变量 import os os getenv 39 path 39 os environ get 39 path 39 os environ 39 path 39 2 遍历打印所有环境变量 通过访问os environ可
  • ITK——3. 编译remote库

    文章目录 1 在线编译 2 离线编译 2 1 下载对应的github库 2 2 编译 2 3 一点疑问 以ITKMinimalPathExtraction库为例 对应的github链接是 https github com InsightSo
  • Android Gradle编译改为mk编译

    原文地址 xff1a https www jianshu com p 8f00d4d692cd 最近出于工作需要 xff0c 要将一个模块由gradle编译改为mk方式加入源码编译 遇到了一些问题 xff0c 在这里记录一下 主要有以下几个