repo
我希望在我的设备上拥有以下自由:The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this. F-Droid 帮不上忙。我需要自己构建应用。我无法弄清楚如何正确设置 fdroid 构建服务器以复用他们的构建脚本而不出现错误,并且我希望获得更可重复的结果,因此我现在有了我的 nix 构建脚本。
本仓库包含用于 android 应用程序、基于 android 的操作系统以及 gradle/maven/openjdk 完整源代码引导的构建脚本。
本仓库实现了一个用于 gradle 和 maven 的构建系统,以用源代码构建的版本替换预构建的 jar。当然,用源代码构建的版本仍然有其自身的预构建依赖 jar。但现在可以逐步朝着完全从源代码构建的目标努力。
对于可能符合再分发安全要求的子集,请使用 fdroid-repo-oss.
android 设备 rom 配置
修改包括 kernelsu 和 pixel8 pro pwm mod。
命令示例:
nix build -L --max-jobs 4 .#los.enchilada.ota -o enchilada.zip
nix build -L --max-jobs 4 .#los.enchilada.img -o enchilada-img.zip
nix build -L --max-jobs 4 .#los.enchilada_derpfest16.img -o enchilada-img.zip
nix build -L --max-jobs 4 .#losNoCcache.enchilada.img -o enchilada-img.zip
nix build -L --max-jobs 4 .#los.enchilada_mainline.img -o enchilada_mainline-img.zip
nix build -L --max-jobs 4 .#gos.husky.releaseScript -o release && ./release ./keys-husky
nix build -L --max-jobs 4 .#gosNoCcache.husky.releaseScript -o release && ./release ./keys-husky
nix build -L --max-jobs 4 .#gos.tangorpro.releaseScript -o release && ./release ./keys-tangorpro
nix build -L --max-jobs 4 .#gosNoCcache.tangorpro.releaseScript -o release && ./release ./keys-tangorpro
建议在刷入新版本时,在开发者选项中开启 OEM 解锁,以避免设备变砖。
生成密钥/更新密钥:
nix build -L .#gos.husky.generateKeysScript -o generate-keys && ./generate-keys ./keys-husky
nix build -L .#gos.tangorpro.generateKeysScript -o generate-keys && ./generate-keys ./keys-tangorpro
构建内核(仅用于调试和开发):
# GrapheneOS husky (Pixel 8 Pro) kernel dist files
nix build -L .#grapheneos-husky-kernel -o husky-kernel-dist
# GrapheneOS tangorpro (Pixel Tablet) kernel dist files
nix build -L .#grapheneos-tangorpro-kernel -o tangorpro-kernel-dist
ForkGram 及其他 Android 应用程序
构建 APK(未签名):
nix build .#apk_forkgram -o forkgram
# APK at forkgram/forkgram.apk
生成签名密钥
keytool -genkeypair -v \
-keystore my-release-key.jks \
-alias releasekey -keyalg RSA -keysize 4096 -validity 10000 \
-storepass password \
-dname "CN=Your Name,O=Your Org,C=US"
注意:现代 JDK 创建的 PKCS12 密钥库同时使用密钥库密码作为密钥密码 — 请勿单独传递
-keypass。
使用您的密钥重新签名 APK
nix run .#apk_forkgram.signScript -- \
my-release-key.jks \
--ks-pass password \
--out forkgram-signed.apk
nix run -L .#apk_zotero-android.signScript -- \
my-release-key.jks \
--ks-pass password \
--out zotero-signed.apk
NIXPKGS_ALLOW_UNFREE=1 nix run --impure .#apk_meshtastic.signScript -- \
my-release-key.jks \
--ks-pass password \
--out meshtastic-signed.apk
如果省略 --ks-pass,脚本将交互式地提示。
验证签名:
apksigner verify --print-certs forkgram-signed.apk
构建未签名的 F-Droid 仓库
nix build .#fdroid-repo -o fdroid-repo
# Unsigned APK staging at fdroid-repo/unsigned
对于可能可安全再分发的子集,请使用 fdroid-repo-oss:
nix build .#fdroid-repo-oss -o fdroid-repo-oss
使用您的密钥对 APK 和 F-Droid 仓库进行签名
nix build .#sign-fdroid-repo -o sign-fdroid-repo
./sign-fdroid-repo/bin/sign-fdroid-repo my-release-key.jks \
--ks-pass password \
--out fdroid-repo-signed
或者使用 nix run:
NIXPKGS_ALLOW_UNFREE=1 nix run --impure .#sign-fdroid-repo -- \
my-release-key.jks \
--ks-pass password \
--out fdroid-repo-signed
签名后的仓库输出位于 fdroid-repo-signed/repo。
OSS 仓库签名(参见 fdroid-repo-oss 指南]:
nix build .#sign-fdroid-repo-oss -o sign-fdroid-repo-oss
./sign-fdroid-repo-oss/bin/sign-fdroid-repo-oss my-release-key.jks \
--ks-pass password \
--repo-url https://YOUR_USER.github.io/fdroid-repo-oss/repo \
--out fdroid-repo-oss-signed
别名行为是自动的(无需 --alias 标志):
- 默认:每个 APK 使用与其 appId/包名相同的密钥别名进行签名。
- 需要共享 Termux 签名的 Termux 系列应用(
com.termux、com.termux.styling、org.gnu.emacs)使用共享别名com.termux。 - Termux:X11(
com.termux.x11)使用其自身的com.termux.x11别名。 nix-on-droid(com.termux.nix)保留旧别名releasekey。
向现有密钥库添加缺失的密钥别名
使用辅助脚本为同一密钥库中新添加的 APK 创建别名:
nix run .#fdroid-keystore-update -- my-release-key.jks --ks-pass password --alias org.joinmastodon.android
nix run .#fdroid-keystore-update -- my-release-key.jks --ks-pass password --alias me.proton.android.lumo
您可以传递多个 --alias 标志。
如果省略 --alias,它将自动从 .#fdroid-repo 中发现 APK 包名,并使用与 sign-fdroid-repo 相同的映射自动确保所有必需的别名:
com.termux.nix->releasekeycom.termux,com.termux.styling,org.gnu.emacs->com.termuxcom.termux.x11->com.termux.x11- 其他所有 -> appId/包名
nix run .#fdroid-keystore-update -- my-release-key.jks --ks-pass password
对于 OSS 仓库,请改用 .#fdroid-keystore-update-oss(参见 fdroid-repo-oss 指南)。
需要帮助
-
在此仓库中发布可分发 Android 应用的 apk 预构建仓库
-
发布基于 grapheneos 的此操作系统的预构建 rom,且该 rom 不是 grapheneos。
开发
AGENTS - 本文档有助于 llm 更好地完成任务,对人类也可能有一定帮助。
更新
使用 update-nix-fetchgit 和 nvfetcher
锁定
$ fastboot erase avb_custom_key
$ fastboot flash avb_custom_key ./avb_pkmd.bin
$ fastboot reboot bootloader
LLM
本仓库是一个概念验证 / 玩具项目,因为代码质量目前受到 llm 的影响。
本仓库包含许多由 llm 生成的胶水代码。它们可能基于错误的假设编写,但碰巧能正常工作。
有时即使是简单的任务,它们也只是在消耗了大量算力后,通过丑陋且冗长的变通方法勉强完成。
我选择带有许多变通方法的丑陋且冗长的构建脚本,而不是预构建的二进制文件。
胶水代码可能由 llm 生成。只要它们能工作,这类代码就足够好了。这类代码通常不会以任何方式影响最终逻辑。例如,在打包 android 应用程序时,无论是以正确的方式还是以碰巧能工作的错误方式将文件复制到已弃用的文件夹结构中,对最终结果通常影响不大。
尽管如此,改进这些代码仍是一个目标。当资源可用时,这些代码应逐一被编写得更好的代码所替换。
免责声明
本仓库仅提供源代码。本仓库中构建脚本的源代码永远不会被执行,而是仅在人类大脑中被查看和推理。构建脚本的源代码仅用于演示目的,而非实际运行。描述构建应用程序可能性的源代码并不意味着该应用程序实际上正在被构建。源代码可能是一种表达方式,而非可用的工具。如果你从这里的源代码中获取了一个程序,该程序是由你创建的。
使用本仓库可能导致数据丢失、启动循环、设备变砖、因设备爆炸导致的伤害、SD 卡损坏、热核战争、诉讼、账户被封禁、资金损失,或因闹钟应用故障而被解雇。继续操作即表示你接受对可能出现的任何问题承担全部责任。
请注意,使用本仓库中的某些构建脚本可能会受到版权/商标持有者的禁止。尽管许多项目以自由软件许可证分发,但从源代码构建项目以创建可工作的二进制文件,即使对源代码的修改仅仅是为了尽可能接近预构建版本而进行的最小构建过程相关更改,也可能被明确禁止或处于灰色地带。更不用说向项目引入补丁了。项目可能明确要求对修改版本更改图标和标志。
本仓库中的一些 nix 文件会产生完全损坏或大部分损坏的结果。
todo
read
- https://xdaforums.com/t/improving-s-pen-sensitivity-under-lineage-roms.4752027/
- https://github.com/osbm/nixapks
- https://github.com/tiann/KernelSU/issues/2942#issuecomment-4078266560
- https://www.reddit.com/r/LineageOS/comments/1oaw2hj/comment/nkisxra/
- https://github.com/GrapheneOS/os-issue-tracker/issues/5225
todo
- 将 apkPath 占位符更改为 finalpackage
- 不稳定的哈希
"services.gradle": {
"org/versions/all": "sha256-hW92v8avCy/6usgQ3dc/6Zo59J/8GhhrLrWwevV/o5Q="
}