Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
3d010e6
licensing: say the GPLv3 out loud, and allow an upstream relicense
HuJK Aug 30, 2026
efb6364
ci: three source checks, and a build that can unit-test a class that …
HuJK Aug 30, 2026
71810c5
display: one framework behind the VNC and native screens
HuJK Aug 30, 2026
8b17338
disk: a Linux VM you can create, and overlays you can branch
HuJK Aug 30, 2026
55fc4fb
vm: the platform odds -- host CPU name, game mode, per-VM environment…
HuJK Aug 30, 2026
8ff3b46
settings: a kernel module manager, and a huge-page panel that admits …
HuJK Aug 30, 2026
6becef9
modules: nproc_guard is loaded with this app's uid, and reset after a…
HuJK Aug 30, 2026
02bf0a5
network: ready-made networks, and a setup step that makes one
HuJK Aug 30, 2026
206c101
agent: a headless VM that runs rescue actions, on one shared terminal…
HuJK Aug 30, 2026
1be1fc1
cpu: a vCPU placement plan -- affinity, capacity and cluster, picked …
HuJK Aug 30, 2026
3a0c592
serial: ports as a peripheral category, with a USB ACM gadget pool be…
HuJK Aug 30, 2026
b5de3de
sound: a virtio-snd card whose endpoints are named, and each one has …
HuJK Aug 30, 2026
78dee58
peripherals: camera and VPU entries for the virtio-media devices to come
HuJK Aug 30, 2026
89dc7b2
vm: a protection mode whose guest RAM the host can still see
HuJK Aug 30, 2026
51e7ac9
gunyah: features declare that they need dynamic memory sharing, and a…
HuJK Aug 30, 2026
860e292
gpu: pre-share the gfxstream host arena before the guest boots
HuJK Aug 30, 2026
eb24296
gpu: a guest-allocated VRAM pool, and none where the host can already…
HuJK Aug 30, 2026
f7d14f6
gpu: the guest pool grows -- preallocation, step and a grant ceiling
HuJK Aug 30, 2026
74a8183
gpu: raise udmabuf's per-handle size limit, fallback module included
HuJK Aug 30, 2026
d93e484
display: pick the Vulkan that blits, and ask it whether it can
HuJK Aug 30, 2026
071e30e
display: a VM has screens, and each screen names its own exporter
HuJK Aug 30, 2026
15a0f0a
vnc: take the hardware H.264 stream off the RFB port
HuJK Aug 30, 2026
8ed3da2
gpu: a worker cpuset, and real-time scheduling only on top of it
HuJK Aug 30, 2026
60dff3a
gpu: the drm2kgsl route -- native context, its own pools, no host Vul…
HuJK Aug 30, 2026
0290bb3
gpu: the gfxstream route -- context type, BAR window and its VRAM knobs
HuJK Aug 30, 2026
0d3820e
gpu: the venus route -- virglrenderer's Vulkan proxy and its transpor…
HuJK Aug 30, 2026
cdd20c3
compat: provide path::__filename() on Android 14
HuJK Aug 31, 2026
3ea4efb
vmpkg v2, add qcow2 backing tree support
HuJK Sep 2, 2026
ff3d888
vmpkg import: one decision per packaged network, and conflicts scoped…
HuJK Sep 2, 2026
8e07f8d
network: a stopped VM no longer blocks deleting the network it is on
HuJK Sep 2, 2026
5d79faf
network: register a new network with the daemon when it is saved, not…
HuJK Sep 2, 2026
9993dcd
prebuilts: point at the payload built from the accepted artifacts
HuJK Sep 2, 2026
be61799
fix size byte parse error
HuJK Sep 3, 2026
810d9fd
archive: TarWriter emits GNU base-256 sizes past 12 octal digits
HuJK Sep 3, 2026
7f23d5d
vm: Markdown notes, on their own page and rendered where the VM is shown
HuJK Sep 3, 2026
e92649a
disk: decide a shared disk at start time, by run state, not in the ed…
HuJK Sep 3, 2026
b03f6ff
vm: ask before starting a VM whose kernel modules are not loaded
HuJK Sep 3, 2026
61d8e07
editor: a stored option this build no longer offers resets the row in…
HuJK Sep 3, 2026
bbb5a79
fix five things a VM start can fail on without saying so
HuJK Sep 5, 2026
b8c2d04
boot: crosvm honours a custom EDK2 the way QEMU already does
HuJK Sep 6, 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
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,9 @@ jobs:

- 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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,7 @@ local.properties
# 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.
32 changes: 32 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Contributing

## Sign-off

Every commit must carry a `Signed-off-by:` line certifying the
[Developer Certificate of Origin 1.1](https://developercertificate.org/):

git commit -s

## What signing off means here

The DCO asks you to certify that you have the right to submit your work under
the license this project uses. For this project that license is the GNU GPL
**plus the additional permissions in `ADDITIONAL-PERMISSIONS`**, so a
contribution made under it carries those permissions too.

That is deliberate, and it is why this project asks for a DCO rather than a
CLA. The additional permissions let anyone relicense material from this project
in order to get it accepted into the upstream project it belongs in. If
contributions did not carry those permissions, every contribution would become
a piece of the tree that could never be sent upstream, and the permission would
quietly stop meaning anything as the project grew.

You keep your copyright. Nothing is assigned to anyone.

## Do not sign off on someone else's license

If you are contributing material you did not write -- code ported from another
project, a header copied from a kernel, a function translated from elsewhere --
say so in the file and keep that material under its own license. Do not put a
project SPDX tag on it. Several files in these repositories are in exactly that
position and are marked accordingly.
31 changes: 31 additions & 0 deletions LICENSING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Licensing

This repository holds two kinds of material and they are licensed differently.

## Material inherited from upstream



Every file that came from an upstream project stays under that project's
license. Nothing here relicenses it, and modifications to those files do not
relicense them either — a patched upstream file is still an upstream file.

## Material written for DroidVM

Files carrying `SPDX-License-Identifier: GPL-3.0-or-later` are DroidVM work
and are licensed under the GNU GPL, version 3 or later, **with the
additional permissions in `ADDITIONAL-PERMISSIONS`**.

Those permissions exist so this work can go upstream. They let anyone
relicense it under the terms an upstream project requires, for the purpose of
getting it merged there — and only for that purpose. Once upstream publishes
it, upstream's license governs that copy.

## Third-party material that is neither

None. The app is DroidVM work throughout; `app/src/main/java/cn/classfun/droidvm`
is the only source tree and nothing is vendored into it.

## Contributing

See `CONTRIBUTING.md`. Sign-off is required; there is no CLA.
37 changes: 37 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ import java.security.MessageDigest

plugins {
alias(libs.plugins.android.application)
// Compose is here for one screen: the Markdown notes editor and the cards that render what
// it wrote, which come from a Compose-only library. Everything else stays Java and Views.
// Kotlin itself needs no plugin -- AGP 9 compiles it out of the box and already owns the
// "kotlin" extension -- so only the Compose compiler plugin is applied, pinned to the same
// Kotlin version AGP carries.
alias(libs.plugins.kotlin.compose)
}

fun runGit(vararg args: String): String {
Expand Down Expand Up @@ -94,9 +100,32 @@ android {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
}
}
buildFeatures {
aidl = true
buildConfig = true
compose = true
}
sourceSets {
getByName("main") {
// Third-party source kept in the tree rather than pulled as an artifact, in its own
// root so that "not ours, and under its own licence" is structural. See its README.
kotlin.srcDir("src/main/vendor")
}
}
testOptions {
unitTests {
// Lets a unit test cover a class that logs. The alternative -- keeping every testable
// class free of android.util.Log -- stopped being tenable at the H.264 side channel,
// whose whole subject is a socket and a thread outliving the object that owned them,
// and which says so out loud when they do. Nothing here asserts on a stub's return
// value; the stubs are only there so the class under test can be built at all.
isReturnDefaultValues = true
}
}
packaging {
jniLibs {
Expand Down Expand Up @@ -329,10 +358,18 @@ dependencies {
implementation(libs.annotation.jvm)
implementation(libs.appcompat)
implementation(libs.auto.service.annotations)
implementation(platform(libs.compose.bom))
implementation(libs.compose.animation)
implementation(libs.compose.foundation)
implementation(libs.compose.ui)
implementation(libs.compose.material3)
implementation(libs.constraintlayout)
implementation(libs.libsu.core)
implementation(libs.libsu.nio)
implementation(libs.libsu.service)
// The renderer itself lives in src/main/vendor; these are what it needs.
implementation(libs.markdown.parser)
implementation(libs.kotlinx.collections.immutable)
implementation(libs.material)
implementation(libs.okhttp3)
implementation(libs.snakeyaml)
Expand Down
Loading
Loading