Intellij IDEA / Android studio 可持续开发笔记
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 可以移花接木,拦截修改,令行禁止:
-
可以直接禁止创建log文件,但是那样 gradle deamon 启动崩溃。
-
可以禁止写入,但守护进程陷入死循环。
-
于是只能循环写入:只允许写入 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的时候就可以结束他,开启新的轮回,实现可持续性编译!
相关文章:

Intellij IDEA / Android studio 可持续开发笔记
Intellij 的Java/安卓工具链有着一种不可持续性,这种不可持续性体现在多个方面。 首先是不可持续运行。IDEA 使用时间越长,内存占用越大,从不主动释放。运行时间越长,日志越多,从不主动清理。 然后是不完整的开源&am…...

c++----list模拟实现
目录 1. list的基本介绍 2. list的基本使用 2.1 list的构造 用法示例 2.2 list迭代器 用法示例 2.3. list容量(capacity)与访问(access) 用法示例 2.4 list modifiers 用法示例 2.5 list的迭代器失效 3.list的模拟实现 3.1…...
FastAPI+React全栈开发15 让我们构建一个展示API
Chapter03 Getting Started with FastAPI 15 Let’s Build a showcase API FastAPIReact全栈开发15 让我们构建一个展示API REST APIs are all about cycles of HTTP requests and responses, it is the engine that powers the web and is implemented in every web framew…...
list(链表)容器(二)
一、list 插入和删除 函数原型: push_back(elem);//在容器尾部加入一个元素 pop_back();//删除容器中最后一个元素 push_front(elem);//在容器开头插入一个元素 pop_front();//从容器开头移除第一个元素 insert(pos,elem);//在pos位置插elem元素的拷贝,…...

世优科技上榜2024年度《中国虚拟数字人影响力指数报告》
日前,第三期《中国虚拟数字人影响力指数报告》在中国网络视听大会上正式发布。本期《报告》由中国传媒大学媒体融合与传播国家重点实验室(以下简称“国重实验室”)、中国传媒大学数字人研究院编制,中国网络视听协会、人民日报智慧…...
【调试方法】C代码中dump中间数据的方法
一,简介 本文主要介绍,如何在C语言代码中将音频流数据进行写入文件,方便调试定位问题: 二,函数实现 按int8_t写入 #include <stdio.h>int32_t write_int8_t_data(int8_t *name, int8_t *buffer, int32_t dat…...
【BUG】vue中@change时间传值丢失问题
项目场景: 在修改项目bug时,发现后端响应到前端的值,通过change事件调用方法,在方法中拿到值时,有部分数据丢失。 问题描述 后端传到前端的值为:字符串类型的"00000089",change调用…...

Linux提权!!!
上一篇文章讲了Windows的提权,那么这篇文章就来讲一下Linux的提权 1.SUID提权 suid权限 作用:让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置…...

Android Studio学习7——常用控件view
Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“;”号 CtrlX——>删除一行,只需把鼠标放在那一行 windows自带字体...
Springboot3 集成knife4j(swagger)
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! 官网地址: Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 本文以Springboot3版本集成kn…...

深信服:借助观测云实现全链路可观测性
导读 深信服科技股份有限公司 简称「深信服」( Sangfor Technologies Inc. ),是一家领先的网络安全和云计算解决方案提供商,致力于为全球客户提供高效、智能、安全的网络和云服务。随着公司业务的不断扩展,也面临着监…...
详解Qt中使用线程
详解Qt中使用线程 Qt中的线程相关知识涵盖了线程创建、管理、通信以及线程安全等方面。下面将详细讲解这些知识点,并提供对应的示例代码。 线程创建与管理 QThread类 Qt通过QThread类来创建和管理线程。要创建一个新的工作线程,通常有两种方法&#…...

在.Net6中用gdal实现第一个功能
目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称,然后选择 "Manage NuGet Packages"(管理 NuGet 包)。N…...

采用大语言模型进行查询重写——Query Rewriting via Large Language Models
文章:Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展,因为它容易出错并且需要深厚的专业知识。 类似地…...

使用Vue实现CSS过渡和动画
01-初识动画和过渡 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>使用vue实现css过渡和动画&l…...

一家购物商场的数据运营挑战
✅作者简介:《数据运营:数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 🌸公众号:风姑娘的数字视角,免费分享数据应用相…...

React Native框架开发APP,安装免费的图标库(react-native-vector-icons)并使用详解
一、安装图标库 要使用免费的图标库,你可以使用 React Native Vector Icons 库。 首先,确保你已经安装了 react-native-vector-icons: npm install --save react-native-vector-iconsnpm install --save-dev types/react-native-vector-ic…...

idea端口占用
报错:Verify the connector‘s configuration, identify and stop any process that‘s listening on port XXXX 翻译: 原因: 解决: 一、重启大法 二、手动关闭 启动spring项目是控制台报错,详细信息如下ÿ…...

MQ消息队列详解以及MQ重复消费问题
MQ消息队列详解以及MQ重复消费问题 1、解耦2、异步调用3、流量削峰4、MQ重复消费问题,以及怎么解决?4.1、重复消费产生4.2、解决方法: https://blog.csdn.net/qq_44240587/article/details/104630567 核心的就是:解耦、异步、削锋…...

系统IO函数接口
目录 前言 一. man手册 1.1 man手册如何查询 1.2 man手册基础 二.系统IO函数接口 三.open打开文件夹 3.1 例1 open打开文件 3.2 open打开文件代码 3.3 例2 创建文件 四.write写文件 4.1 write写文件 五. read读文件 5.1 read读文件与偏移 5.2 偏移细节 5.3 read读文件代码 六.复…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...