Convert Figma logo to code with AI

bk138 logodroidVNC-NG

VNC server app for Android that does not require root privileges.

1,297
186
1,297
32

Top Related Projects

LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.

3,032

Modern VNC Server and client, web based and secure

11,507

VNC client web application

10,779

FreeRDP is a free remote desktop protocol library and clients

Quick Overview

droidVNC-NG is an open-source VNC server for Android devices. It allows users to remotely control their Android devices from a computer or another device using VNC client software. This project is a fork of the original droidVNC, with improvements and updates for modern Android versions.

Pros

  • Works on non-rooted devices (Android 5.0+)
  • Supports both touch and keyboard input
  • Offers various encoding options for better performance
  • Actively maintained and updated

Cons

  • May have performance issues on older devices
  • Requires Android permission setup, which can be complex for some users
  • Limited documentation for advanced features
  • Potential security risks if not configured properly

Getting Started

To use droidVNC-NG on your Android device:

  1. Download the latest APK from the releases page.
  2. Install the APK on your Android device.
  3. Open the app and grant necessary permissions.
  4. Configure the server settings (port, password, etc.).
  5. Start the VNC server.
  6. Connect to your device using a VNC client on another device, using the IP address and port displayed in the app.

Note: For non-rooted devices, you'll need to set up ADB and enable USB debugging to grant additional permissions. Follow the instructions provided in the app for this process.

Competitor Comparisons

LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.

Pros of libvncserver

  • More comprehensive VNC library with both server and client implementations
  • Wider platform support, including Windows, macOS, and various Unix-like systems
  • Actively maintained with regular updates and contributions from a larger community

Cons of libvncserver

  • Larger codebase and potentially more complex to integrate into projects
  • Not specifically optimized for Android devices, unlike droidVNC-NG
  • May require more resources and have a larger footprint in mobile applications

Code Comparison

libvncserver:

rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
 int width,int height,int bitsPerSample,int samplesPerPixel,
 int bytesPerPixel)

droidVNC-NG:

public class VncServer {
    public native int init(int width, int height, int port);
    public native void close();
}

The code snippets show that libvncserver uses a C-based API for screen initialization, while droidVNC-NG provides a Java native interface specifically designed for Android integration. This reflects the different focus and target platforms of the two projects.

3,032

Modern VNC Server and client, web based and secure

Pros of KasmVNC

  • Designed for web-based remote access, optimized for modern browsers
  • Supports advanced features like audio streaming and file transfer
  • Active development with regular updates and improvements

Cons of KasmVNC

  • Larger codebase and potentially more complex setup
  • May have higher resource requirements due to additional features

Code Comparison

KasmVNC (C++):

void VNCServerST::processClientMessages()
{
  std::vector<rdr::U8> updateBuf;
  std::vector<rdr::U8> clipboardBuf;
  // ... (processing logic)
}

droidVNC-NG (Java):

public void processServerMessages() {
    byte[] buffer = new byte[1024];
    int bytesRead;
    // ... (processing logic)
}

KasmVNC focuses on server-side processing with C++, while droidVNC-NG is client-oriented using Java. KasmVNC's code suggests more complex message handling, potentially supporting a wider range of features.

Summary

KasmVNC is a feature-rich VNC solution optimized for web-based access, offering advanced capabilities but potentially requiring more resources. droidVNC-NG is a simpler, Android-focused VNC client with a lighter codebase. The choice between them depends on specific use cases and platform requirements.

11,507

VNC client web application

Pros of noVNC

  • Web-based VNC client, accessible from any modern browser without plugins
  • Supports a wide range of VNC servers and protocols
  • Active development with frequent updates and improvements

Cons of noVNC

  • Potentially higher latency due to web-based nature
  • May have limited performance on older or low-powered devices
  • Requires a web server to host the client files

Code Comparison

noVNC (JavaScript):

var rfb = new RFB(document.getElementById('screen'), 'ws://example.com:5900');
rfb.scaleViewport = true;
rfb.resizeSession = true;

droidVNC-NG (Java):

VncCanvas vncCanvas = new VncCanvas(this);
vncCanvas.setScaleType(ImageView.ScaleType.MATRIX);
vncCanvas.init();
vncCanvas.setConnection(new VNCConn());

Both projects aim to provide VNC client functionality, but noVNC focuses on web-based implementation, while droidVNC-NG is specifically designed for Android devices. noVNC offers broader accessibility across platforms, whereas droidVNC-NG may provide better performance and integration on Android devices.

10,779

FreeRDP is a free remote desktop protocol library and clients

Pros of FreeRDP

  • Supports multiple platforms (Windows, macOS, Linux, iOS, Android)
  • Implements the Remote Desktop Protocol (RDP), which is widely used in enterprise environments
  • Actively maintained with frequent updates and a large community

Cons of FreeRDP

  • More complex setup and configuration compared to VNC-based solutions
  • Requires more system resources due to its comprehensive feature set
  • May have compatibility issues with some older systems or non-standard RDP implementations

Code Comparison

droidVNC-NG (VNC-based):

rfbBool rfbSendFramebufferUpdate(rfbClientPtr cl, sraRegionPtr updateRegion)
{
    rfbFramebufferUpdateMsg fu;
    // ... (VNC-specific frame buffer update logic)
}

FreeRDP (RDP-based):

BOOL update_begin_paint(rdpContext* context)
{
    rdpUpdate* update = context->update;
    // ... (RDP-specific update begin paint logic)
}

The code snippets highlight the different approaches to handling screen updates in VNC and RDP protocols. droidVNC-NG uses VNC-specific functions for frame buffer updates, while FreeRDP implements RDP-specific update mechanisms.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

droidVNC-NG

Join the chat at https://gitter.im/droidVNC-NG/community

This is an Android VNC server using contemporary Android 5+ APIs. It therefore does not require root access. In reverence to the venerable droid-VNC-server is is called droidVNC-NG.

If you have a general question, it's best to ask in the community chat. If your concern is about a bug or feature request instead, please use the issue tracker.

Get it on F-Droid Get it on Google Play

Features

  • Network export of device frame buffer with optional server-side scaling.
  • Injection of remote pointer and basic keyboard events.
  • Handling of client-to-server text copy & paste. Note that server-to-client copy & paste does not work in a generic way due to Android security restrictions.
  • Handling of special keys to trigger 'Recent Apps' overview, Home button, Back button and Power button.
  • Android permission handling.
  • Screen rotation handling.
  • File transfer via the local network, assuming TightVNC viewer for Windows version 1.3.x is used.
  • Password protection for secure-in-terms-of-VNC connection.
  • Ability to specify the port used.
  • Start of background service on device boot.
  • Reverse VNC.
  • Ability to connect to a UltraVNC-style Mode-2 repeater.
  • Functionality to provide default configuration via a JSON file.
  • Zeroconf/Bonjour publishing for VNC server auto-discovery.
  • Per-client mouse pointers on the controlled device.
  • Ability to control a device’s shared screen directly from a web browser by shipping the fabulous noVNC client with the server app. This alleviates the need for a native VNC client.

How to use

  1. Install the app from either marketplace.
  2. Get it all the permissions required.
  3. Set a good password and consider turning the Start on Boot off.
  4. Connect to your local Wi-Fi. For accepting a connection your device should be connected to some Local Area Network that you can control, normally it is a router. Connections via data networks (i.e. your mobile provider) are not supported.
  5. Click Start and connect to your device.

Keyboard Shortcuts From a VNC Viewer

  • Ctrl-Shift-Esc triggers 'Recent Apps' overview
  • Home/Pos1 acts as Home button
  • End acts as Power button
  • Escape acts as Back button

For accepting connections from outside

  1. You should allow Port Forwarding in your router's Firewall settings. Login to your router's settings (usually open 192.168.1.1 in your browser, some routers have password written on them).

  2. Find Port Forwarding, usually it's somewhere in Network - Firewall - Port Forwards.

  3. Create a new rule, this is an example from OpenWRT firmware.

    Name: VNC forwarding

    Protocol: TCP

    Source zone: wan may be "internet", "modem", something that suggests the external source.

    External port: 5900 by default or whatever you specified in the app.

    Destination zone: lan something that suggests local network.

    Internal IP address: your device's local IP address, leaving any is less secure. The device's address may change over time! You can look it up in your routers' connected clients info.

    Internal port: same as external port.

  4. Apply the settings, sometimes it requires rebooting a router.

  5. Figure out your public adress i.e. https://www.hashemian.com/whoami/.

  6. Use this address and port from above to connect to your device.

How to Pre-seed Preferences

DroidVNC-NG can read a JSON file with default settings that apply if settings were not changed by the user. A file named defaults.json needs to created under <external files directory>/Android/data/net.christianbeier.droidvnc_ng/files/ where depending on your device, <external files directory> is something like /storage/emulated/0 if the device shows two external storages or simply /sdcard if the device has one external storage.

An example defaults.json with completely new defaults (not all entries need to be provided) is:

{
    "port": 5901,
    "portReverse": 5555,
    "portRepeater": 5556,
    "scaling": 0.7,
    "viewOnly": false,
    "showPointers": true,
    "fileTransfer": true,
    "password": "supersecure",
    "accessKey": "evenmoresecure",
    "startOnBoot": true,
    "startOnBootDelay": 0
}

Remote Control via the Intent Interface

droidVNC-NG features a remote control interface by means of Intents. This allows starting the VNC server from other apps or on certain events. It is designed to be working with automation apps like MacroDroid, Automate or Tasker as well as to be called from code.

You basically send an explicit Intent to net.christianbeier.droidvnc_ng.MainService with one of the following Actions and associated Extras set:

  • net.christianbeier.droidvnc_ng.ACTION_START: Starts the server.

    • net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.
    • net.christianbeier.droidvnc_ng.EXTRA_PORT: Optional Integer Extra setting the listening port. Set to -1 to disable listening.
    • net.christianbeier.droidvnc_ng.EXTRA_PASSWORD: Optional String Extra containing VNC password.
    • net.christianbeier.droidvnc_ng.EXTRA_SCALING: Optional Float Extra between 0.0 and 1.0 describing the server-side framebuffer scaling.
    • net.christianbeier.droidvnc_ng.EXTRA_VIEW_ONLY: Optional Boolean Extra toggling view-only mode.
    • net.christianbeier.droidvnc_ng.EXTRA_SHOW_POINTERS: Optional Boolean Extra toggling per-client mouse pointers.
    • net.christianbeier.droidvnc_ng.EXTRA_FILE_TRANSFER: Optional Boolean Extra toggling the file transfer feature.
    • net.christianbeier.droidvnc_ng.EXTRA_FALLBACK_SCREEN_CAPTURE: Optional Boolean Extra indicating whether to start with fallback screen capture that does not need a user interaction to start but is slow and needs view-only to be off. Only applicable to Android 10 and newer.
  • net.christianbeier.droidvnc_ng.ACTION_CONNECT_REVERSE: Make an outbound connection to a listening viewer.

    • net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.
    • net.christianbeier.droidvnc_ng.EXTRA_HOST: Required String Extra setting the host to connect to.
    • net.christianbeier.droidvnc_ng.EXTRA_PORT: Optional Integer Extra setting the remote port.
    • net.christianbeier.droidvnc_ng.EXTRA_RECONNECT_TRIES: Optional Integer Extra setting the number of tries reconnecting a once established connection. Needs request id to be set.
  • net.christianbeier.droidvnc_ng.ACTION_CONNECT_REPEATER Make an outbound connection to a repeater.

    • net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.
    • net.christianbeier.droidvnc_ng.EXTRA_HOST: Required String Extra setting the host to connect to.
    • net.christianbeier.droidvnc_ng.EXTRA_PORT: Optional Integer Extra setting the remote port.
    • net.christianbeier.droidvnc_ng.EXTRA_REPEATER_ID: Required String Extra setting the ID on the repeater.
    • net.christianbeier.droidvnc_ng.EXTRA_RECONNECT_TRIES: Optional Integer Extra setting the number of tries reconnecting a once established connection. Needs request id to be set.
  • net.christianbeier.droidvnc_ng.ACTION_STOP: Stops the server.

    • net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.

The service answers with a Broadcast Intent with its Action mirroring your request:

  • Action: one of the above Actions you requested
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID: The request id this answer is for.
    • net.christianbeier.droidvnc_ng.EXTRA_REQUEST_SUCCESS: Boolean Extra describing the outcome of the request.

There is one special case where the service sends a Broadcast Intent with action net.christianbeier.droidvnc_ng.ACTION_STOP without any extras: that is when it is stopped by the system.

Examples

Start a password-protected view-only server on port 5901

Using adb shell am syntax:

adb shell am start-foreground-service \
 -n net.christianbeier.droidvnc_ng/.MainService \
 -a net.christianbeier.droidvnc_ng.ACTION_START \
 --es net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY de32550a6efb43f8a5d145e6c07b2cde \
 --es net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID abc123 \
 --ei net.christianbeier.droidvnc_ng.EXTRA_PORT 5901 \
 --es net.christianbeier.droidvnc_ng.EXTRA_PASSWORD supersecure \
 --ez net.christianbeier.droidvnc_ng.EXTRA_VIEW_ONLY true
Start a server with defaults from Tasker
  • Tasker action-category in menu is System -> Send Intent
  • In there:
    • Action net.christianbeier.droidvnc_ng.ACTION_START
    • Extra net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY:<your api key from DroidVNC-NG start screen>
    • Package net.christianbeier.droidvnc_ng
    • Class net.christianbeier.droidvnc_ng.MainService
    • Target: Service
Start a server with defaults from a Kotlin app
  • For apps targeting API level 30+, you'll need to specify that your app is able to see/use droidVNC-NG. You do this by adding the following snippet to your AndroidManifest.xml, right under the <manifest> namepace:
<queries>
    <package android:name="net.christianbeier.droidvnc_ng" />
</queries>
  • In your Kotlin code, it's then:
val intent = Intent()
intent.setComponent(ComponentName("net.christianbeier.droidvnc_ng", "net.christianbeier.droidvnc_ng.MainService"))
intent.setAction("net.christianbeier.droidvnc_ng.ACTION_START")
intent.putExtra("net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY", "<your api key from DroidVNC-NG start screen>")
startForegroundService(intent)
Make an outbound connection to a listening viewer from the running server

For example from Java code:

See MainActivity.java.

Stop the server again

Using adb shell am syntax again:

adb shell am start-foreground-service \
 -n net.christianbeier.droidvnc_ng/.MainService \
 -a net.christianbeier.droidvnc_ng.ACTION_STOP \
 --es net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY de32550a6efb43f8a5d145e6c07b2cde \
 --es net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID def456

Building

  • After cloning the repo, make sure you have the required git submodules set up via git submodule update --init.
  • Then simply build via Android Studio or gradlew.

Contributing

Contributions to the project are very welcome and encouraged! They can come in many forms. You can:

Notes

  • Requires at least Android 7.

  • Since Android 10, the permission to access the screen contents has to be given on each start and is not saved. You can, however, work around this by installing adb (or simply Android Studio) on a PC, connecting the device running droidVNC-NG to that PC and running adb shell cmd appops set net.christianbeier.droidvnc_ng PROJECT_MEDIA allow once. Alternatively, if using the intent interface, you can also start with net.christianbeier.droidvnc_ng.EXTRA_FALLBACK_SCREEN_CAPTURE set to true.

  • You can also use adb to manually give input permission prior to app start via adb shell settings put secure enabled_accessibility_services net.christianbeier.droidvnc_ng/.InputService:$(adb shell settings get secure enabled_accessibility_services).

  • If you are getting a black screen in a connected VNC viewer despite having given all permissions, it might be that your device does not support Android's MediaProjection API correctly. To find out, you can try screen recording with another app, ScreenRecorder. If it fails as well, your device most likely does not support screen recording via MediaProjection. This is known to be the case for Android-x86.

  • In case you happen to have a board with an Ethernet interface and experience strange hangs during a VNC session, setting the interface to a slower speed might help. This workaround can be applied with mii-tool, for instance.

  • If you see a a floating button similar to this on your screen after enabling accessibility, make sure you have the "shortcut" option in accessibility settings turned to off.