Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
213 commits
Select commit Hold shift + click to select a range
886e81a
Merge pull request #7 from lateautumn233/master
BigfootACA May 13, 2026
c0fc2a6
Merge pull request #8 from lateautumn233/fix
BigfootACA May 17, 2026
402779e
feat(vm): add iptables-based port forwarding support
lateautumn233 May 30, 2026
dd94627
feat(vm): add comprehensive port forwarding UI and management
lateautumn233 May 30, 2026
bea0c6f
fix(vm): refactor port forwarder for event-driven config sync
lateautumn233 May 31, 2026
fb9a5e7
Merge pull request #11 from lateautumn233/dnsmasq
BigfootACA Jun 10, 2026
ea020fe
Merge pull request #13 from lateautumn233/feat/port-forward
BigfootACA Jun 10, 2026
344e469
feat(daemon): create run directory with proper ownership on daemon start
lateautumn233 May 20, 2026
7643cb5
feat(agent): disable mthp lending for agent vm
lateautumn233 Jun 10, 2026
2550be2
Merge pull request #15 from lateautumn233/agentvm
BigfootACA Jun 10, 2026
c28c9b0
feat(settings): add option to clear logs before starting VM
lateautumn233 May 20, 2026
e128e4d
Merge pull request #16 from lateautumn233/log
BigfootACA Jun 10, 2026
b55f59f
chore(ci): skip re-compression when uploading artifacts
lateautumn233 Jun 11, 2026
37868a9
Merge pull request #17 from lateautumn233/ci
BigfootACA Jun 11, 2026
67aeb0f
feat(logs): add share functionality
lateautumn233 Jun 11, 2026
332501a
Merge pull request #18 from lateautumn233/ci
BigfootACA Jun 13, 2026
033ea83
rework(network): introduce bridge backends and VLAN networking
HuJK Jun 14, 2026
4a53b87
feat(boot): analyze disk images for direct kernel boot
HuJK Jun 14, 2026
87c4608
feat(download): keep disk imports running in background
HuJK Jun 14, 2026
5c019ac
fix(ui): handle IME insets and LXC source loading
HuJK Jun 14, 2026
64f5cbe
chore(build): add third-party tool build pipeline
HuJK Jun 14, 2026
de4e442
feat(vm boot): preflight disk compression check
HuJK Jun 14, 2026
102d74e
fix(source code)remove non-ascii code
HuJK Jun 15, 2026
e01b8f8
fix(UI): fix clipboard, add font
HuJK Jun 15, 2026
fee903d
feat(build): replace 7za with XZ for Java; source native prebuilts fr…
HuJK Jun 18, 2026
28fb9b0
(fix) bridge name detection; boot wati default to 2 sec; service proc…
HuJK Jun 21, 2026
3949be5
feat(migration): migrate legacy network and VM port-forward configs
HuJK Jun 21, 2026
161d6b0
feat(i18n): add Traditional Chinese (Taiwan) translation
HuJK Jun 21, 2026
1b984a5
ci(release): publish a debug-signed APK when no release key is set
HuJK Jun 21, 2026
8943195
fix(daemon): enforce single instance with a startup lock and force ta…
HuJK Jun 21, 2026
1f2c252
fix(ui): keep the network tool log below the status bar
HuJK Jun 21, 2026
6d00ec7
Merge pull request #20 from HuJK/master
BigfootACA Jun 21, 2026
f1034a9
fix(download): request POST_NOTIFICATIONS and fix stuck progress noti…
HuJK Jun 21, 2026
0fd2030
Merge pull request #22 from HuJK/master
BigfootACA Jun 22, 2026
7f17717
Update dev-release.yml
HuJK Jun 22, 2026
45045e1
gradle: upgrade sdk to 37
BigfootACA Jun 22, 2026
9dbef84
gradle: add x86_64 to abiFilters again
BigfootACA Jun 22, 2026
ccf71bc
VMEditStorageTab: use checkFileName instead of checkFilePath
BigfootACA Jun 22, 2026
ebb4e47
VMEditBaseTab: add showValidateFailed
BigfootACA Jun 22, 2026
729ed3d
VMEditNetworkTab: add more check failed strings
BigfootACA Jun 22, 2026
9f36d87
app: fix source warnings
BigfootACA Jun 22, 2026
146176a
values: remove unused strings
BigfootACA Jun 22, 2026
ab7e116
ServerContext: kill netbox when startup
BigfootACA Jun 22, 2026
3227b79
DaemonHelper: revert restartDaemon
BigfootACA Jun 22, 2026
158ae51
(fix)NativeProcess + fix state scan on wrong interface
HuJK Jun 22, 2026
874f410
lib: introduce LogHelper for fast diagnostic
BigfootACA Jun 22, 2026
ff69a03
VMVncDisplayActivity: add virtual gesture mouse
BigfootACA Jun 23, 2026
db14f50
VMVncPresentationActivity: add USB mouse and keyboard supports
BigfootACA Jun 23, 2026
c33a407
MainSettingsFragment: add config import and export supports
BigfootACA Jun 23, 2026
5d79a7b
VMEditBasicTab: add extra options supports
BigfootACA Jun 23, 2026
19e9093
VMEditBasicTab: add multiple hypervisor supports
BigfootACA Jun 23, 2026
944bd74
feat(display): add crosvm native display backend
lateautumn233 Jun 24, 2026
8198c1c
(feat) configurable swiotib
HuJK Jun 25, 2026
87ef459
fix(type disk path no longer jump to head)
Jun 25, 2026
78eca81
Merge pull request #25 from HuJK/master
BigfootACA Jun 26, 2026
692185b
Merge pull request #24 from lateautumn233/native-display
BigfootACA Jun 26, 2026
19e5c25
feat(mthp): add mode selection for lend mTHP allocation
lateautumn233 Jun 25, 2026
e0fbca8
Merge pull request #26 from lateautumn233/mthp
BigfootACA Jun 26, 2026
c13abfb
cpp: add libcompat for old android version supports
BigfootACA Jun 26, 2026
ce5f41a
Daemon: set proctitile to droidvmd
BigfootACA Jun 26, 2026
f23c5c0
assets: remove old hash.json
BigfootACA Jun 26, 2026
42e5f8e
DaemonHelper: fix stale pid file after reboot
BigfootACA Jun 26, 2026
4f51629
dialog_logs.xml: fix dialog button display
BigfootACA Jun 26, 2026
fee9819
LogHelper: add display delay
BigfootACA Jun 26, 2026
3b8fdd6
VMEventHandler: add see more button in vm exit dialog
BigfootACA Jun 26, 2026
7412d00
VMConsoleActivity: set toolbar menu button to white
BigfootACA Jun 26, 2026
6e6aa09
VMEditBasicTab: use single mTHP on Snapdragon 8 Gen 3
BigfootACA Jun 26, 2026
1cffe21
VMEditBasicTab: add strace debug option
BigfootACA Jun 26, 2026
671b3f4
assets: update prebuilts
BigfootACA Jun 27, 2026
36150b5
strings.xml: add missing zh-rTW translations
BigfootACA Jun 27, 2026
5c0149c
strings.xml: fix ASCII compatible in default strings.xml
BigfootACA Jun 27, 2026
8093cd0
VMEditBasicTab: disable debug trace by default
BigfootACA Jun 27, 2026
638961d
VirtualizationStepFragment: remove com.android.virt from failed string
BigfootACA Jun 27, 2026
cdfed1c
README.md: add GenieZone and KVM
BigfootACA Jun 27, 2026
b5e2cad
MainHomeFragment: set document url to github pages
BigfootACA Jun 27, 2026
3c32f7d
(fix) add lock=false on scsi drive
Jun 27, 2026
bde5d51
build: skip prebuilts submodule checkout in local build flow
Jun 27, 2026
1a61dbd
Merge pull request #27 from HuJK/master
BigfootACA Jun 27, 2026
c3e8ae2
DiskActionDialog: fix crash on target disk already exists
BigfootACA Jun 27, 2026
9c73307
StringUtils: refactor resolveUriPath for more uri document path parse
BigfootACA Jun 27, 2026
11b3330
network: route Linux-bridge guests through the VPN like local apps
HuJK Jun 29, 2026
83edaad
Merge pull request #29 from HuJK/master
BigfootACA Jun 29, 2026
79af345
vnc: use daemon-resolved LAN address for IPv4-wildcard binds
HuJK Jun 30, 2026
de10129
vm: record created_at timestamp on VM creation
HuJK Jun 30, 2026
495b9ed
(feat) adjust hugepage pool size at runtime, see vm memory allocated
HuJK Jun 30, 2026
e2c82af
feat(vm): add guest reboot support
lateautumn233 Jun 29, 2026
6c8c1f3
Merge pull request #30 from lateautumn233/guest-reboot
BigfootACA Jun 30, 2026
720f5fe
Merge pull request #31 from HuJK/master
BigfootACA Jun 30, 2026
b5f697f
StringUtils: resolveUriPath: add document parse
BigfootACA Jun 28, 2026
e0d512e
DiskInfoInfoTab: auto close when disk deleted
BigfootACA Jun 28, 2026
4012a47
VMEditGraphicsTab: add checks for native display
BigfootACA Jun 28, 2026
711168c
license.yaml: add new dependencies
BigfootACA Jun 29, 2026
e78b275
DiskAdapter: display cdrom icon on ISO files
BigfootACA Jun 29, 2026
c7fbaec
assets: update prebuilts
BigfootACA Jun 30, 2026
4e0d268
qcom.xml: add SM8735P
BigfootACA Jun 30, 2026
ea3b38b
(feat) UI update usage bar
HuJK Jun 30, 2026
60c5a63
Merge pull request #32 from HuJK/master
BigfootACA Jul 1, 2026
9128ebe
hugepage: acquire-mode buttons (v1/v2/v3) with per-mode spinners
HuJK Jul 5, 2026
35fc525
prebuilts: bump submodule to 2c31cec
HuJK Jul 5, 2026
fc0359b
(fix) fullscreen mode doesn't work correctly
HuJK Jul 5, 2026
a00a3d5
vm: route list auto-open-after-start through the same console picker …
HuJK Jul 5, 2026
1668dc3
network: watchdog re-asserts IP forwarding while an L3 bridge runs
HuJK Jul 5, 2026
e9f6bd5
ci: add non-ASCII and translation-completeness PR checks
HuJK Jul 5, 2026
67effe7
feat(disk): preserve compression when optimizing images
lateautumn233 Jul 4, 2026
2ccfec6
feat(disk): add compression option to convert dialog
lateautumn233 Jul 5, 2026
aecff06
feat(cpu): add CPU affinity support for disk operations
lateautumn233 Jul 5, 2026
88cd342
review (PR #34): rename VMConsoleRouter, relocate Try, harden shell c…
HuJK Jul 6, 2026
21cf41f
refactor(disk): address review feedback on CPU affinity and image utils
lateautumn233 Jul 6, 2026
4ce83d3
fix(cpu): format CPU frequency with decimal (SI) units
lateautumn233 Jul 6, 2026
6f19517
ci: enforce fmt() over complex string concatenation; convert existing…
HuJK Jul 6, 2026
d3cdc05
acquire btn update
HuJK Jul 6, 2026
80e04c8
hugepage: show acquire_stop_reason in the acquire-done bubble
HuJK Jul 6, 2026
836bdac
Merge pull request #34 from HuJK/master
BigfootACA Jul 7, 2026
7d80f8b
Merge pull request #36 from lateautumn233/disk
BigfootACA Jul 7, 2026
f8021e1
daemon: add SetAppConfig
BigfootACA Jul 3, 2026
5944195
MainSettingsFragment: add direct access to external storage
BigfootACA Jul 3, 2026
a182a64
LogsActivity: move logcat to daemon
BigfootACA Jul 4, 2026
71c8e43
BaseCheckStepFragment: trigger check on resume
BigfootACA Jul 5, 2026
98c45b1
PickerButtonWidget: fix button in RTL layout
BigfootACA Jul 5, 2026
fb7628d
TabSwipeHelper: fix swipe in RTL layout
BigfootACA Jul 5, 2026
e396992
StringUtils: resolveUriPath: try open target file to read path
BigfootACA Jul 5, 2026
d3ee31b
JsonUtils: add listToJSONArray and mapToJSONObject
BigfootACA Jul 5, 2026
37cc82f
LogHelper: fix event handle without vm_id
BigfootACA Jul 6, 2026
2d919f6
DiskStore: allow non unique disk name
BigfootACA Jul 6, 2026
998a133
ShareUtils: refactor and add shareFile
BigfootACA Jul 6, 2026
2fa35c9
utils: add BinaryUtils
BigfootACA Jul 6, 2026
f43bbcf
java: fix all deprecated api usage
BigfootACA Jul 7, 2026
aa1e0d6
AssetUtils: refactor libraries extract
BigfootACA Jul 7, 2026
4aa3efb
lib: add archive for tarball
BigfootACA Jul 7, 2026
d6245c6
AssetUtils: extractTarXz: refactor use TarReader
BigfootACA Jul 7, 2026
65753b0
daemon: add command vm_get
BigfootACA Jul 7, 2026
de60fd5
lib: add pkg for vm package
BigfootACA Jul 7, 2026
9e50164
daemon: add vm_export and vm_import for vm package
BigfootACA Jul 7, 2026
dd6a447
ui: add VMPkgExportActivity and VMPkgImportActivity
BigfootACA Jul 7, 2026
b4ccc68
HugePageActivity: add kernel module unload button
BigfootACA Jul 7, 2026
164cf26
SizeUtils: keep unit fallbacks inside the allowed unit list
HuJK Jul 12, 2026
45d9155
SwitchRowWidget: propagate setEnabled to the child switch
HuJK Jul 12, 2026
fed2e08
TextInputRowWidget: add fixed-unit (ti_unit) and hide-unit (ti_showUnit)
HuJK Jul 12, 2026
7a61e66
hugepage: add v10 CMA reservoir management
HuJK Jul 12, 2026
d70c445
hugepage: adapt to v11 module (movable->CMA levers, drop probe)
HuJK Jul 12, 2026
66b963c
Merge pull request #37 from HuJK/master
BigfootACA Jul 20, 2026
403c692
libcompat: move missing setTransactionCodeToFunctionNameMap to a15
BigfootACA Jul 10, 2026
6e6bf51
qemu: enable multithreaded TCG translation
qaz6750 Aug 11, 2026
699b579
qemu: preserve configured vCPU count with SMT
qaz6750 Aug 11, 2026
43fcc7a
feat: add multi-volume split for vm package export/import
lateautumn233 Jul 15, 2026
6be9f5a
Merge pull request #40 from lateautumn233/export_vm
BigfootACA Aug 16, 2026
8798602
Merge pull request #46 from qaz6750/test/qemu
BigfootACA Aug 16, 2026
05d6a5a
feat(uefi): move pflash to UEFI vars under boot section
sunflower2333 Aug 16, 2026
b9c291b
Merge pull request #48 from Droid-VM/pflash
sunflower2333 Aug 22, 2026
0f23937
licensing: say the GPLv3 out loud, and allow an upstream relicense
HuJK Aug 30, 2026
d8eb93c
ci: three source checks, and a build that can unit-test a class that …
HuJK Aug 30, 2026
2c42bcb
display: one framework behind the VNC and native screens
HuJK Aug 30, 2026
f6a7aae
disk: a Linux VM you can create, and overlays you can branch
HuJK Aug 30, 2026
d54b9e0
vm: the platform odds -- host CPU name, game mode, per-VM environment…
HuJK Aug 30, 2026
ba7030b
settings: a kernel module manager, and a huge-page panel that admits …
HuJK Aug 30, 2026
3c3d1a0
modules: nproc_guard is loaded with this app's uid, and reset after a…
HuJK Aug 30, 2026
36c3e66
network: ready-made networks, and a setup step that makes one
HuJK Aug 30, 2026
11fd880
agent: a headless VM that runs rescue actions, on one shared terminal…
HuJK Aug 30, 2026
ab496b2
cpu: a vCPU placement plan -- affinity, capacity and cluster, picked …
HuJK Aug 30, 2026
a1fb2ca
serial: ports as a peripheral category, with a USB ACM gadget pool be…
HuJK Aug 30, 2026
26c00de
sound: a virtio-snd card whose endpoints are named, and each one has …
HuJK Aug 30, 2026
43a7920
peripherals: camera and VPU entries for the virtio-media devices to come
HuJK Aug 30, 2026
f0ab0ff
vm: a protection mode whose guest RAM the host can still see
HuJK Aug 30, 2026
4df25e3
gunyah: features declare that they need dynamic memory sharing, and a…
HuJK Aug 30, 2026
16b2fc6
gpu: pre-share the gfxstream host arena before the guest boots
HuJK Aug 30, 2026
a314739
gpu: a guest-allocated VRAM pool, and none where the host can already…
HuJK Aug 30, 2026
bb23704
gpu: the guest pool grows -- preallocation, step and a grant ceiling
HuJK Aug 30, 2026
46d1c8f
gpu: raise udmabuf's per-handle size limit, fallback module included
HuJK Aug 30, 2026
5e232fe
display: pick the Vulkan that blits, and ask it whether it can
HuJK Aug 30, 2026
c9274b8
display: a VM has screens, and each screen names its own exporter
HuJK Aug 30, 2026
59313c1
vnc: take the hardware H.264 stream off the RFB port
HuJK Aug 30, 2026
42767d3
gpu: a worker cpuset, and real-time scheduling only on top of it
HuJK Aug 30, 2026
85e7fcf
gpu: the drm2kgsl route -- native context, its own pools, no host Vul…
HuJK Aug 30, 2026
446a4d0
gpu: the gfxstream route -- context type, BAR window and its VRAM knobs
HuJK Aug 30, 2026
4b29ad8
gpu: the venus route -- virglrenderer's Vulkan proxy and its transpor…
HuJK Aug 30, 2026
3fdc452
compat: provide path::__filename() on Android 14
HuJK Aug 31, 2026
dfab30b
vmpkg v2, add qcow2 backing tree support
HuJK Sep 2, 2026
2181881
vmpkg import: one decision per packaged network, and conflicts scoped…
HuJK Sep 2, 2026
a65d5e3
network: a stopped VM no longer blocks deleting the network it is on
HuJK Sep 2, 2026
a7dbbb9
network: register a new network with the daemon when it is saved, not…
HuJK Sep 2, 2026
b9242e7
prebuilts: point at the payload built from the accepted artifacts
HuJK Sep 2, 2026
9f24dac
fix size byte parse error
HuJK Sep 3, 2026
ac5dd59
archive: TarWriter emits GNU base-256 sizes past 12 octal digits
HuJK Sep 3, 2026
a4cd205
vm: Markdown notes, on their own page and rendered where the VM is shown
HuJK Sep 3, 2026
097137f
disk: decide a shared disk at start time, by run state, not in the ed…
HuJK Sep 3, 2026
fb1ded1
vm: ask before starting a VM whose kernel modules are not loaded
HuJK Sep 3, 2026
e3e41c2
editor: a stored option this build no longer offers resets the row in…
HuJK Sep 3, 2026
5d0ac39
fix five things a VM start can fail on without saying so
HuJK Sep 5, 2026
51083bf
boot: crosvm honours a custom EDK2 the way QEMU already does
HuJK Sep 6, 2026
b9414ae
Merge pull request #52 from Droid-VM/pr/3d-accel
BigfootACA Sep 6, 2026
668d05f
ui: the width no longer costs the GPU copy, so the warning goes
HuJK Sep 8, 2026
0540213
linux: a preparation step that fails leaves the VM created, and says …
HuJK Sep 8, 2026
e00b06d
app: the English language option asks for en-US, which is a locale th…
HuJK Sep 8, 2026
87d7fa8
ui: the custom-firmware hint outlived the backend it described
HuJK Sep 8, 2026
ee2f300
daemon: the SoC name table is read out of the daemon's own APK
HuJK Sep 8, 2026
3dbc8c6
modules: a module can say which kernels still need it
HuJK Sep 8, 2026
386ebf7
usb: pass a host USB device through to a VM, by hand or by rule
HuJK Sep 8, 2026
8b4379c
vm: a protected VM says, before it starts, when the guest cannot live…
HuJK Sep 8, 2026
20fa246
input: the physical keyboard types into the guest, and the drawn one …
HuJK Sep 9, 2026
333a932
prebuilts: the payload the APK ships is the one this branch built
HuJK Sep 10, 2026
11d9850
Merge pull request #54 from Droid-VM/pr/usb
BigfootACA Sep 12, 2026
6ce86a5
prebuilts: the payload carries the DisplayLink crash fix
HuJK Sep 12, 2026
292ce61
Merge pull request #56 from Droid-VM/wip/usb-fix-displaylink-crash
HuJK Sep 12, 2026
39739db
fix(ui): use native popup menu shadows
SuperKenVery Sep 16, 2026
d06949a
Add custom sponsorship URL to FUNDING.yml
BigfootACA Sep 21, 2026
0bac514
Include Snapdragon 7s Gen 3/4 and Snapdragon 8s Gen 3
maydoxx Sep 22, 2026
2ab775b
Merge pull request #64 from maydoxx/patch-1
sunflower2333 Sep 22, 2026
862e10b
Added Arabic
muhammadbahaa2001 Sep 23, 2026
49c052f
Merge pull request #60 from SuperKenVery/fix/popup_menu
BigfootACA Sep 24, 2026
ce2bed3
Merge pull request #65 from muhammadbahaa2001/master
BigfootACA Sep 24, 2026
ddf37b2
fix(vm): restrict pseudo-unprotected mode to crosvm Gunyah
MollySophia Oct 3, 2026
a203d33
Merge pull request #73 from MollySophia/fix/pseudo-unprotected-gunyah…
BigfootACA Oct 12, 2026
641d44e
daemon: stop closing adopted serial and input fds twice
Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: ['https://afdian.com/a/DroidVM']
9 changes: 7 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
workflow_dispatch:

concurrency:
group: build-${{ github.ref }}
Expand All @@ -13,6 +14,8 @@ concurrency:
jobs:
build:
runs-on: ubuntu-latest
env:
DROIDVM_PREBUILT_COMPRESSION_LEVEL: "9"

steps:
- name: Checkout repository
Expand Down Expand Up @@ -76,13 +79,15 @@ jobs:
echo "name=${ver}" >> "$GITHUB_OUTPUT"

- name: Upload debug APK
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: DroidVM-${{ steps.version.outputs.name }}-debug
path: app/build/outputs/apk/debug/*.apk
archive: false

- name: Upload release APK
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: DroidVM-${{ steps.version.outputs.name }}-release
path: app/build/outputs/apk/release/*.apk
archive: false
41 changes: 41 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Checks

on:
push:
branches: [ "**" ]
pull_request:
branches: [ "**" ]
workflow_dispatch:

concurrency:
group: checks-${{ github.ref }}
cancel-in-progress: true

jobs:
lint:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4
# No submodules: these checks only look at this repo's own sources.

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'

- name: No non-ASCII in code/config
run: python3 scripts/ci/check_ascii.py

- name: Translations complete across all locales
run: python3 scripts/ci/check_translations.py

- name: Use fmt() instead of string concatenation
run: python3 scripts/ci/check_string_concat.py

- name: Icons are vector drawables
run: python3 scripts/ci/check_vector_icons.py

- name: No signature over the parameter limit
run: python3 scripts/ci/check_arity.py
127 changes: 127 additions & 0 deletions .github/workflows/dev-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
name: Dev release

# Every push to the default branch (re)publishes a rolling pre-release on a
# dedicated `dev` tag. The tag is a moving label -- it is deleted and recreated
# at the current commit each run, so it never pins a specific version. A GitHub
# Release must be attached to a tag, hence the dummy `dev` tag.
# (release.yml still cuts real, versioned releases on real tag pushes.)
on:
push:
branches: [ master ]
workflow_dispatch:

permissions:
contents: write

concurrency:
group: dev-release
cancel-in-progress: true

jobs:
dev-release:
runs-on: ubuntu-latest
env:
DROIDVM_PREBUILT_COMPRESSION_LEVEL: "9"
HAS_SIGN_KEY: ${{ secrets.APP_SIGN_KEY_JKS != '' }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Setup Android SDK
uses: android-actions/setup-android@v3
with:
packages: build-tools;36.0.0

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Grant execute permission for gradlew
run: chmod +x gradlew

# With a signing key: build and sign a real release APK (current
# behaviour). Without one: ship the debug APK -- signed with the
# auto-generated debug keystore -- instead of an unsigned release.
- name: Build release APK
if: ${{ env.HAS_SIGN_KEY == 'true' }}
run: ./gradlew assembleRelease

- name: Sign release APK
if: ${{ env.HAS_SIGN_KEY == 'true' }}
env:
APP_SIGN_KEY_JKS: ${{ secrets.APP_SIGN_KEY_JKS }}
APP_SIGN_KEY_PASS: ${{ secrets.APP_SIGN_KEY_PASS }}
run: |
BUILD_TOOLS="${ANDROID_HOME}/build-tools/36.0.0"
echo "$APP_SIGN_KEY_JKS" | base64 -d > /tmp/keystore.jks
UNSIGNED=$(find app/build/outputs/apk/release -name '*.apk' | head -1)
ALIGNED="${UNSIGNED%.apk}-aligned.apk"
"${BUILD_TOOLS}/zipalign" -f -v 4 "$UNSIGNED" "$ALIGNED"
"${BUILD_TOOLS}/apksigner" sign \
--ks /tmp/keystore.jks \
--ks-pass "pass:${APP_SIGN_KEY_PASS}" \
--key-pass "pass:${APP_SIGN_KEY_PASS}" \
--out "$UNSIGNED" \
"$ALIGNED"
rm -f "$ALIGNED" /tmp/keystore.jks

- name: Build debug APK (no signing key)
if: ${{ env.HAS_SIGN_KEY != 'true' }}
run: ./gradlew assembleDebug

# Derive a version string from the latest real tag, e.g. `0.0.6.r63.52993d4`
# (matches release.yml). The moving `dev` tag is excluded so it never
# shadows the real version tag in `git describe`.
- name: Get version info
id: version
run: |
set -euo pipefail
if desc="$(git describe --long --tags --exclude dev 2>/dev/null)"; then
desc="$(echo "$desc" | sed 's/^[vV]//')"
if echo "$desc" | grep -qE '\-0\-g[0-9a-f]+$'; then
ver="$(echo "$desc" | sed 's/-0-g[0-9a-f]*$//')"
else
ver="$(echo "$desc" | sed 's/-\([0-9]*\)-g/.r\1./')"
fi
else
ver="$(git rev-parse --short HEAD)"
fi
echo "name=${ver}" >> "$GITHUB_OUTPUT"

- name: Stage APK
run: |
set -euo pipefail
mkdir -p release
apk="release/DroidVM-${{ steps.version.outputs.name }}-dev.apk"
if [ "${HAS_SIGN_KEY}" = "true" ]; then
cp app/build/outputs/apk/release/*.apk "$apk"
else
cp app/build/outputs/apk/debug/*.apk "$apk"
fi

- name: Publish rolling dev pre-release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VER: ${{ steps.version.outputs.name }}
run: |
set -euo pipefail

# Drop the previous dev release + tag, then recreate at this commit so
# `dev` always points at latest master (a moving, version-less tag).
gh release delete dev --yes --cleanup-tag 2>/dev/null || true
git push origin :refs/tags/dev 2>/dev/null || true

gh release create dev "release/DroidVM-${VER}-dev.apk" \
--prerelease \
--target "${GITHUB_SHA}" \
--title "DroidVM dev (${VER})" \
--notes "Rolling development build from ${GITHUB_SHA} (${VER}). Not a stable release."
22 changes: 20 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ name: Release
on:
push:
tags: [ "**" ]
workflow_dispatch:

permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
env:
DROIDVM_PREBUILT_COMPRESSION_LEVEL: "9"
HAS_SIGN_KEY: ${{ secrets.APP_SIGN_KEY_JKS != '' }}

steps:
- name: Checkout repository
Expand All @@ -35,10 +39,15 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew

# With a signing key: build and sign a real release APK (current
# behaviour). Without one: ship the debug APK -- signed with the
# auto-generated debug keystore -- instead of an unsigned release.
- name: Build release APK
if: ${{ env.HAS_SIGN_KEY == 'true' }}
run: ./gradlew assembleRelease

- name: Sign release APK
if: ${{ env.HAS_SIGN_KEY == 'true' }}
env:
APP_SIGN_KEY_JKS: ${{ secrets.APP_SIGN_KEY_JKS }}
APP_SIGN_KEY_PASS: ${{ secrets.APP_SIGN_KEY_PASS }}
Expand All @@ -56,6 +65,10 @@ jobs:
"$ALIGNED"
rm -f "$ALIGNED" /tmp/keystore.jks

- name: Build debug APK (no signing key)
if: ${{ env.HAS_SIGN_KEY != 'true' }}
run: ./gradlew assembleDebug

- name: Get version info
id: version
run: |
Expand All @@ -69,13 +82,18 @@ jobs:

- name: Rename APK
run: |
set -euo pipefail
mkdir -p release
cp app/build/outputs/apk/release/*.apk "release/DroidVM-v${{ steps.version.outputs.name }}.apk"
if [ "${HAS_SIGN_KEY}" = "true" ]; then
cp app/build/outputs/apk/release/*.apk "release/DroidVM-v${{ steps.version.outputs.name }}.apk"
else
cp app/build/outputs/apk/debug/*.apk "release/DroidVM-v${{ steps.version.outputs.name }}-debug.apk"
fi

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
name: DroidVM v${{ steps.version.outputs.name }}
draft: false
prerelease: ${{ contains(github.ref_name, '-') }}
files: release/DroidVM-v${{ steps.version.outputs.name }}.apk
files: release/*.apk
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,32 @@
/local.properties
/.idea
/.vscode
/DroidVM-Prebuilt-Root
/DroidVM-Prebuilt-Root_
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

# Legacy native-util source locations -- the daemons + lbx are now built by the
# DroidVM-Prebuilt-Root pipeline, not staged into the app tree.
/app/src/thirdparty
/app/src/main/rust

# Stale daemon binaries from the old build.sh staging (now delivered via the
# prebuilt tar.xz); ignore leftovers so they are never packaged or committed.
/app/src/main/assets/bin/*/bridgedhcp
/app/src/main/assets/bin/*/gvswitch
/app/src/main/assets/bin/*/lbx
/app/src/main/assets/bin/*/netbox
/app/src/main/assets/bin/*/pbridge

# Terminal font: build.sh fetches the ~2.3MB Maple Mono NL NF TTF on first
# build; only the OFL license text under app/src/main/assets/fonts is committed.
/app/src/main/assets/fonts/*.ttf

# Python bytecode from the scripts/ci checks.
__pycache__/
*.pyc
61 changes: 61 additions & 0 deletions ADDITIONAL-PERMISSIONS
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
Additional permissions under GNU GPL version 3, section 7
=========================================================

These additional permissions apply to the parts of this work copyrighted by
the Droid-VM organization and by contributors to this project. They do not
apply to material copyrighted by others -- in particular, material inherited
from the upstream project this repository is derived from, which remains under
its own terms and is not affected by anything below.


1. Upstream contribution
------------------------

You may modify this material and distribute the result under the license terms
that an Upstream Project requires of contributions to it, for the sole purpose
of having that material included in the Upstream Project's official repository.

This permission takes effect only for material that the Upstream Project
accepts and publishes. Proposing material to an Upstream Project -- opening a
merge request, posting a patch, or any other act of submission -- does not by
itself place that material under any license other than the GNU GPL. Material
that is not accepted remains under the GNU GPL alone.

Once an Upstream Project has published material under its own license, that
license governs the copy the Upstream Project published. Nothing in this
document restricts what anyone may do with that copy.

This permission does not authorise distribution under any other license for any
other purpose. In particular, it does not authorise distributing this material
under a permissive license to the public at large, to a fork, or to a
redistributor, whether or not an Upstream Project was also asked to take it.


2. Upstream Projects
--------------------

"Upstream Project" means one of the following, and no others:



An Upstream Project's "official repository" is the repository named above, or a
repository that project's own maintainers designate as its successor. A fork,
a mirror, a vendored copy, and a redistribution are not official repositories.


3. Notes
--------

Under GPL version 3 section 7, a recipient may remove these additional
permissions from a copy they convey. Doing so does not affect the terms on
which the permissions are offered here, and does not withdraw them from anyone
who received them.

Adding permissions on top of the GNU GPL does not restrict any freedom the GPL
grants. Every recipient keeps the full GPL grant regardless of whether they use
anything in this document.

Contributions to this project are made under this project's license, which
includes these additional permissions. A contributor therefore does not need to
sign a separate agreement for their contribution to be eligible for upstream
submission under section 1. See CONTRIBUTING.md.
Loading