当前位置: 首页 > news >正文

android 动态加载jar包

什么时候需要用到动态加载jar包呢?

  1. 减少apk本身大小,某些界面才需要用jar里的功能
  2. jar中的功能可以独立开发,不要依赖其它的东西,能适用各个项目
  3. 和第三方公司合作,人家不提供项目源码给你,但又要开发他们使用的某些应用场景

实现步骤:

1. 编写jar的代码

新建一个service module,编写以下代码

public interface  AbstractAction {/*** 开始* @param c*/void start(Context c);/*** 停止*/void stop();
}public class MainAction implements AbstractAction {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void start(Context c) {TaskManager.getInstance().start(c);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void stop() {TaskManager.getInstance().stop();}
}public class TaskManager {private volatile static TaskManager instance = null;private boolean isRun = true;private TaskManager() {}public static TaskManager getInstance() {if (instance == null) {synchronized (TaskManager.class) {if (instance == null) {instance = new TaskManager();}}}return instance;}/*** 初始化** @param context*/public void start(Context context) {// 做自己想做的事new Thread() {@Overridepublic void run() {while (isRun)Log.i("xian", " 执行任务中... ");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}.start();}public void stop() {isRun = false;}}

2. 将代码打包并jar转换为 android 可以使用的jar(dex)包

由于android不能直接像java程序那样直接引用jar包, 需要转换dex才行

1. 在module中的 build.gradle 文件中,加入以下代码,生成jar包。输出路径为
task makeJar(type: Copy) {//删除已经存在的 jardelete 'build/libs/test-java.jar'//设置拷贝的文件from('build/intermediates/aar_main_jar/release/')//打进jar包后的文件目录into('build/libs/')include('classes.jar')//重命名rename ('classes.jar', 'test-java.jar')
}makeJar.dependsOn(build)

在这里插入图片描述

2.执行makeJar Task, 一种是点击 task makeJar(tyoe.Copy)前面的绿色小三角运行,另外一种可以打开gardle,然后找到 service --> other --> makeJar 运行

在这里插入图片描述

在这里插入图片描述

3.运行完后,就会在 serice/ --> build --> lib下生成 test-java.jar

4. 使用android sdk --> build-tools --> 30.0.2(任意一个版本) --> dx 配置为环境变量 (如果觉得此操作麻烦,可以使用步骤5的方法)

在这里插入图片描述
windows 的电脑, 右击 我的电脑 --> 属性 --> 高级系统设置 --> path --> 添加 dx的路径 --> 保存
在这里插入图片描述

5. 如果不想配置环境变量,可以win+R --> cmd 打开控制台, 输入 D:\Android\Sdk\build-tools\30.0.2(我的sdk存放的路径),然后 D: 回车, 切换到D盘路径,如下图:

在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/d5d4b1c6797741d18c1453389be2caa5.png

在这里插入图片描述

6.将步骤3生成好的test-java.jar 包,拷贝到桌面,如果配置了环境变量可以直接使用dx命令,没有配置的话,就进入 sdk目录中的dx所在的目录,执行dx命令。 执行完命令后,就可以生成Android 可以调用的 test.jar 了
dx --dex --output=C:\Users\dell\Desktop\test.jar C:\Users\dell\Desktop\test-java.jar

在这里插入图片描述

3. 动态调用jar包

将成功后 test.jar 拷贝到手机的目录中,然后在项目中调用jar ,如果看到执行任务中… 就证明调用成功。

 /***  使用dexClassLoader 动态加载test.jar,然后通过反射调用方法即可** @param view*/fun loadJar(view: View) {if (!PermissionUtils.checkPermission(this)) {Toast.makeText(this,"没有文件读写权限",Toast.LENGTH_LONG).show()//跳转到设置权限界面PermissionUtils.requestAppUsagePermission(this);return}val pluginPath = File(getExternalFilesDir(null)?.absolutePath + "/test.jar")Log.i("xian","jar 包存放路径: ${pluginPath}")val dataFile: String = codeCacheDir.absolutePathtry {val classLoader =DexClassLoader(pluginPath.absolutePath, dataFile, null, javaClass.classLoader)val mainActionClass = classLoader.loadClass("com.xian.service.main.MainAction");val mainAction = mainActionClass.newInstance()//开始执行mainActionClass.getDeclaredMethod("start", Context::class.java).invoke(mainAction, this)}catch (e:Throwable){// 路径记得放对 ,否则会报  ClassLoader referenced unknown pathe.printStackTrace()}}

注意: 1. 申请读写权限 2.test.jar的存放路径
在这里插入图片描述
在这里插入图片描述

4. 源码

https://download.csdn.net/download/u012121105/87522731

相关文章:

android 动态加载jar包

什么时候需要用到动态加载jar包呢? 减少apk本身大小,某些界面才需要用jar里的功能jar中的功能可以独立开发,不要依赖其它的东西,能适用各个项目和第三方公司合作,人家不提供项目源码给你,但又要开发他们使…...

JAVA版B2B2C商城源码多商户入驻商城

三勾商城多商户是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS Android 公众号 H5 各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台,不可多得的二开神器, 为大中小企业提供极致的移…...

测试人员如何在测试环境数据库批量生成测试数据?方案分享

测试人员为了测试某个特定场景,往往需要在测试环境数据库中插入特定的测试数据来满足需求;性能测试时,常需要在测试环境生成大量可用测试数据来支持性能测试;建设持续集成持续交付体系时,我们往往也需要在测试环境生成…...

【el】表单

elementUI中的表单相关问题一、用法1、动态表单调用接口返回表单&#xff0c;后端的接口返回值如下&#xff1a;这些是渲染后的效果页面使用&#xff08;父组件&#xff09;<el-button size"small" class"Cancelbtn" click"sub(true)">发起…...

【Flutter入门到进阶】Flutter基础篇---布局

1 GridView网格布局组件 1.1 说明 1.1.1 图例 1.1.2 说明 GridView网格布局在实际项目中用的也是非常多的&#xff0c;当我们想让可以滚动的元素使用矩阵方式排列的时 候。此时我们可以用网格列表组件GridView实现布局 GridView创建网格列表主要有下面三种方式 1、可以通过Gr…...

python海龟绘图

一、基础 &#xff08;一&#xff09;介绍 海龟绘图&#xff08;Turtle Graphics&#xff09;&#xff1a;“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始…...

【计算机网络】数据链路层

概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧&#xff08;定义使用范围区别共同点&#xff09;_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…...

使用groovy代码方式解开gradle配置文件神秘面纱

来到这里的是不是都有以下疑问&#xff1a; 1.build.gradle配置文件结构好复杂啊&#xff0c;怎么记&#xff1f; 2.内部是怎么进行分析和执行的&#xff1f; 3.为什么可以在配置文件里面写groovy代码&#xff0c;怎么识别的&#xff1f; 4.怎么才能很方便的记住和快速上手…...

kafka入门到实战二(使用docker搭建kafka集群)

使用Docker搭建kafka单机/集群 拉取镜像&#xff1a;2.8.0之前&#xff0c;kafka都需要依赖zookeeper docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper运行zookeeper镜像 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper运行ka…...

【简化开发】lombok的使用、编译后的代码及源码

lombok的使用导入依赖一、getter、Setter、toString1、getter、Setter分别生成getxxx()和setxxx()方法2、toString生成toString()方法&#xff0c;按顺序打印类名称以及每个字段&#xff0c;并以逗号分隔二、NoArgsConstructor、RequiredArgsConstructor、AllArgsConstructor1、…...

在线就能用的主图设计素材,免费分享!

如何给自己的店铺商品设计专属的节日活动主图&#xff1f;没有节日活动的主体素材要如何设计&#xff1f;下面小编就分享一个在线素材设计工具&#xff0c;打开乔拓云&#xff0c;平台里面不仅有许多能使用的电商设计素材&#xff0c;还有许多的设计工具和模板能帮助你快速的实…...

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…...

山东双软认证的基本条件

​一、山东双软认证的基本条件 "双软认证"是指软件产品评估和软件企业评估;企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策&#xff1b;我们…...

TPM 2.0实例探索3 —— LUKS磁盘加密(4)

接前文&#xff1a;TPM 2.0实例探索2 —— LUKS磁盘加密&#xff08;3&#xff09; 本文大部分内容参考&#xff1a; Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR TPM平台配置寄存器&#xff08;…...

Linux连接RDP远程服务工具集记录

目录 rdesktop 安装 实例 xfreerdp 安装 实例 remmia 介绍 rdesktop 安装...

离散事件动态系统

文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from&#xff1a;离散事件系统建模 离散事件动态系统的基本组成元素 &#xff08;1&am…...

无线WiFi安全渗透与攻防(二)之打造专属字典

系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 打造专属字典 什么在破解之前先准备专用字典&#xff0c;因为对于一般家庭来说&#xff0c;常用 一个是预共享密钥PSK&#xff0c;一个是PIN码。 也不是所有的路由都开起了PIN码&#xff0c;一般都会开启域共享密钥…...

拥抱 Spring 全新 OAuth 解决方案

以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用 作为 SpringBoot 3.0 的…...

前端开发与vscode开发工具介绍

文章目录1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行…...

C++---最长上升子序列模型---友好城市(每日一道算法2023.3.2)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; Palmia国有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…...

告别PLC!用Python+ModbusTCP玩转FactoryIO仿真(附完整代码与可视化界面)

PythonModbusTCP工业仿真实战&#xff1a;从零构建FactoryIO智能分拣系统 工业自动化领域正在经历一场静默革命——传统PLC的垄断地位首次被通用编程语言打破。去年某国际自动化展会上&#xff0c;一位工程师仅用200行Python代码就复现了某品牌PLC的复杂流水线控制逻辑&#xf…...

YOLOv11室内展台飞机模型目标检测数据集-182张-Airplane-1_4_2

YOLOv11室内展台飞机模型目标检测数据集 📊 数据集基本信息 目标类别: [‘airplane’] 中文类别:[‘飞机’] 训练集:159 张 验证集:23 张 测试集:0 张 总计:182 张 📄 data.yaml 配置信息 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: .…...

Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛 对于个人开发者和学生而言&#xff0c;探索大模型应用的最大挑战之一往往…...

构建多模型对比评测工具时集成Taotoken的统一接口

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 构建多模型对比评测工具时集成Taotoken的统一接口 在模型选型、效果验证或学术研究过程中&#xff0c;开发者或研究者常常需要并行…...

想转行AI?大模型4大热门方向深度解构!小白也能收藏的进阶指南

AI大模型领域岗位需求激增&#xff0c;人才缺口超500万。本文深度解析大模型4大热门方向&#xff1a;算法研发与模型预训练&#xff08;门槛高&#xff0c;偏研究&#xff09;、模型对齐与后训练优化&#xff08;岗位增长快&#xff0c;数据驱动&#xff09;、推理工程与模型部…...

从UHS-II到DDR4:2014年存储技术演进与工程实践启示

1. 项目概述&#xff1a;一次2014年秋的存储技术快照九月的风刚带起一丝凉意&#xff0c;存储半导体领域却热闹非凡。作为一名长期跟踪硬件发展的从业者&#xff0c;我习惯定期梳理行业动态&#xff0c;而2014年9月这份来自EE Times的“Memory Product Round Up”产品汇总&…...

LayerDivider:如何用3步将单张插画自动分层为可编辑PSD文件?

LayerDivider&#xff1a;如何用3步将单张插画自动分层为可编辑PSD文件&#xff1f; 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精…...

如何5步将小爱音箱改造成专属AI语音助手:MiGPT终极指南

如何5步将小爱音箱改造成专属AI语音助手&#xff1a;MiGPT终极指南 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否曾想过让小爱音箱摆脱&…...

AI开发配置管理利器aiworkspace:实现多项目技能与提示词集中分发

1. 项目概述与核心价值如果你和我一样&#xff0c;在日常开发中同时使用 Cursor、Claude Code 或 Codex 这类 AI 编程工具&#xff0c;并且手头管理着多个项目仓库&#xff0c;那你一定遇到过这个痛点&#xff1a;每个项目里&#xff0c;那些精心调教好的 AI 技能&#xff08;S…...

科技成果转化平台建设成本高如何解决?

观点作者&#xff1a;科易网-国家科技成果转化&#xff08;厦门&#xff09;示范基地现状概述&#xff08;成效与短板&#xff09; 近年来&#xff0c;我国科技成果转化平台建设取得显著进展&#xff0c;各地政府部门、高校、科研院所积极探索&#xff0c;累计建成各类技术转移…...