tsdm_client icon indicating copy to clipboard operation
tsdm_client copied to clipboard

F-Droid

Open linsui opened this issue 1 year ago • 2 comments

请问可以发布到 F-Droid 吗?

linsui avatar Jul 17 '24 06:07 linsui

可以的,只是不知道F-Droid能不能发布内容基本是中文的应用,一些内容还需要登录。

看了下收录规则,需要加一些配置,可能要等等,目前在准备1.0版本。

realth000 avatar Jul 17 '24 15:07 realth000

只是不知道F-Droid能不能发布内容基本是中文的应用,一些内容还需要登录。

这些都不是问题

看了下收录规则,需要加一些配置,可能要等等,目前在准备1.0版本。

好,感谢,需要帮助可以找我 :+1:

linsui avatar Jul 17 '24 16:07 linsui

1.0.0 已经发布了,需要我来帮忙打包吗?

linsui avatar Dec 13 '24 02:12 linsui

可以的,先谢过了。

realth000 avatar Dec 13 '24 03:12 realth000

构建出来了

现在还有几个问题

  1. flutter_avif 需要单独构建,但是上游的仓库里没有 Cargo.lock https://github.com/yekeskin/flutter_avif/tree/main/rust 为了保证构建的稳定性,需要你生成一个 Cargo.lock 放在仓库里,最好是将 flutter_avif 作为 submodule 放在这里。
  2. super_native_extensions 使用 cargokit 构建 rust 库,这个 cargokit 始终使用最新版 rust,需要 patch 一下让它用一个固定的版本。
  3. 如果我们想要以可重复构建的方式发布,那么我们要确保工具链的版本一致,主要是 rust 和 flutter,而且你也需要用同样的方式构建 flutter_avif
  4. 为了自动更新,需要能从仓库里读取 flutter 的版本,https://github.com/realth000/tsdm_client/blob/master/.github/workflows/release_build.yml#L9 这里需要设置为一个具体的版本。

linsui avatar Dec 13 '24 17:12 linsui

辛苦。

  1. 好的,那我fork一个flutter_avif补上lock吧,这个好说。
  2. super_native_extensions是因为flutter_quill而带进来了,我想先试着去除super_native_extensions的依赖试试。
  3. 这个确保工具链一致的话,flutter版本可以按4.里的在release workflow里写个固定值。rust的话需要怎么做?只指定MSRV恐怕不行吧,可否给个建议,目前看只需要在flutter_avif里写死。
  4. 这个没问题,写死就行。但如果要从release_build.yaml里确定当前使用的flutter版本的话,是否这个yaml的格式(指第九行的这个env)以后就不能重命名或者删除了?

realth000 avatar Dec 13 '24 18:12 realth000

  1. 倒不需要 fork,构建之前放进去就行,类似 https://github.com/maelchiotti/LocalMaterialNotes/blob/main/scripts/isar/fdroid_build_isar.sh
  2. 如果 Android 端不需要 super_native_extensions 那还是去掉更好 :+1:
  3. 写在哪里都行,只要能读到,比如放在一个 rustVersion.txt 文件里,或者 https://github.com/localsend/localsend/blob/main/app/rust-toolchain.toml 这种标准格式
  4. 如果这个改了脚本读不到了,构建失败我修一下就行

linsui avatar Dec 13 '24 18:12 linsui

那仓库里加个flutter_avif的submodule,然后在构建之前把Cargo.lockrust-toolchain.toml复制进去submodule里就行了吧。

有个疑问,看https://github.com/maelchiotti/LocalMaterialNotes/blob/main/pubspec.yaml 里依赖并没有使用本地submodule的isar,这样也行么? 会导致github和fdroid产物使用的依赖不相同吧。

realth000 avatar Dec 13 '24 18:12 realth000

Cargo.lock 复制进去就行,rust-toolchain.toml 放哪里都可以。

这个项目使用了和 F-Droid 同样的方式替换 isar https://github.com/maelchiotti/LocalMaterialNotes/blob/main/.github/workflows/release.yaml#L108 就是把构建好的 .so 文件放到 pub cache 里,如果有别的方式也可以。

linsui avatar Dec 13 '24 19:12 linsui

不对,应该还是要fork一份flutter_avif,本地已经在用submodule的方式管理flutter_bbcode_editor了,这个库会保持最新版本而且更新频率比较高。如果直接用上游的flutter_avif作为submodule,在git submodule update的时候也会把flutter_avif更新到上游版本,时间长了可能会遇到BREAKING CHANGE和其他问题导致fdroid上构建不出来。

flutter_avif这个库用到的功能不多,而且目前看没有bug,感觉还是fork一份把版本定死好些,可以顺便把Cargo.lock放仓库里。

哦哦没注意,那这样看看是否可行:

  1. fork一份 flutter_avif,作为submodule加进来。
  2. 在flutter_avif的根目录加上Cargo.lockrust-toolchain.toml,并且去掉预编译的Android libs
  3. 把pubspec.yaml里依赖的flutter_avif改为本地submodule的。
  4. 在编译的流程里加上编译上述so的步骤,这个步骤可以写成dart脚本放到项目根目录的./scripts里,在github actions里和fdroid里都用这个脚本编译。

这样随着项目依赖更新,比如flutter版本升级了,如果构建出了问题,报错的地方依次是:本地开发环境 -> github actions -> fdroid,能尽早修复问题。

realth000 avatar Dec 13 '24 19:12 realth000

试了一下,没法在Windows上编译Android libs,它依赖的底层库配的meson不支持,没考虑路径的事情,上游host的repo里是交叉编译出来的,虽然上游的上游用gnu-toolchain看着能编,,

只能采用这种策略:

  • 仓库里自带的Android libs不能去掉,否则在本地Windows上开发的时候无法编译安卓
  • 只能在linux上编译Android libs,编译的时候需要安装rust/meson/ninja/cargo-ndk
  • 除了Android以外的其他平台依然使用预编译的libs
  • github actions里保持只使用linux编译android,而且不用预编译的二进制。

只是flutter_avif这个repo有500MB,而且编译的话不知道要花多久,有点难受。

realth000 avatar Dec 13 '24 20:12 realth000

以及,这种策略会导致本地编译的安卓app和release里正式发布的app在构建流程上不一样,似乎没更好的办法了

realth000 avatar Dec 13 '24 20:12 realth000

算是编出来了(闭眼)

https://github.com/realth000/tsdm_client/actions/runs/12324237750

要编flutter_avif的时候跑下这个脚本就行,

编译需要的依赖在test_build.yml#build-android

realth000 avatar Dec 13 '24 23:12 realth000

感谢

https://github.com/realth000/tsdm_client/blob/ea6d3b2d68a523dd1020be8cfea8fce3875e6c8c/.github/workflows/test_build.yml#L126 这里加上版本和 --locked 比较好 cargo install [email protected] --locked 不过应该不影响可重复构建。

https://github.com/realth000/tsdm_client/blob/master/android/app/build.gradle#L36 这里用的 ndk 是 r27,https://github.com/realth000/tsdm_client/blob/ea6d3b2d68a523dd1020be8cfea8fce3875e6c8c/.github/workflows/test_build.yml#L119 这里最好也用同一个版本。

F-Droid 的每个 abi 要有不同版本号,需要这样设置一下 https://github.com/nfcim/nfsee/blob/master/android/app/build.gradle#L105

linsui avatar Dec 14 '24 06:12 linsui

5d48143 改好了,还有别的问题嘛。

FDroid第一次正式构建最早也得等到下一个版本了吧(1.1.0或者1.0.1),1.0是赶不上了,目前刚升了flutter版本,有些地方需要适配,而且有几个bug要解。

realth000 avatar Dec 14 '24 07:12 realth000

还有两个问题,一个是应用内更新,这个是自动检查更新的吗?F-Droid 要求自动检查更新要默认关闭。另一个是可重复构建,我需要你的 apk 测试。这些问题解决之后就等下一个版本啦。

https://gitlab.com/linsui/fdroiddata/-/commit/1a0a79417ca411f0a5f5dea5963d4217936a81e8 这是目前的 F-Droid metadata。

linsui avatar Dec 14 '24 09:12 linsui

检查更新只能是用户手动的,而且只能下载到download/tsdm_client里,需要用户手动安装。

重复构建的话,是需要跑一个action把apk跑出来么?

realth000 avatar Dec 14 '24 09:12 realth000

手动的就没问题。可重复构建有新版本之后从 release 下载 apk 了,现在需要从 master 构建的 apk。

linsui avatar Dec 14 '24 09:12 linsui

可以等下这里编完

https://github.com/realth000/tsdm_client/actions/runs/12329062173

realth000 avatar Dec 14 '24 10:12 realth000

assets/flutter_assets/packages/flutter_avif_web/web/avif_decoder.wasm, assets/flutter_assets/packages/flutter_avif_web/web/avif_encoder_bg.wasm, assets/flutter_assets/packages/quill_native_bridge_linux/assets/xclip 这三个文件 Android 上需要吗?我构建的时候都删掉了。

linsui avatar Dec 14 '24 15:12 linsui

应该不需要,前两个是web上用的,第三个是linux的

realth000 avatar Dec 14 '24 15:12 realth000

这是目前的 diff tsdm_client-arm64_v8a.apk.html.zip

linsui avatar Dec 14 '24 16:12 linsui

其中很大一部分来自 gitsumu。对于 flutter 它记录了分支名,所以检出特定版本会导致出现 user-branch。而对于应用仓库 https://github.com/realth000/gitsumu/blob/b3a602b8fdf1067c3b8663c2d1ded45d0204f9b3/lib/src/gitsumu.dart#L125 这个命令得到的提交数和分支以及检出的提交都没关系,是整个仓库里的提交数,这导致只要仓库里有新提交这个值就会变。

linsui avatar Dec 19 '24 19:12 linsui

需要在fdroid构建的版本中不记录flutter版本么? checkout过去的话,在fdroid环境以外也可以使用相同版本的flutter吧。

后者记录当前仓库提交数也是为了排查问题的时候能定位环境,按说fdroid和github action里这部分值都一样。

上述所有记录的构建环境信息都是为了排查问题的时候好定位,对程序逻辑和运行状态没有影响。

realth000 avatar Dec 19 '24 21:12 realth000

flutter 的问题还好解决,checkout 不行但 reset 可以让 branch 是 stable。仓库提交数就可能不能这么解决了,即使主分支 reset 了,其他分支的提交也会计入。这个值和仓库状态有关但和检出的提交或者分支无关。

linsui avatar Dec 20 '24 06:12 linsui

这么说,是上游gitsumu的bug了,这个commit数本意是计算当前分支一共提交了多少次。 如果在上游里把commit数改为仅计算当前分支累积提交次数,是否能认为后半部分问题就解决了?

或者,在fdroid构建的版本里去掉下图中高亮的内容,是不是上述两部分内容就都修复了?

Screenshot_2024-12-20-16-04-37-271_kzs.th000.tsdm_client-edit.jpg

还有两件事:

  1. 如果fdroid构建的版本里去除上述内容,可否在相同页面里加一个当前下载渠道是fdroid的信息?这会违反fdroid的政策不?
  2. fdroid构建出的apk签名不一样的话,也没法覆盖安装(升级)github 上编译的版本,是不是把应用内更新功能去掉(或者禁用)比较好,反正下载了也装不上。

realth000 avatar Dec 20 '24 08:12 realth000

如果在上游里把commit数改为仅计算当前分支累积提交次数,是否能认为后半部分问题就解决了?

是的,只要这个值是可复现的就行。

我目前还是在尝试让整个应用实现可重复构建,这样就会直接发布你签名的 apk。如果不能实现可重复构建那么这些就都不是问题了,那么

如果fdroid构建的版本里去除上述内容,可否在相同页面里加一个当前下载渠道是fdroid的信息?这会违反fdroid的政策不?

这个没问题

fdroid构建出的apk签名不一样的话,也没法覆盖安装(升级)github 上编译的版本,是不是把应用内更新功能去掉(或者禁用)比较好,反正下载了也装不上。

应用内更新需要默认禁用,可以加一个启动屏幕询问用户是否想要应用内更新。

目前可重复构建的问题解决了上面构建信息不一致的问题之后,libapp.so 应该就是相同的了,但是还要解决那三个打包在 apk 里的二进制文件的问题。除此之外,avif 库不知道为什么也有点差异。

linsui avatar Dec 20 '24 08:12 linsui

哦哦,那我把gitsumu导致的计算本仓库总提交数的问题修一下改成当前分支的。 后半部分记录flutter的信息的问题可能要按照之前说的,麻烦在fdroid的构建流程里reset过去而不是checkout。

多的那三个二进制我刚刚才发现apk里有,只用libchecker看不到。 这三个文件应该是avif和native_bridge这两个包默认当成所有平台的assets了,三个文件加起来快3MB了,很浪费空间。

正好这两个包都是submodule引入的,好改:

  • 目前不打算支持web平台,avif里那个web文件夹直接从submodule里删掉。
  • quill_native_bridge目前用不到,应该能直接从依赖里去掉。

至于应用内更新,功能如之前所说只是一个需要用户手动点击才触发的检测github release里最新版,然后下载到download目录里的功能,这样的功能加不加询问弹窗效果一样吧?都要用户手动触发。

题外话:

有点不理解,不应该反过来么,不能重复构建时才迫不得已用github构建的二进制产物,可以重复构建(fdroid拉源码构建的产物与原仓库自己构建的产物相同)才能拉源码并使用不一样的签名发布(只有签名不同,应用功能完全相同的)产物吧。

realth000 avatar Dec 20 '24 12:12 realth000

F-Droid 的可重复构建不能这样自动回退,IzzySoft 的存储库倒是使用了类似的逻辑,在不能可重复构建的时候也会发布上游的二进制。

F-Droid 的流程是,如果采用可重复构建,那就只能发布上游 apk,如果不采用可重复构建,那就自己签名。采用可重复构建的应用如果新版本没法可重复构建就不能发布,直到可重复构建通过才行。因为不同签名的应用之间不能互相更新所以不能更换签名。F-Droid 发布的应用都要经过 F-Droid 构建,可重复构建只是采用了上游的签名。

于 2024年12月20日 GMT+08:00 20:18:21,realth000 @.***> 写道:

哦哦,那我把gitsumu导致的计算本仓库总提交数的问题修一下改成当前分支的。 后半部分记录flutter的信息的问题可能要按照之前说的,麻烦在fdroid的构建流程里reset过去而不是checkout。

多的那三个二进制我刚刚才发现apk里有,只用libchecker看不到。 这三个文件应该是avif和native_bridge这两个包默认当成所有平台的assets了,三个文件加起来快3MB了,很浪费空间。

正好这两个包都是submodule引入的,好改:

  • 目前不打算支持web平台,avif里那个web文件夹直接从submodule里删掉。
  • quill_native_bridge目前用不到,应该能直接从依赖里去掉。

至于应用内更新,功能如之前所说只是一个需要用户手动点击才触发的检测github release里最新版,然后下载到download目录里的功能,这样的功能加不加询问弹窗效果一样吧?都要用户手动触发。

题外话:

有点不理解,不应该反过来么,不能重复构建时才迫不得已用github构建的二进制产物,可以重复构建(fdroid拉源码构建的产物与原仓库自己构建的产物相同)才能拉源码并使用不一样的签名发布(只有签名不同,应用功能完全相同的)产物吧。

-- Reply to this email directly or view it on GitHub: https://github.com/realth000/tsdm_client/issues/2#issuecomment-2556897267 You are receiving this because you authored the thread.

Message ID: @.***>

linsui avatar Dec 20 '24 14:12 linsui

现在应该是ok了,

然而github action里linux上拉不到sqlite,排查了一晚上感觉是镜像的问题,这周估计版本出不来了。

realth000 avatar Dec 20 '24 23:12 realth000