Intellij IDEA / Android studio 可持续开发笔记

news2024/11/26 15:38:58

Intellij 的Java/安卓工具链有着一种不可持续性,这种不可持续性体现在多个方面。

首先是不可持续运行。IDEA 使用时间越长,内存占用越大,从不主动释放。运行时间越长,日志越多,从不主动清理。

然后是不完整的开源,从源码编译时需要下载更多依赖。而研究更多依赖就要消耗更多的精力与资源……


合理选择 IDEA 与 Gradle 版本

Android studio 是闭源的工具。它使用gradle构建安卓项目。gradle又是从网络下载下来的,至少有三个部分、三种语言。

Android SDK 也是闭源的。并且还附加了使用协议,只能用于为安卓兼容的设备开发app。

IDEA 的 Android Support Plugin 是开源的,效果和 Android studio 基本一致。但仅有内置的 Android 插件还不行,首次编译安卓项目时 IDEA 还需要下载许多资源。

Gradle 的中文意译当为 —— 小混球儿。它也是开源的。但是兼容性很差,需要配合特定版本的 IDEA 才能正常运行。

Gradle wrapper 7,比如 gradle-7.3.3-bin 相比于版本 6 ,增量编译更快。原本十秒,优化至三四秒,甚至1秒。但是版本 7 不支持 IDEA 2023 以前的版本,所报错误匪夷所思:

Querying the mapped value of map … before task ‘:app:compileDebugJavaWithJavac’ has completed is not supported CSDN博客

Android Studio:Gradle project sync failed_unable to find method ''java.lang.string org.gradle-CSDN博客

如果升级最新版本的 IDEA 2023,那么恭喜你,这个问题不出现了。不是因为解决了,而是免费的 IDEA 2023 压根不让你玩安卓,需要付费解锁 ultimate 。

(付费版还内置了辅助机器人)。
如果尝试自行编译 gradle ,那么你会遇到更多问题,占用更多c盘空间。

Gradle / Can not build gradle from source code · Issue #5282 · gradle/gradle

只能用不新不旧的 IDEA 2023.1 。几番测试下来,已经用了 c 盘十个G了……

不新不旧的 IDEA 内置不新不旧的 open jdk 17。这玩意儿最恶心在于强制模块化,许多旧项目需要添加许许多多的 jvm 参数才能编译:

jdk17运行程序报错module java.base does not open java.lang.reflect to unnamed module @_module java.base does not "opens java.lang.reflect-CSDN博客

上面博客是将启动参数放到设置里。我参考的是博客写入 gradle.properties。

如果编译过程使用了gradle插件,可能还需要更多参数,比如我的改成:

org.gradle.jvmargs=-Xmx2048m --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED  --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED  --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED   --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
  \ --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
  \ --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED  

这么一长串启动参数,每一个add-opens都要试出来的,谁懂啊。也可降级,用旧的 jvm 运行 gradle。


解决log无底洞

运行 gradle deamon 会持续记录log,这些日志累积可达 10G、甚至百G,从不自动清理。

Gradle / Gradle logging hygiene · Issue #2688 · gradle/gradle

这个问题仍然存在,按照issue中的方法提高 Log 等级、自定义任务等,只能缓解无法根治。

我的解决方法很有技巧性,配合了符号链接(Symbolic Link) 与 用户空间文件系统(Filesystem in Userspace)。

用户空间文件系统(Filesystem in Userspace): 是虚拟的文件系统,但可以挂载。第三方程序感觉起来,无异于真实文件系统。windows上的fuse是dokanky,持续开源、性能好、上手简单(借鉴官方mirror.c镜像文件系统)。

dokany mirror.c github

自己写的 fuse 可以移花接木,拦截修改,令行禁止:

  1. 可以直接禁止创建log文件,但是那样 gradle deamon 启动崩溃。

  2. 可以禁止写入,但守护进程陷入死循环。

  3. 于是只能循环写入:只允许写入 1kb,超出部分从头写入。

符号链接(Symbolic Link): 有别于普通的lnk快捷方式,会被第三方程序识别为目录,从而达到移花接木的效果。

使用指令创建符号链接: mklink /D deamon V:\deamonX,其中 V:\deamonX 是镜像文件系统,强制IDEA打印日志时循环写入。

为什么不直接将 fuse 挂载到 deamon 呢?因为 dokany 一个线程只能有一个挂载点,为了节省性能,我用一个盘符为所有磁盘开启镜像文件系统,并用不同目录区分不同功能:

在这里插入图片描述
J:\c\ 代表 c 盘回收站内容(解码了文件名乱码,可正常打开)。其中双横杠开头的文件夹代表特殊功能区域:

– encrypt – 是对该磁盘回收站内容的加密镜像。(调用 openssl aes 加密)
– entropy – 是对该磁盘所有文件的加密镜像,以及加密文件的解密镜像。
– equator – 是对该磁盘所有文件的原始镜像,添加了上述日志写入的限制。

这样我就能用一个挂载点,实现许许多多不同的功能。

再配合ahk用户脚本引擎,添加快捷键,可以一键往返真实目录与镜像目录,任意穿梭,方便无比。

所有日志导入一个文件,并限制大小。


解决内存无底洞

其实 c++ 调用 java 方法可以归还内存,实现零泄漏、占用零增长的。不知为何 IDEA 只能持续占用内存,从不归还。

编译几次就整个重启?还可以结束 gradle 守护进程,保留IDEA本体。本体重启守护只需几十秒,很值,只需:

在这里插入图片描述
windows的任务管理器。没谁了吧,mac、linux、安卓哪一个这么能打?

其中图标写着JB二字的进程里,就住着我们的小混球gradle,等他增长到1gb,idea本体4gb的时候就可以结束他,开启新的轮回,实现可持续性编译!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1565321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

Ollama教程——入门:开启本地大型语言模型开发之旅

Ollama教程——入门:开启本地大型语言模型开发之旅 引言安装ollamamacOSWindows预览版LinuxDocker ollama的库和工具ollama-pythonollama-js 快速开始运行模型访问模型库 自定义模型从GGUF导入模型自定义提示 CLI参考创建模型拉取模型删除模型复制模型多行输入多模态…

【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。

📝个人主页:哈__ 期待您的关注 一、ShardingSphere简介 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成…

hadoop 高可用(HA)、HDFS HA、Yarn HA

目录 hadoop 高可用(HA) HDFS高可用 HDFS高可用架构 QJM 主备切换: Yarn高可用 hadoop 高可用(HA) HDFS高可用 HDFS高可用架构 QJM 主备切换: Yarn高可用

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定:为了方便,本文后面把PL/SQL简称PL。 PL程序都是以块(BLOCK)为基本单位,整个PL块分三部分:声明部分(使用DECLARE开头)、执行部分(以BEGIN开头)和异…

IP地址获取不到的原因是什么?

在数字化时代的今天,互联网已成为我们日常生活和工作中不可或缺的一部分。而IP地址,作为互联网通信的基础,其重要性不言而喻。然而,有时我们可能会遇到IP地址获取不到的问题,这会给我们的网络使用带来诸多不便。那么&a…

利用开源AI引擎:构建本地化部署的工业级智能安全监测系统

随着科技的不断进步,传统的安全管理方法已经无法满足现代社会对于安全保障的高标准要求。环境隐患的及时发现与处理,对于保障人民生命财产安全、维护社会稳定具有重要意义。本文将探讨如何通过图像处理、图像识别和目标检测技术,实现对环境隐…

力扣2684---矩阵中移动的最大次数(DFS,Java、中等题)

目录 题目描述: 思路描述: 代码: 纯递归: 带有记忆化搜索的递归: 题目描述: 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干 正 整数组成。 你可以从矩阵第一列中的 任一 单…

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一:手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

破解密码:掌握2024年的营销归因

Cracking the Code: Mastering Marketing Attribution in 2024 营销归因是识别哪些营销渠道和触及点有助于销售或转化的过程。随着消费者继续通过多个渠道与品牌互动,掌握营销归因对企业来说变得越来越重要。在这篇文章中,我们将探讨破解代码和有效衡量…

算法基础--递推

😀前言 递推算法在计算机科学中扮演着重要的角色。通过递推,我们可以根据已知的初始条件,通过一定的规则推导出后续的结果,从而解决各种实际问题。本文将介绍递推算法的基础知识,并通过一些入门例题来帮助读者更好地理…

如何从文本数据中提取子列表

提取文本数据中的子列表可以通过各种方式实现,具体取决于文本数据的结构和提取子列表的条件。例如:使用字符串操作和条件判断、使用正则表达式、使用自然语言处理工具、使用自定义解析器等几种模式,那么对于在日常使用中会有那些问题呢 &…

黄金票据的复现

实验环境以及工具 服务器:Windows server 2003 用户:Windows 7旗舰版 工具:mimikatz 搭建服务器环境 参考:内网横向——域渗透之黄金票据复现-CSDN博客 创建用户 使用gpupdate刷新策略; 搭建win7环境 设置ip ‘…

IDEA无法连接虚拟机中的Redis的解决方案,无法连接Jedis,无法ping通虚拟机的解决方案

首先,笔者先说明一下自身的情况,怎么连接都连不上,网上的教程全部都看了一遍,基本上没用得上的,这篇文章里面的解决方案包括了笔者能在网上找到了最全面的办法总结,最后终于是连上了 目录 一.连接Jedis出错…

专题三_二分查找(3)

目录 153. 寻找旋转排序数组中的最小值 解析 题解 LCR 173. 点名 解析 题解 153. 寻找旋转排序数组中的最小值 153. 寻找旋转排序数组中的最小值 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int findMin(vector<int>& nums) …

Qt实现Kermit协议(三)

3 实现 3.2 KermitSendFile 该模块实现了Kermit发送文件功能。 序列图如下&#xff1a; 3.2.1 KermitSendFile定义 class QSerialPort; class KermitSendFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitSendFile(QSerialPort *serial, QObject *…

软考中项新版第1章脑图发布,用5幅图掌控信息化发展的考点地图

2024年1月开年&#xff0c;软考系统集成项目管理工程师官方教程&#xff0c;迎来了阔别7年的大改版&#xff0c;改版之后的软考中项考试&#xff0c;离同宗兄弟高项考试渐行渐远。 中项第3版教程&#xff0c;仅仅从教程来看&#xff0c;其难度已经不亚于高级的信息系统项目管理…

15.Python访问数据库

如果数据量较少&#xff0c;则我们可以将数据保存到文件中&#xff1b;如果数据量较 大&#xff0c;则我们可以将数据保存到数据库中。 1 SQLite数据库 SQLite是嵌入式系统使用的关系数据库&#xff0c;目前的主流版本是SQLite 3。SQLite是开源的&#xff0c;采用C语言编写而…

使用TCP协议就一定零丢包了吗?

简述数据包发送流程 为了简化模型&#xff0c;我们把中间的服务器给省略掉&#xff0c;假设这是个端到端的通信。且为了保证消息的可靠性&#xff0c;它们之间用的是TCP协议进行通信。 为了发送数据包&#xff0c;两端首先会通过三次握手&#xff0c;建立TCP连接。 一个数据包&…

STM32 uC/OS-III

What is uC/OS-III? C/OS-III 的发音为“Micro C O S Three”&#xff0c;这意味着 C/OS-III 是基于 C 语言编写的第三代 小型操作系统&#xff0c;当然这里所说的第三代是相对于 C/OS 的前两个版本 C/OS 和 C/OS-II 而言 的&#xff0c;后面也会介绍这三个版本的差别。C/OS/…