开篇,初识 Compose,永久激活 IntelliJ IDEA

开篇,初识 Compose,永久激活 IntelliJ IDEA

  • 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
  • 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章

Jetpack Compose 是 Android UI 的现代工具包,简化了 Android 上 UI 的开发。你无需编辑任何 XML 布局,使用声明性函数即可构建一个简单的 UI 组件,UI 构建工作将由 Compose 编译器完成。通过更少的代码、强大的工具和直观的 Kotlin api,加速 Android 上 UI 的开发——来自官网。

Compose 是用 Kotlin 编写的 UI 工具包,JetBrains 基于 Google 提供的 Compose 开发了 Compose for Desktop 简化了桌面应用程序 UI 的开发,因此 Android 和 桌面应用程序之间大部分 UI 代码是共享的。也就是说在 Android 上使用的部分 UI 组件,同样也适用于桌面应用程序 UI 开发,降低了学习成本,在后文中会有详细的演示案例。

在 Compose for Desktop 之前也提供了 JavaFX 、Java Swing 等等,都是为 Java 设计的 UI 工具包。

之前我用 JavaFX 开发过 Win 和 Mac 桌面应用程序,最近我也打算用 Compose for Desktop 重写之前开发的桌面应用程序,后面会出一系列文章。

如何将程序打包成可安装的桌面应用程序,提供给使用者在 Win、Mac 上进行安装,因为篇幅限制,会在后续的文章中介绍。

通过这篇文章你将学习到以下内容:

  • 使用破解补丁无限制的使用 IntelliJ IDEA
  • 破解补丁源码分析
  • Compose for Desktop or Android 应用程序所需的环境配置
  • 如何配置多个不同版本的 JDK
  • Compose for Desktop or Android 示例

环境

使用 Compose for Desktop 开发桌面应用程序,需要如下工具:

  • IntelliJ.IDEA-2020.3 以上
  • JDK 11 以上
  • Kotlin 1.4.2 以上

如果你的电脑上安装的是低版本的 JDK,我不建议你贸然升级到最新版本,因为你之前很多项目都是基于当前 JDK 版本进行开发的,而且有一些软件只在低版本的 JDK 上才能运行,例如 JD-GUI,所以可以在电脑上安装多个 JDK,例如开发 Compose for Desktop 使用 JDK 11,开发 Android 项目使用 JDK 8。

IntelliJ IDEA 开发工具是收费的,而且价格相对而言挺贵的,如果资金允许的前提下,可以前去购买,在本文中也会提供破解补丁,永久激活 IntelliJ IDEA。

我已经将 JDK 11 、IntelliJ.IDEA-(2020.3 ~ 2021.1) 以及 IntelliJ.IDEA 破解补丁已经上传到网盘上,可以 「关注下方公众号」或者「搜索关注公众号:ByteCode」,回复关键词:compose,即可获取所有软件。

如何配置多个 JDK

这一小节中将会介绍如何在 MAC 上安装多个 JDK(PS: win 配置方式网上有很多教程,可自行搜索):

  • 首先从 Oracle 官网下载并安装 JDK 11 也可以在公众号内,回复关键词:compose,即可获取

我们自己安装的 JDK 默认存放在 /Library/Java/JavaVirtualMachines/ 目录下。

  • 在命令行中输入 vi ~/.bash_profile 打开 bash_profile 文件
  • bash_profile 文件中配置不同版本 JDK 的路径
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home
export JAVA_11_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home
export JAVA_16_HOME=/Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home
  • bash_profile 文件中添加下面命令,用于切换不同 JDK 版本
alias jdk8='export JAVA_HOME=$JAVA_8_HOME'
alias jdk11='export JAVA_HOME=$JAVA_11_HOME'
alias jdk16='export JAVA_HOME=$JAVA_16_HOME'
  • 验证是否配置成功

使用别名 alias jdk8 切换到 JDK 8 ,然后输入 java -version 获取当前 JDK 的版本。

localhost:~ $ jdk8
localhost:~ $
localhost:~ $ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

切换到其他 JDK 版本同样如此。

高版本的 JDK 造成很多软件无法正常运行

如果我们安装了高版本的 JDK ,即使电脑上有低版本的 JDK,还是会造成很多软件无法正常运行,例如 JD-GUI,所以我们需要修改一下系统默认的 JDK,查看 JD-GUI 执行脚本可知,在 Mac OS 上都是通过下面的命令来获取系统默认的版本。

/usr/libexec/java_home

系统默认的排序是根据 JDK 的版本从高到低进行排序的,所以通过上面的命令获取到的是最高版本的 JDK,可以通过下面的命令查看 JDK 的排序。

/usr/libexec/java_home -V

执行结果如下所示:

Matching Java Virtual Machines (2):
16.0.1, x86_64: "Java SE 16.0.1" /Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home
11.0.11, x86_64: "Java SE 11.0.11" /Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home
1.8.0_51, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home

默认的话使用第一条作为系统默认的 JDK,如果我们想设置 JDK 8 作为默认系统的 JDK,可以修改 Info.plist 文件 JVMVersion 的版本号来调整它的顺序,将 JDK 8 放在第一条,将 JDK 11 和 JDK 16 放在最底下,达到修改默认 JDK 的目的,JDK 11 和 JDK 16 的 Info.plist 文件路径如下所示:

/Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home/Info.plist

/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home/Info.plist

只需要将 JDK 11 的 Info.plist 文件 JVMVersion11.0.11 修改至 !11.0.11,JDK 16 的 Info.plist 文件 JVMVersion16.0.1 修改至 !16.0.1,通过这种方式即可将高版本的 JDK 放在最底下,修改完成之后,执行上述命令 /usr/libexec/java_home -V 查看 JDK 的排序,结果如下所示:

Matching Java Virtual Machines (2):
1.8.0_51, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home
!16.0.1, x86_64: "Java SE 16.0.1" /Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home
!11.0.11, x86_64: "Java SE 11.0.11" /Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home

最后执行 /usr/libexec/java_home 命令,返回的就是你设置的低版本的 JDK,这样就可以解决高版本的 JDK 造成很多软件无法正常运行的问题。

IntelliJ.IDEA 破解补丁的使用

在这一小节中将会介绍如何使用破解补丁永久激活 IntelliJ IDEA。感谢作者 pengzhile/ide-eval-resetter 提供的插件

  • IntelliJ IDEA 破解补丁,仅供个人学习使用, 请勿商用,建议购买正版
  • 破解补丁适用于 IntelliJ IDEA 2020 ~ 2021.1 所有的版本,其他版本尚未尝试
  • 破解教程适用于 Windows/Mac/Linux 系统

只需要五步即可永久使用 IntelliJ IDEA:

  • 首先从 IDEA 官网下载 2021.1 版本并安装,也可以在公众号内,回复关键词:compose,即可获取
  • 安装成功之后运行 IDEA 会弹出一个注册框,勾选 Evaluate for free , 点击 Evaluate, 之后随便创建一个新的项目即可
  • 将破解补丁 ide-eval-resetter-2.1.6.zip 拖入 IDEA 界面中, 会弹出如下界面,点击 Restart 重启 IDEA 即可(PS:破解补丁放在固定位置,不要移动)

  • 重启 IDEA,点击顶部菜单栏 Help,若列表中出现 Eval Reset 选项,则代表安装成功
  • 点击顶部菜单栏 Help -> Eval Reset,弹出如下界面,勾选 Auto reset before per restart,每次重启 IDE 会自动重置所有信息,你无需做额外的事情

验证是否永久激活 IntelliJ IDEA:

  • 运行 IDEA,将系统时间修改到 30 天之后
  • 点击顶部菜单栏 Help -> Register 查看剩余时间
  • 重启 IDEA,再次查看剩余时间,破解补丁会重置试用时间为 30 天

执行完以上步骤就,恭喜你现在可以开始使用 IDEA 开发桌面应用程序了。

破解补丁不仅适用于 IntelliJ IDEA,还适用于 Jetbrains 其他系列产品:AppCode 、 CLion 、 DataGrip 、GoLand 、PhpStorm 、PyCharm 、Rider 、RubyMine 、WebStorm。

以上是关于 Compose for Desktop 所需要的工具配置,Compose for Android 的环境配置非常的简单,从官网下载并安装 Android Studio 2020.3.1 Canary 14 然后在模板列表中选择 Empty Compose Activity ,等待 AS 构建完就可以开始使用了。

破解补丁分析

IntelliJ IDEA 是 Jetbrains 旗下的产品,Jetbrains 的产品会允许你试用 30 天,所以作者 pengzhile 写了一个插件,无限重置 30 天试用期,从而达到永久激活 IDEA 的目的。(PS: 如果 IntelliJ IDEA 版本有更新,千万不要升级)。

首次运行 IntelliJ IDEA 会弹出一个注册框,勾选 Evaluate for free , 点击 Evaluate 会在 /Users/用户名/Library/Application\ Support/JetBrains/IntelliJIdea2021.1/eval/ 目录下生成 idea211.evaluation.key 文件,这个文件记录当前的时间戳,作者会读取当前文件内容,重新写入新的时间戳,重置 30 天试用期,核心源码如下:

src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java

Resetter.reset(Resetter.getEvalRecords());
  • 调用 Resetter.getEvalRecords() 会遍历 /Users/用户名/Library/Application\ Support/JetBrains/IntelliJIdea2021.1/ 文件夹下面的内容
  • 调用 Resetter.reset() 方法,重新写入新的时间戳

接下里我们一起来看一下 Resetter.getEvalRecords() 方法的实现。

src/main/java/io/zhile/research/intellij/ier/common/Resetter.java

protected static File getEvalDir() {
String configPath = PathManager.getConfigPath();

return new File(configPath, "eval");
}

public static List<EvalRecord> getEvalRecords() {
List<EvalRecord> list = new ArrayList<>();

File evalDir = getEvalDir();
if (evalDir.exists()) {
File[] files = evalDir.listFiles();
if (files == null) {
NotificationHelper.showError(null, "List eval license file failed!");
} else {
for (File file : files) {
if (!file.getName().endsWith(".key")) {
continue;
}

list.add(new LicenseFileRecord(file));
}
}
}
.......

调用 getEvalRecords() 方法获取 /Users/用户名/Library/Application\ Support/JetBrains/IntelliJIdea2021.1/eval/ 文件夹下以 .key 结尾的文件,然后重写里面的时间戳。

src/main/java/io/zhile/research/intellij/ier/common/LicenseFileRecord.java

public void reset() throws Exception {
if (!FileUtil.delete(file)) {
throw new Exception("Remove " + type + " failed: " + file.getAbsolutePath());
}

try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(file))) {
dos.writeLong(~System.currentTimeMillis());
}
}

Compose for Android or Desktop 示例

在文章开头讲述了,Compose 是由 Kotlin 开发的 UI 工具包,Android 和 桌面应用程序之间大部分 UI 代码是共享的,也就是说在 Android 上使用的部分 UI 组件,同样也适用于桌面应用程序开发。如下图所示。

如上图所示 「创建 Button」核心的代码都是一样的, 如果你之前没有了解过 Compose, 上面的代码可能觉得很陌生,可以先忽略,只需要知道 Android 和 桌面应用程序之间大部分 UI 代码是共享的即可。

参考文章


全文到这里就结束了,如果有帮助 点个赞 就是对我最大的鼓励

代码不止,文章不停

欢迎关注公众号:ByteCode,持续分享最新的技术



推荐文章:

致力于分享一系列 Android 系统源码、逆向分析、算法、翻译、Jetpack 源码相关的文章,在技术的道路上一起前进

Android10 源码分析

正在写一系列的 Android 10 源码分析的文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,如果你同我一样喜欢研究 Android 源码,可以关注我 GitHub 上的 Android10-Source-Analysis

算法题库的归纳和总结

由于 LeetCode 的题库庞大,每个分类都能筛选出数百道题,由于每个人的精力有限,不可能刷完所有题目,因此我按照经典类型题目去分类、和题目的难易程度去排序。

  • 数据结构: 数组、栈、队列、字符串、链表、树……
  • 算法: 查找算法、搜索算法、位运算、排序、数学、……

每道题目都会用 Java 和 kotlin 去实现,并且每道题目都有解题思路,如果你同我一样喜欢算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:Leetcode-Solutions-with-Java-And-Kotlin

精选国外的技术文章

目前正在整理和翻译一系列精选国外的技术文章,不仅仅是翻译,很多优秀的英文技术文章提供了很好思路和方法,每篇文章都会有译者思考部分,对原文的更加深入的解读,可以关注我 GitHub 上的 Technical-Article-Translation

评论