文章目录
前言
首先说一下这个软件修复的背景。 我是小说迷。 无意中发现了这位前辈做的软件。 经过一段时间的使用,我觉得这个软件非常好。 后来由于某些原因,这位前辈停止了更新,并封印了该软件。 。 该程序在github上开源:。 后来硬着头皮研究代码,改代码,编译。
如果你不想看下面的小故事,想直接获取软件包进行自助,链接如下:可以的话给个star吧。
1、需要解决的问题?
本软件是小说阅读器的PC版。 该软件已更新至5.0版本。 支持的功能如下:
三天后,软件作者决定停止更新和维护这款开源软件,同时对该软件进行了封存。 进入软件后网游源码编译修复,直接出现报警弹框,然后只能退出程序。 事实上,很难正常使用。 为了继续正常使用这个软件,就开始了阅读源码、修改源码、编译、打包的过程。
二、具体步骤 1.下载源码
如果访问github时网速较慢网游源码编译修复,可以直接下载源码的zip包,不带版本控制信息。 修改后的源码已经上传到我的github了。 我只是想知道源码改动或者直接编译打包。 可以从这个仓库地址下载源码:
ps:下面贴出的链接都是原仓库地址。
如果想保留版本控制相关信息,比如仓库信息、提交更新日志等,可以通过git下载源码:
git clone https://github.com/unclezs/uncle-novel.git
2.问题分析问题1:如何禁用手动软件更新?
我还是用C/C++做嵌入式开发。 我从来没有做过任何Java应用程序和Android APP的开发。 临时在网上了解到一些信息。 我赶紧上手,陷阱之路就开始了。
一开始的想法是直接更改软件中发起版本检测的源代码并获取更新,但后来发现不可能,因为软件运行后,首先运行的是一个启动器,并且这个启动器会主动进行版本检测和更新。 更新后,本地的 app.jar 包将替换为远程存储库中托管的更新文件。
再次查看源码,发现源码依赖于一个手动更新模块com.unclezs:jfx-launcher。 经过多方查找,我了解到这个模块源自另一个开源软件。 github仓库地址为:GitHub-unclezs/jfx-launcher :OpenJFX应用启动器,支持热更新。 使用模块化API动态加载模块启动,支持动态改变模块化破坏规则。 ,这又降低了工作难度。 另一种思路,直接拉取这个jfx-launcher的源码,注释掉jfx-launcher源码中手动检测更新并拉取更新文件的入口,然后编译成jar包替换到打包下uncle-novel路径,重新打包。 尝试了一下,毫无疑问失败了[茫然]。 这7天掉了不少头发,哈哈。
2、问题2:为什么更换jfx-launcher的jar包后不起作用?
继续看源码的编译过程,并在百度上搜索,又得到了几个知识点:
(1)uncle-novel使用gradle编译。 编译时,会从远程仓库拉取编译依赖的jar包及其他相关内容;
(2)软件作者将uncle-novel依赖的所有jar等资源托管在MavenRepository中;
再次搜索,找到了远程托管仓库MavenRepository。 地址是:,其实我没有权限发布这个远程托管仓库(有权限的话就不知道具体步骤了)。
根据之前的研究,我明白那些依赖的jar包肯定是下载到本地的,但是不知道具体路径。 我又在百度上搜索了解相关内容,又到了一个知识点:
(1)使用gradle编译时,会将依赖的jar包下载到本地的.gradle文件夹下,默认在用户目录下;
比如我的ubuntu中,这个目录是/home/ts/.gradle/; 在我的 Windows 中,该目录是 C:Usersts-lys.gradle。 这里的ts或者ts-lys是当前登录用户的名字。
然后,通过在该目录中搜索,找到jfx-launcher-1.1.9.jar jar包所在路径,然后将更改后重新编译的jfx-launcher包替换到对应目录中,并保持名称一致。
3.问题3:如何阻止jfx-launcher在本地拉取更新文件?
继续看jfx-launcher的源码,了解到jfx-launcher的主窗口是通过继承java中的Application类来实现的,所以运行时的入口函数应该是main函数,而这部分代码在Launcher的源代码中也听到了。 java文件中,Launcher类继承了Application类,并重绘了它的一些功能。 Application类中的main函数经过一系列的内部初始化,最终调用start函数。 Launcher类源代码中重新绘制了start函数。 在start函数中调用startApplication函数。 startApplication函数中调用checkForUpgrade函数来检查更新升级信息。 checkForUpgrade函数调用syncManifest函数用于同步manifest并同步更新到本地。
我的做法是注释掉syncManifest函数中的大部分实现代码,直接返回false,即没有更新,并添加一些调试日志,改动如下:
/**
* 同步manifest
*
* @return true 有更新
*/
public boolean syncManifest() {
ui.setPhase("liangys1115说肯定没有新版本...");
// try {
// log.log(Level.INFO, "liangys1115获取远程配置文件:{0}", manifest.remoteManifest());
// ui.setPhase("liangys1115正在检测是否有新版本...");
// Manifest remoteManifest = Manifest.load(manifest.remoteManifest());
// if (!checkNew(remoteManifest)) {
// ui.setPhase(String.format("liangys1115当前已是最新版本:%s", manifest.getVersion()));
// this.newVersion = false;
// return false;
// }
// // 显示更新内容
// ui.initUpdateView();
// ui.setPhase(String.format("liangys1115检测到新版本:%s", manifest.getVersion()));
// Path localManifest = manifest.localManifest();
// if (Files.notExists(localManifest)) {
// Files.createDirectories(localManifest.getParent());
// }
// Files.writeString(manifest.localManifest(), remoteManifest.toJson());
// manifest = remoteManifest;
// // 显示更新内容
// if (!manifest.getChangeLog().isEmpty()) {
// log.log(Level.INFO, "liangys1115更新内容:{0}", manifest.getChangeLog());
// ui.setWhatNew(manifest.getChangeLog());
// }
// return true;
// } catch (Exception e) {
// // 忽略更新失败
// log.log(Level.SEVERE, "liangys1115更新失败", e);
// }
return false;
}
4、问题四:如何严格禁止软件在主窗口弹出报警?
继续看源码,通过软件运行时报警弹窗的显示内容,在uncle-novel源码中全局搜索,找到代码位置:
看这部分代码,做过桌面应用的攻城狮应该都知道,这里实现的是显示一个模式对话框(ModalBox),只有取消一键选项,结束后直接退出程序(stopApp)点击。
注释掉几行代码,如下:
/**
* 启动
*
* @param stage 舞台
* @throws Exception 启动失败
*/
@Override
public void start(Stage stage) throws Exception {
super.init();
super.start(stage);
initStage(stage);
stage.show();
// ModalBox.none().message("bye~").title("bye~").cancel("bye~").showAndWait();
// App.stopApp();
// 检测更新
// UpdateUtils.checkForUpdate(stage);
// MixPanelHelper.event(EVENT_LAUNCH);
log.trace("启动耗时:{}ms", (System.currentTimeMillis() - LAUNCH_TIME));
}
下一步是重新编译、打包、运行自检。
3.配置编译打包环境编译环境要求
windows(我用的是win10)
OpenJDK11
包装环境要求
执行程序4j
4.源码编译
ps:不知道用什么IDE工具来开发java等桌面应用程序。 踩了这么多坑之后,我不想再踩配置IDE的坑了,所以干脆从命令行开始。
4.1 重新编译jfx-launcher
首先需要cd到对应的源码目录,然后执行命令:
./gradlew.bat build
编译成功后如右图:
编译成功后,将对应的jar包替换到.gradle路径下。
4.2 重新编译uncle-novel
./gradlew.bat build
编译成功后如右图:
4.3 包装uncle-novel
Windows中打包依赖于exe4j程序,打包前需要安装并配置环境变量。
./gradlew.bat packageWin64
打包成功后如图:
源码的app/build/packager/目录下有对应的包文件,将压缩包复制到自己的目录下,解压后运行Uncle novel.exe。
总结
如果您对uncle-novel的补丁步骤感兴趣,可以交流。