diff --git a/404.html b/404.html index 7f138cc5..8bc0eac3 100644 --- a/404.html +++ b/404.html @@ -3,7 +3,7 @@
- + @@ -27,11 +27,11 @@ - + - + - + is the method number in aidl","1: getAvaliableInterfaces","2: isAvaliable","3: Etc…","Examples:","getAvaliableInterfaces:","x86_64:/ # service call blissethernet 1 s16 eth0 Result: Parcel( 0x00000000: 00000000 00000002 00000004 00740065 '............e.t.' 0x00000010: 00300068 00000000 00000004 00740065 'h.0.........e.t.' 0x00000020: 00310068 00000000 'h.1..... ')","isAvaliable:","x86_64:/ # service call blissethernet 2 s16 eth0 Result: Parcel(00000000 00000001 '........')"]}],[{"l":"Setting Up Bliss Kiosk Launcher","p":["If your BlissBass builds comes with Bliss Kiosk Launcher, then you have the ability to restrict it’s access to various packages on the device, as well as set specific packages to auto-launch when booting the device into Lockdown mode (Intel Default), or locking the device while in Admin mode (Other Options > Intel - Admin)."]},{"i":"lockdown-mode","l":"Lockdown Mode:","p":["alt_text","In Lockdown mode, navigation bar, gesture handle and status bar are all disabled. The app drawer will only display allowed packages. Example:","While in Lockdown mode, you can access the Kiosk Launcher Settings by clicking the Exit button, and inputting the maintenance password set (default is: 123):"]},{"i":"admin-mode","l":"Admin Mode:","p":["This mode shows a sprocket next to the exit icon, and depending on boot mode, will also display the navigation handle and statusbar.","alt_text","Along with the app drawer containing all packages:"]},{"i":"configuration","l":"Configuration:","p":["Clicking on the sprocket from the home screen will launch the Kiosk Launcher Settings screen:","alt_text","From the settings screen, you can manage the Maintenance Password, Change whitelisted apps, and set which package you want to Auto Launch when Kiosk Launcher starts in Lockdown mode.","You can also test the Kiosk Launcher while within Admin mode to ensure functionality before rebooting to Lockdown mode."]}],[{"l":"Setting Up Bliss Restricted Launcher","p":["If your BlissBass builds comes with Bliss Restricted Launcher, then you have the ability to restrict it’s access to various packages on the device, as well as set specific packages to auto-launch across multiple connected displays when booting the device into Lockdown mode (Default), or locking the device while in Admin mode (Other Options > Admin)."]},{"i":"admin-mode","l":"Admin Mode:","p":["Admin mode will display both the sprocket and the lock button on the top right of the display, and allow access to navigation, statusbar, recents, and other Android features by default.","Admin mode desktop","This mode is open by default and allows for the launcher defaults to be configured."]},{"i":"configuration","l":"Configuration:","p":["Clicking on the sprocket from the home screen will launch the Restricted Launcher Settings screen:","Initial Settings Screen","The main settings screen has a number of suboptions to select from:"]},{"l":"Appearance","p":["The appearance settings screen allows you to change a number of details about the overall look and feel of the kiosk interface. Depending on the Free or Pro version of the app, there may be some options that are unavaialable like setting custom logo, and hiding/changing the logo overlay options.","Appearance Settings"]},{"l":"Apps","p":["Apps settings has all the options related to selecting your whitelisted apps and auto-launching them across multiple displays:","Apps Settings","The auto-start app options will show a list of apps for you to select from:","auto-start app selection"]},{"l":"Security","p":["The Security options is where you will initially want to set the Kiosk password, and enable/disable the various features on the kiosk that you want to be available in lockdown mode:","Security Settings"]},{"l":"System","p":["The system settings page allows you to set the kiosk screen timeout and enable/disable the on-screen keyboard (if your device has a secondary keyboard attaches, this override may be needed):","System Settings"]},{"i":"lockdown-mode","l":"Lockdown Mode:","p":["lockdown mode","You can configure Restricted Launchers Lockdown mode to have navigation bar, gesture handle and status bar are all disabled, and the app drawer will only display allowed packages.","While in Lockdown mode, you can access the Restricted Launcher Settings by clicking the sprocket at the top right of the screen, and a password prompt will display requiring the password set from Admin mode to be input:","lockdown password prompt"]}],[{"l":"Addon development"},{"l":"Addon Development","p":["Learning our addon development process will give you a good concept of how things are put together.","Let's say that you have a change that you want to add to Bass OS, but that change can be used on many devices, so you don't want to keep it as a private change that is never shared outside this single devices source. This is where Addons come into play.","Addons can consist of one or more of the following:","Patchsets - Single or multiple sets of patches that are to be applied on-top of the source when unfolding the OS.","Prebuilt APK's - An example of this is the Restricted Launcher Pro. We offer the free version of the prebuilt for all to include, but it contains branding that cannot be changed. But we offer the Pro version that can be rebranded and further customized as an addon.","Package/External Sources - An example of this is our Kiosk Launcher, as that requires the private source to be included in the OS in order to use it.","Script Addon - An automation script that does something or helps automate any point in the build process."]},{"l":"Patchset Addon Development","p":["The first example we will go over is for a patchsett based addon. For this, you will use a patches folder with a name following the addon_name. Along with a manifest .xml that links your addon as a .git. This will allow you to have a private repo as an addon and control access to it if needed."]},{"l":"Example patchset addon","p":["We have an example patchset addon for a change that can be found in /bigblissdrive03/bass-wg01/assets/examples/addon_templates/patchsets-network_options. Take a look at the README.md for that to get a good idea of the info we include as a starting point."]},{"l":"Where things go","p":["When syncing the Bass OS project, you will want to place the patchset addon folder ( patchsets-addon_name) in the private/addons/ folder. This location will be searched when the project is unfolded, and any manifest file found will be synced in the unfolding process. After sync is complete, any patches that are required for the addon will be automatically applied."]},{"l":"Manifest","p":["The manifest file should point to the path: vendor/bass/patches/patchsets-addon_name. You should also name the manifest file the unique name of your addon. The remote name defined within the manifest .xml should also be unique to your addon."]},{"l":"Patchset","p":["0001-change_name-1-of-3.patch","0001-change_name-2-of-3.patch","0001-change_name-3-of-3.patch","addon_name","bootable","common","device","Example:","generic","manifest","newinstaller","patchsets_addon_name","private-addon_name.xml","README.md","recovery","The patchset should be organized in multiple folders within the addon_name folder of your addon."]}],[{"i":"bass---high-level-overview","l":"Bass - High Level Overview","p":["Bass (Broad Apparatus Support System) is the combined operation of the various layers used in the Android OS stack that provides vendors, users, businesses, etc with additional configuration options that may be required to fine-tune a generic Android image to their hardware."]},{"l":"Overview","p":["Bass comes with a number of parts that work together to make the system configurable and reliable as well as save time and effort."]},{"i":"bass---system-architecture","l":"Bass - System Architecture","p":["Bass - System Architecture The various parts added to Android with Bass are as follows:","BASS Configurable HAL's: These are switchable Hardware Abstraction Layers for Graphics cards & rendering engines, audio interfaces, network interfaces, input & sensor interfaces, and more.","BASS Apps & Services: These are the various apps and system services that interface with the hardware and added configurations and allow for a tailored out of the box solution using a generic build.","BASS Vendor Configuration Layer: This layer is what handles the targeted look and feel as well the individual configurations specific to the brand or target application.","Vendor Addons, Apps & Services: These are all the private parts of the system that are not open-source or parts not meant for a generic audience. This provides the interface and middleware required for the addons and vendor specific apps or services to be included in the system that are specific to that devices target audience."]}],[{"i":"bass-os---android-12l","l":"Bass OS - Android 12L","p":["License","Please refer to https://bliss-bass.blisscolabs.dev for release notes, hardware requirements and demos of the various options."]},{"l":"Licensing","p":["Much of Bass OS is published under the General Public License 3.0. All generic patches are regularly submitted to Bliss OS where they can be obtained under the Apache License.","Bass OS does have a number of options, features, applications, etc. that can be accessed through purchasing licensing for the private addons, features and tools. See our licensing page for full details"]},{"i":"warning","l":"Warning!","p":["Bass OS is an open-source initiative maintained by Bliss Co-Labs. It is provided \"as is\" without any warranties or guarantees."]},{"l":"Building from sources","p":["Before building, ensure your system has at least 16 CPU cores, 32GB of RAM, a swap file is at least 16GB, and 500GB-700GB of free disk space available."]},{"l":"Install system packages","p":["(Ubuntu 22.04 LTS is only supported. Building on other distributions can be done using docker)","Install AOSP required packages.","Install additional packages","Install additional packages (for building mesa3d, libcamera, and other meson-based components)","Install the repo tool"]},{"l":"Fetching the sources and building the project"},{"l":"Setting up Bass OS Source","p":["#####!!NOTICE FOR LICENSED ADDONS/FEATURES!! If you hold an active license for any of the private addons and features for Bass OS, you will need to add the files that you were sent or given acces to, into the private/addons or private/manifests folder. If your project requires any vendor patches, those are placed in the patches-vendor/ folder. Once all items are placed properly, you can continue onto the unfolding steps. Please also check your organizations Bass-OS project folder to make sure it didn't come with those additions already added."]},{"l":"Unfolding the source","p":["Bass source uses an unfolding sequence to grab the latest stable point in development for the source, then applies any required changes on top, along with any customizations, licensed addons, modules, etc.","To start the unfolding process, we use the unfold_bliss.sh script:","This will sync the source, and patch it with the latest available updates for Bass OS. Once complete and all patches, and addons are applied successfully, you can move onto the next step."]},{"l":"Building Bass OS"},{"i":"build-options","l":"Build Options:"},{"i":"target-specific-build-scripts","l":"Target Specific build scripts:","p":["(!!NOTICE FOR LICENSED CUSTOMERS!!) If you have been supplied with the source, then chances are your source comes with a separate build script specific to your devices needs. Please check the project folder for a script with your product name or invoice number in it. Examples: build_ABC01.0.1.sh or build_Intel-AC013.sh. These will include the specific set of arguments passed to the build_bass script, so all you will need to do is run your targeted script to build."]},{"i":"general-build-script-usage","l":"General Build Script Usage:","p":["We offer a number of options to configure your builds with. You can use the -h argument to see the latest integrations available. We also symlink the build-x86 command with build_bass.sh and build-x86.sh, so the commands both act the same when building Bass OS","Example:"]},{"i":"features","l":"Features:","p":["Supports various navigation & UI switches","Supports various use-case launcher options (requires recent changes to vendor/agp-apps)","Automatically updates Grub menus and other build configs for launcher and mode options (requires recent changes to vendor/agp-apps)","Please note that some of the build options may require licensed access to the feature/addon/application in order to use it. In some cases, the build will continue with just a warning when these options are used. In other cases, the build will exit. To remedy this, use a different option or remove the offending option from the build command."]},{"l":"Examples","p":["Here are a few examples to help in understanding:","Bass Desktop: Desktop mode demo of Bass featuring SmartDock","Bass Restricted: Restricted mode demo of Bass featuring Bliss Restricted Launcher","Bass POS: Point-Of-Sale version of Bass featuring TabShop","Bass Tablet Go: Android Go based Tablet version of Bass OS"]},{"l":"Vendor Customization Layer","p":["If you have licensed access to the vendor customization layer for Bass OS, it comes with an easy to use menu driven interface for rebranding the OS. Below are a few combinations of the various command options put together in the form of Collections."]},{"l":"Features available","p":["Menu driven interface for updating assets and branding: Bass - Customization menu","Generates default wallpaper overlays","Generates branded bootanimation based on a single loop of frames","Generates branded grub background"]},{"l":"Notes","p":["Depending on your hardware and internet connection, downloading and building may take 8h or more.","After the successful build, find the images at iso/ under the folder name based on your build name generated by the build system and can also be found in aosptree/out/target/product/x86_64/."]}],[{"l":"Contributing to Bass OS","p":["We are not going to require any elitist rules for you to contribute to the project. That's just silly. So this doc will cover the various parts of the project and explain how to do things."]},{"l":"General Development","p":["This project contains many scripts and tools that help aid the support, feature selection, and option customization for Bass OS. Most of those scripts use bash and can also interface with the easy-menu-system we include."]},{"l":"Addon Development","p":["We can start with addon development as that will give you a good concept of how things are put together.","Let's say that you have a change that you want to add to Bass OS, but that change can be used on many devices, so you don't want to keep it as a private change that is never shared outside this single devices source. This is where Addons come into play.","Addons can consist of one or more of the following:","Patchsets - Single or multiple sets of patches that are to be applied on-top of the source when unfolding the OS.","Prebuilt APK's - An example of this is the Restricted Launcher Pro. We offer the free version of the prebuilt for all to include, but it contains branding that cannot be changed. But we offer the Pro version that can be rebranded and further customized as an addon.","Package/External Sources - An example of this is our Kiosk Launcher, as that requires the private source to be included in the OS in order to use it.","Script Addon - An automation script that does something or helps automate any point in the build process."]},{"l":"Patchset Addon Development","p":["The first example we will go over is for a patchsett based addon. For this, you will use a patches folder with a name following the addon_name. Along with a manifest .xml that links your addon as a .git. This will allow you to have a private repo as an addon and control access to it if needed."]},{"l":"Example patchset addon","p":["We have an example patchset addon for a change that can be found in /bigblissdrive03/bass-wg01/assets/examples/addon_templates/patchsets-network_options. Take a look at the README.md for that to get a good idea of the info we include as a starting point."]},{"l":"Where things go","p":["When syncing the Bass OS project, you will want to place the patchset addon folder ( patchsets-addon_name) in the private/addons/ folder. This location will be searched when the project is unfolded, and any manifest file found will be synced in the unfolding process. After sync is complete, any patches that are required for the addon will be automatically applied."]},{"l":"Manifest","p":["The manifest file should point to the path: vendor/bass/patches/patchsets-addon_name. You should also name the manifest file the unique name of your addon. The remote name defined within the manifest .xml should also be unique to your addon."]},{"l":"Patchset","p":["0001-change_name-1-of-3.patch","0001-change_name-2-of-3.patch","0001-change_name-3-of-3.patch","addon_name","bootable","common","device","Example:","generic","manifest","newinstaller","patchsets_addon_name","private-addon_name.xml","README.md","recovery","The patchset should be organized in multiple folders within the addon_name folder of your addon."]}],[{"l":"Development FAQ","p":["Much of what we are doing with Android source is lacking proper documentation as to what it does, and how. This document will try to answer a few of those questions.","What is bootable/newinstaller repo ? What is the purpose of it ? what does it contain ?","Bootable/newinstaller was initally created to handle the ramdisk.img, initrd.img and install.img creation, as well as packaging the final .iso/.img/,rpm file. This means it contains a set of scripts for the initrd image, a set of scripts for ths te installer image, and scripts to setup the filesystem and root environment.","How grub is handled in BlissOS ? How does it show first when normal AndroidOS boots straight to bootanimation ?","This is done by using the typical Linux method for booting with initrd.img, kernel, and system.img/ramdisk.img, where a grub menuentry is created that references the location of each img, and loads itlike normal linux would. The initrd.img and kernel load first, then after zygote loads, the init.sh file takes over and set's up the remaining hardware dynamically, and then initiallizes the graphics composer.","How does it recognize PC Bios on reboot ? as normally there is Bootloader in Android devices!","See above answers","What are the different Partitions that BlissOS Requires for running? This is in terms of Developer point of view nd not user! Does it have same partition table as that of any Android mobile ?","See above answers, with the addition of the install process creating a data.img or data folder on the install partiton, and that is detected by the initrd startup scripts and set as Internal Storage.","What type of kernels BlissOS supports or in general an Android-x86 support ? r there any specific one's ?","Linux/Google Android 11/12 LTS kernels, with about 20-30 patches added on top to support our filesystem and modularize all the drivers or options."]}],[{"l":"Maintaining Proper Authorship","p":["One of the most important things you need to keep in mind while working on open-source projects is maintaining correct authorship. In this article, we'll show you why maintaining proper authorship is important, give you a couple examples on correct and incorrect commits, and show you the overall procedure of correctly pulling in commits from others."]},{"i":"what-is-kanging","l":"What is \"kanging\"?","p":["[https://www.urbandictionary.com/define.php?term=kanged Kanging] is a term used in the Android development community for the action of passing off someone else's code as one's own, intentionally or unintentionally."]},{"i":"why-is-kanging-bad","l":"Why is kanging bad?","p":["Kanging is bad because the developers who worked hard on the commits do not get the recognition they deserve. Over time, this may cause the developer to quit releasing public source code or even retire from the Android development community. This has definitely happened before!"]},{"i":"kanging-examples-what-you-should-avoid-doing","l":"Kanging examples (what you should avoid doing)","p":["'''Example 1:''' You're trying to cherry-pick some commits from a different repository, but keep running into git merge issues. Out of frustration, you copy the code from the commit, and then just commit it using git commit -a. Satisfied, you push it up to GitHub.","'''Example 2:''' You bring up a bunch of commits, and squash them before pushing to GitHub.","'''Example 3:''' You intentionally want to pass off another developer's work as your own. You cherry-pick the commit, and then amend the commit to rewrite the author information.","Let's go over why this is wrong. Example 1 is an example of an unintentional kang. You didn't want to resolve the git merge issues, so decided to just copy the code and commit it as your own. This is bad because the author information does not get transferred over with your copy, which you have to specify manually.","Example 2 is more of an accident. If you squash multiple commits, all authorship information for the range of commits is lost. In addition, it becomes a real headache for other developers if something in the range of your commits is wrong. Because you cannot individually revert commits in a squash, squashing is very much discouraged and should ONLY be used when you have a lot of commits that you committed yourself and are small in nature.","Example 3 is an example of an intentional kang. We won't explain why because it should be fairly obvious."]},{"l":"How to maintain proper authorship","p":["The process is fairly simple yet important to understand.","If you are cherry-picking commits, the authorship information is transferred automatically. Provided that you are running git cherry-pick, the entire commit information, down to when the commit was created, is picked into your repository. You don't have to do anything in this case.","If you are committing someone else's code yourself, then you must manually specify who the author is. There are a lot of reasons why you would do this, from merge issues to incompatible code with the existing codebase. To manually specify an author, follow the [[#Manually specifying an author | Manually specifying an author section below]].","Finally, do NOT squash a range of commits that are not your own. This completely wipes authorship information from the range of commits and causes a massive headache for other developers."]},{"l":"Manually specifying an author","p":["You need to first determine the original author's name and email address.","GitHub no longer shows the author information when you mouse over the profile picture, which is quite unfortunate. However, there is an easy workaround.","Go to the commit that you want to pick. [https://github.com/BlissRoms/Documentation-release/commit/5ae1c6c4441786cd3ad5bd1773c831ba13cd86bc We'll use my commit as an example.]","Add the word .patch, with the period, to the end of the URL and press Enter to navigate to the raw patch.","In the patch, find the section that contains the author. It should be at the top of the page.","Now, it's time to commit with the correct author information. Make the necessary changes, and then commit using this command:","Following the example, I would write:","Once done, push to GitHub or Gerrit."]}],[{"l":"Porting Linux Drivers","p":["When it seems that there might be a missing driver or hardware support for your specific device, the best way to add support for that is o search online for a Linux kernel module for your target component.","Once you've tracked down or created Linux drivers for your device, you have to turn it into a Linux kernel module, and then add it to external/kernel-drivers for it to be included in the current kernel build. Examples of others we add are here https://github.com/BlissRoms-x86/external_kernel-drivers/tree/r11-r36","The examples only add one Android.mk file, and the one I use is generic for just about any kernel module that has a standard MAKEFILE, not a MAKEFILE.am file.","So you should really only need to add your kernel module folder to external/kernel-drivers/ and copy the Android.mk into it, then build source as normal. It'll get picked up as one of the last steps in building and packaging the kernel","Once you have it packaged up, it's best practice to compile the full source and test that it is functioning properly, and once confirmed, submit the change to https://github.com/BlissRoms-x86/external_kernel-drivers as a pull-request."]}],[{"i":"what-are-linux-drivers","l":"What are Linux Drivers?","p":["For those looking to help gain a better understanding of how Linux drivers work, here is a YouTube video that helps to explain things a bit https://youtu.be/juGNPLdjLH4"]}],[{"l":"Admin Restriction","p":["Some Bass Lockdown builds come with a password restricted Admin mode. We use a grub flag to pass the password through to the system, which then creates a sha256 hash of that string and compares it against the hash saved within the system. In order to enter Admin mode, you must manually boot into Grub by tapping the ‘shift’ key while booting, and select the Admin mode menu option, then tap ‘e’ to edit. From there, you will add:","Where ‘your_companies_complex_password_schema1234’ is replaced with the password set in the source. Failure to enter the correct password here will result in the device rebooting into Lockdown mode.","In order to meet the strict security needs, changes in the bootloader are made to always default to Lockdown mode. So in the event of a failed password attempt, the device will reboot and boot back into the default Lockdown mode unless the user prompts the grub menu to show and enters the correct bootmode password in order to boot into Admin mode or Debugging Admin mode."]},{"l":"Creating a New Admin Password","p":["To create a new Admin mode password, you will need to generate a new hash and update the source file located at vendor/branding/security/blissmode_password. The supported characters for the password are (24 characters [a-z][A-Z][0-9][@#$%&]). To generate a new hash, we use the simple script:","In order to confirm that a set password is working, you can run a check on the hashed sum values from Linux: \\","We also leave feedback of a password check success or failure in the debugging shell at boot. To access that, please select the Debugging Admin boot option from Grub."]}],[{"i":"internet-restriction-dns","l":"Internet Restriction (DNS)","p":["In some cases, the system is equipped with an internet restriction method that is active while the device is in Lockdown mode."]},{"l":"Updating the DNS configuration","p":["In order to configure what websites and IP addresses are allowed to be accessed, we use a DNS configuration that follows the server rules found in Googles dnsmasq.conf example. By default, the blissdns.conf file contains the following settings:"]}],[{"l":"Updating Bliss Bass builds","p":["We support a variety of methods for updating Bliss Bass builds. Our installwe is simular to Bliss OS, but we add a few product focused options and features."]},{"i":"manually---usb-installer","l":"Manually - USB Installer","p":["When installed this way, you can easily update to the newest versions of your Bliss Bass by running the USB installer and selecting the EXT4 partition, and select Do Not Format. This will retain the data from the previous install."]},{"i":"manually---usb-oem-update","l":"Manually - USB OEM Update","p":["If you have installed the OS using the Bootable USB installer, then you can also update the OS manually by inserting the USB with the new version of BlissBass on it, and on Grub boot menu, navigate to OEM Install > OEM Update","Once selected, the device will boot into the OEM installer and auto-update the existing OS on the device."]},{"i":"ota---local-streaming","l":"OTA - Local Streaming","p":["The UpdateService AIDL allows us to stream an OTA zip from the local device or network attached endpoint.","The UpdaterSDK interface has three main parts: \\"]},{"i":"iupdateraidl","l":"IUpdater.aidl"},{"i":"iupdatercallbackaidl","l":"IUpdaterCallback.aidl"},{"i":"updateiteminfoaidl","l":"UpdateItemInfo.aidl","p":["You can use the BlissUpdaterSDK-debug.aar from your target app to stream all required update information to the BlissUpdater app and system update engine."]},{"i":"example-updaterclient","l":"Example: UpdaterClient","p":["The UpdaterClient app acts as an example app for interfacing with the BlissUpdaterSDK. The apps MainActivity calls the AIDL methods with each button, and prints out the output in the textbox above.","alt_text","Clicking Select update file will launch the ACTION_GET_CONTENT intent and then the ParcelFileDescriptor will be passed to the UpdaterManager.importUpdate. And the import process is triggered, import results can be observed from callbacks onImportStarted and onImportCompleted","Once the import status is complete, the output will be the imported files information:","Using the imported ID (in this case, local), we can enter the ID and initiate the Install process:","From there, it will also register the updater service notification:","Once the install process starts, it will have a status of 9 and you can track the installProgress percentage.","And after that is complete the finalizing process is started and set to true and the installProgress will track the process percentage.","Then after receiving a status of 10 (Installed) or 5 (tmp zip Deleted), then the updater service will trigger for a restart. And we can display that in the example by enabling that action","The restart is carried out by the BlissPowerManager:"]},{"i":"ota---local-server","l":"OTA - Local Server","p":["By default, testing OTA on an unsecured HTTP server is disabled. In order to test OTA, you will need to setup a secured HTTPS nginx server, or change this line in the Updater package to True: https://github.com/BlissRoms/platform_packages_apps_BlissUpdater/blob/arcadia-next/AndroidManifest.xml#L23 Then recompile BlissBass to disable this security measure."]},{"i":"manually-setting-ota-uri-address","l":"Manually setting OTA URI address:","p":["We do allow the ability to manually set the OTA update URI via kernel cmdline interface. This allows you to set the value only when needed for added security. To do so, you should add the following value:","SET_CUSTOM_OTA_URI- Sets the custom URL for OTA updates","Or you can set the following system property via ADB:","bliss.updater.uri","Setting Up The Server:","On the server, we will need to have it setup as a basic nginx web server, with the OTA update .zip located in the same folder as the update.json, with the updates/update.json file formatted like this:","The values are as follows:","“ datetime” - is calculated using the date command. Example:","“ id” - is the sha256 value. Example:","“ size” - is the size in bytes. Example:"]},{"i":"ota---dedicated-update-server","l":"OTA - Dedicated Update Server","p":["ShipperStack","BlissLabs has produced ShipperStack, and that is what we use for our update server needs. You can find more information on how to setup and host on the project documentation page.","LineageOS Updater","The updater we use is also compatible with the LineageOS updater framework. You can also find a version of that that is configured for local web servers as well here"]}],[{"l":"Power Management API","p":["We include a simple app to demonstrate the power management API."]},{"i":"bliss-power-management-aidl-interface","l":"Bliss Power Management AIDL Interface:","p":["copy paste “ system_libs/bliss-power-framework.jar” from sample app","gradle:","java:"]},{"i":"adb-interface","l":"ADB Interface:","p":[" is the method number in aidl","1: reboot","2: shutdown","3: sleep"]}],[{"l":"BlissEthernetManager"},{"l":"Setting Up Ethernet Interfaces","p":["If your version of BlissBass comes with the Eternet Manager, then you are able to setup multiple ethernet interfaces and configure them.","alt_text","Clicking on the Interfaces item allows you to select the target Ethernet interface to view/edit. You may need to click the refresh button at the top for changes to be reflected.","From there, you can set the interface as Up/Down, Unassigned/DHCP/Static, and depending on selection, you can set the interface IP, Gateway and DNS.","IP and Subnet mask are handled in the IP Address field (< IP Address>/< Subnet Mask>)","Gateway Address is handled through the Gateway Address field","DNS is handled through the DNS Addresses field"]},{"i":"bliss-ethernet-manager-aidl-interface","l":"Bliss Ethernet Manager AIDL Interface:","p":["The source package for BlissEthernet Manager contains the framework and system libs for the AIDL interface.","Gradle:","Java:","AIDLs:","alt_text"]},{"i":"bliss-ethernet-manager-adb-interface","l":"Bliss Ethernet Manager ADB Interface:","p":["We also supply a simple interface using the service framework provided by Android that allows you to set IP, DNS, and Gateway.","ADB Interface:"," is the method number in aidl","1: getAvaliableInterfaces","2: isAvaliable","3: Etc…","Examples:","getAvaliableInterfaces:","x86_64:/ # service call blissethernet 1 s16 eth0 Result: Parcel( 0x00000000: 00000000 00000002 00000004 00740065 '............e.t.' 0x00000010: 00300068 00000000 00000004 00740065 'h.0.........e.t.' 0x00000020: 00310068 00000000 'h.1..... ')","isAvaliable:","x86_64:/ # service call blissethernet 2 s16 eth0 Result: Parcel(00000000 00000001 '........')"]}],[{"l":"Using Scrcpy For Remote Management","p":["scrcpy is a popular open-source tool that allows remote access and control of your Android device using adb interface.","It comes in a number of forms:","scrcpy:","https://github.com/Genymobile/scrcpy","guiscrcpy:","https://github.com/srevinsaju/guiscrcpy","qtscrcpy:","https://github.com/barry-ran/QtScrcpy"]},{"i":"installing-guiscrcpy","l":"Installing guiscrcpy:","p":["This guide will run through using the guiscrcpy tool. We will start off by navigating to the latest releases page and downloading the \"guiscrcpy-vXXXX.X.X.dev.r.glibcX.X-x86_64.AppImage\" file as it contains all the required dependencies to run on most setups.","Once downloaded, you will want to set executable permissions for the AppImage file by right-clicking, selecting Properties, and checking the box next to Allow this file to run as an executable, then you can close the dialog.","permissions"]},{"i":"main-program","l":"Main Program:","p":["Launching the AppImage will load to display the main GUI: main GUI"]},{"i":"connecting-to-a-device","l":"Connecting to a device:","p":["To connect to a new device, you will want to make sure that you have enabled ADB over wifi from the device, located in Settings > System > Developer Options (may require you to enable developer options first). Then from the remote PC, start by clicking on the wireless icon under the options panel. From there, you can hit the refresh button to display any devices broadcasting ADB on the network, or you can type in the IP directly and tap the Connect button to connect to that device. device connection Once a device is connected, it will show the status in the grey textbox like below: device connected From here, we can close the window and continue to the next steps."]},{"l":"Remote operation of the device","p":["Once we are connected, you can select the Start Scrcpy button to remote into the device","remote display - primary screen","You can use your mouse and keyboard to operate the device, or you can use the button tools provided by guiscrcpy (moving those out of the main interaction area first)."]},{"i":"connecting-to-secondary-display","l":"Connecting to secondary display:","p":["In order to remote into the connected displays on the device, this requires us to use the \"additional flags\" preferences from within guiscrcpy, adding --display # where # is the display ID for your target display.","Example: second-display specification","After adding --display 2, we can click the Start Scrcpy button and it will remote into the secondary display connected to the device. remote display - display ID 2"]},{"i":"other-options","l":"Other Options:","p":["You can configure the options further by using the \"additional flags\" textbox. A good reference for the possibilities is the official scrcpy documentation."]}],[{"l":"Booting into generic builds"},{"i":"booting-into-generic-builds","l":"Booting into generic builds:"},{"i":"tabletpciotiiotgame-mode-builds","l":"Tablet/PC/IOT/IIOT/Game Mode builds","p":["!!WARNING!! - THESE BUILDS ARE MEANT TO REPLACE YOUR EXISTING OPERATING SYSTEM OR BE INSTALLED ON NEW HARDWARE. THESE ARE NOT INTENDED FOR DUAL-BOOTING","!!Notice!!: These builds come with A/B OTA Update support, and might not work in Live mode. Only supported installer is the Bootable USB install method we include in the .iso."]},{"l":"Booting into the OS","p":["(!!NOTICE FOR BUILDS THAT HIDE GRUB!!) When the device reboots, it will not show the grub menu by default, and automatically boot into the last known boot mode. In order to show the grub menu, tap shift multiple times while the initial BIOS boot logo is displayed. If done correctly, you will be presented with the Grub menu. If no keys are pressed, the bios boot menu will show a black screen afterwards while Grub is loading the configuration in the background.","Once the device boots into Grub, the top option or two will be our default mode (some builds offer specific boot options per CPU manufacturer: Intel Default or AMD Default) boot options.","While the Debugging modes can be found in the Other Options section of the boot menu."]}],[{"l":"Booting into lockdown builds"},{"i":"booting-into-lockdown-builds","l":"Booting into lockdown builds:"},{"i":"restricted-launcher--pos-builds","l":"Restricted Launcher & POS Builds","p":["!!WARNING!! - THESE BUILDS ARE MEANT TO REPLACE YOUR EXISTING OPERATING SYSTEM OR BE INSTALLED ON NEW HARDWARE. THESE ARE NOT INTENDED FOR DUAL-BOOTING","!!Notice!!: These builds come with A/B OTA Update support, and might not work in Live mode. Only supported installer is the Bootable USB install method we include in the .iso."]},{"l":"Booting into the OS","p":["(!!NOTICE FOR BUILDS THAT HIDE GRUB!!) When the device reboots, it will not show the grub menu by default, and automatically boot into the last known boot mode. In order to show the grub menu, tap shift multiple times while the initial BIOS boot logo is displayed. If done correctly, you will be presented with the Grub menu. If no keys are pressed, the bios boot menu will show a black screen afterwards while Grub is loading the configuration in the background.","(!!PLEASE NOTE!!): Only Admin mode will have access to the Android notification stack, navigation options, status bar, etc. In some builds, lockdown mode removes all these functions at the system level for redundancy and added security. The options used to configure those restrictions can be overridden with the following options:","Navigation: Disables the system navigation gestures options: true, false","FORCE_DISABLE_NAVIGATION=*","Navigation Gesture Handle: Disables the gestural navigation handle options: true, false","FORCE_DISABLE_NAV_HANDLE=*","Navigation Taskbar (only on large-screen devices): Disables SystemUI Taskbar (not Launcher3) options: true, false","FORCE_DISABLE_NAV_TASKBAR=*","Statusbar: Disabled the statusbar at the top of the screen (does not disable Launcher3s gesture to show notification drawer) options: true, false","FORCE_DISABLE_STATUSBAR=*"]},{"l":"Restricted Launcher Setup","p":["(!!NOTICE FOR INITIAL SETUP!!) We recommend disconnecting all but the primary display when starting up the OS. Once setup is complete, you can connect any displays and continue testing and operation.","Once the device boots into Grub, the top option or two will be our locked down mode ( Intel Default or AMD Default)","While the Admin modes can be found in the Other Options section of the boot menu.","The Restricted Launcher & POS builds will initially require setup through Admin mode. So after install, you will want to reboot, the tap the shift key until the Grub menu shows. From there, select Other Options> and select one of the Admin options from there.","Once booted, you should setup the devices wifi/network. Afterwards, you will want to tap on the Sprocket icon at the top right, and navigate to the Security tab, and tap on Change Password.","After setting the admin password, we can select the default features we want available in Lockdown mode, and navigate back to the Restricted Launcher page, and configure your Appearance, Apps and System options.","Appearance: Allows you to set the default positions/placement of the on-screen logo overlay and settings button overlay","Apps: Allows you to set your whitelisted apps up, you can also set what whitelisted apps you want to auto-launch per-display.","System: Allows you to change options for default screen timeout and on-screen keyboard display","Once setup is complete, we can then back out and test our lockdown settings by hitting the Lock icon at the top right of the home screen, or reboot the device, and select the top boot option (some builds offer specific boot options per CPU manufacturer: Intel Default or AMD Default) to enter Lockdown mode."]},{"l":"Kiosk Launcher Setup","p":["By default, the Bliss Kiosk Launcher UI will have two modes, Lockdown and Admin modes.","To configure the launcher, we want to start off by booting onto Admin mode. Then we cna start the Kiosk Launcher and configure it from there. The default password for the kiosk launcher settings is 123.","Please see BlissKioskLauncher for further details on the launchers usage."]}],[{"l":"Configuration Through Command Line Parameters","p":["Bliss OS (and the Bass builds) utilizes an expanded configuration layer, our Broad Apparatus Support System (Bass for short) allows one generic .iso to be configured through kernel command line parameters on a per-device basis. This allows end users to fine tune the performance of the OS to the capabilities of the device."]},{"l":"Intro to Kernel Command Line Parameters","p":["We use Grub, Refind, or other Linux bootloaders to boot the device once installed. The menu entry is how we also pass many of our parameters for configuring the device as well. Here is an example of a typical menu entry for Grub for Bliss OS 15.8.x:","The line we are targeting for our configuration is the one that starts with “ linux /AndroidOS/kernel”. Here are some of the explanations for the configs we support.","If your Grub menu entry looks a little different, and has some of the commands at the top, you can also edit there to add your configuration preferences."]},{"i":"supported-parameters","l":"Supported Parameters:","p":["Warning: Note that not all of the configs listed here are available in the open-source Bliss OS source, but are available through licensing the Android-Generic Project add-on for that feature, or licensing the use of our Bass builds or Bass source (which comes with most available AG add-on's) for your organization","Here are a few of the supported parameters that we support, organized by stack."]},{"i":"debugging","l":"Debugging:","p":["This will enable logging or low level debugging console before the system starts to boot Android.","This is a root console, and can be used for testing or troubleshooting. Pressing exit, twice will continue with the Android boot process.","Command:","DEBUG=*","Options:","1: high-level debugging console (logs to /tmp/log)","2: low-level debugging console (logs to /data/log.txt & /tmp/log)","You will also need to enable the console if you wish to use alt-f1/f7 virtual consoles:","Example:"]},{"i":"graphics-stack","l":"Graphics Stack:","p":["This includes a number pf parameters that we can use to customize the stack to our hardware's capabilities."]},{"i":"hardware-composer","l":"Hardware Composer:","p":["This allows us to include multiple hardware-composer options, and select the ones we want to target per-device.","By default, if you set HWC without anything like HWC=, Bliss will use drmfb-composer","Command:","HWC=*","Options:","drm: Use drm_hwcomposer","drm_celadon: Use Project Celadon's fork of drm_hwcomposer","drm_minigbm: Use drm_hwcomposer with minigbm support","drm_minigbm_celadon: Use Project Celadon's fork of drm_hwcomposer with minigbm support","Example:"]},{"i":"gralloc","l":"Gralloc:","p":["We pair up our Gralloc options to work with certain HWC options.","Command:","GRALLOC=*","Options:","gbm: This is gbm_gralloc and it's compatible with drm & drm_celadon","gbm_hack: This is gbm_gralloc but with a HACK commit to fix some issue with iris or nouveau. It's compatible with drm & drm_celadon","minigbm: This is minigbm and it's compatible with drm_minigbm, drm_minigbm_celadon","minigbm_arcvm: This is minigbm but made specifically for virgl by Google, compatible with drm_minigbm, drm_minigbm_celadon","minigbm_gbm_mesa: This is minigbm made by rsglobal which he tried to port gbm_gralloc philosophy to minigbm. Compatible with drm_minigbm, drm_minigbm_celadon","Example:"]},{"i":"gralloc4-configurations","l":"Gralloc4 Configurations:","p":["In some cases, we are working with hardware that requires Gralloc4 specs. We can force minigbm to use Gralloc4 by using:","GRALLOC4_MINIGBM: Force using gralloc4 with minigbm (only compatible with drm_minigbm_celadon)"]},{"i":"angle--software-rendering","l":"ANGLE & software rendering","p":["ANGLE is available in BlissOS 14.10 and above, if you have a device that can use Vulkan, you can try ANGLE with Vulkan backend using ANGLE=1.","Alternatively, you can also use SwiftShader Vulkan with ANGLE as a software rendering solution if you are running it inside something like a virtual machine by setting nomodeset ANGLE=1 or HWACCEL=0 ANGLE=1","There's one more option for software rendering, which is the legacy SwiftShader EGL, simply set nomodeset or HWACCEL=0 to use it.","For some virtualized methods uses, you may have a blinking cursor artifact that shows on screen. To remove this artifact, include the following boot flag: vt.global_cursor_default=0","NOTE: You may want to turn on Color Inversion when using software rendering because the color might be inverted"]},{"i":"media-stack","l":"Media Stack:"},{"i":"video-encodersdecoders","l":"Video Encoders/Decoders:","p":["By default, BlissOS will use AOSP's codec2 software decoder. We also offer a few various options that allow you to select different video decoders stack options:","CODEC2_LEVEL: This will set the C2 level (default value is 4, you can disable codeec2 completely with '0').","FFMPEG_OMX_CODEC: This will enable OMX version of FFMPEG codecs (disable codec2 with CODEC2_LEVEL=0 to use this codecs).","FFMPEG_CODEC2_PREFER: This will force Bliss to use codec2 version of FFMPEG codecs by default.","FFMPEG_HWACCEL_DISABLE: This will disable hardware accelleration for the FFMPEG codecs.","FFMPEG_CODEC_LOG: This will show more log of FFMPEG codecs, enable if you want to debug it","FFMPEG_CODEC2_DEINTERLACE& FFMPEG_CODEC2_DEINTERLACE_VAAPI: configuring deinterlacing option for FFMPEG codec2, you can find the options in this commit made by Micheal Goffioul","OMX_NO_YUV420: This will force the system to not use YUV420 color format on OMX codec (fixes some black or glitchy screens, use it with CODEC2_LEVEL=0)","FFMPEG_CODEC2_DRM: turn on/off DRM prime handle on ffmpeg codecs, 0 is the default because not any Gralloc supporting it."]},{"i":"networking","l":"Networking:","p":["We include the ability to have Ethernet appear as WiFi as some appli/cations will not work without a WiFi or Cell connection present. In order to enable this mode, we use the VIRT_WIFI boot flag: VIRT_WIFI=1"]},{"i":"disk-access","l":"Disk Access:","p":["(Available on Bliss OS 14.1x, 15.8.x, & 16.x) For use cases where you are dual booting or sharing system resources with multiple drives, you might want to enable automatic mounting of all disks within Android: INTERNAL_MOUNT=1: Allows device to mount other internal drives on boot."]},{"i":"usbpci","l":"USB/PCI:"},{"i":"usb","l":"USB:"},{"i":"usb-modes","l":"USB Modes:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Switch USB mode (ADB/Storage) !! Requires kernel configs !!:","FORCE_USE_ADB_CLIENT_MODE: Forces client mode adb settings","FORCE_USE_ADB_MASS_STORAGE: Forces USB mass_storage mode"]},{"i":"power--memory","l":"Power & Memory:"},{"i":"power","l":"Power:"},{"i":"default-sleep-mode-options","l":"Default Sleep Mode Options:","p":["deep: This option will choose the deepest sleep state supported by the hardware.","Example:","mem: This option will choose the memory state.","nonvs: This option will not save non-volatile storage (NVS) to disk before entering S4 sleep.","off: This option will choose the off state.","old_ordering: This option will use the old ACPI sleep state ordering.","s2idle: This option will choose the S2 idle state.","s3_bios: This option will use the BIOS-provided S3 sleep state.","s3_mode: This option will use the kernel's own S3 sleep state.","s3bios: This option will choose the S3 BIOS state.","s3standby: This option will choose the S3 standby state.","s4_nohwsig: This option will disable the ACPI hardware wake signal for S4 sleep.","sci_force_enable: This option will force the ACPI SCI interrupt to be enabled.","shallow: This option will choose the shallowest sleep state supported by the hardware.","The default value for acpi_sleep is s3_bios, and the suggested value for most devices is s3_mode.","The default value for mem_sleep_default is deep, and the suggested value for most devices is shallow","The following are the options for acpi_sleep(suggested values are in bold):","The following are the options for mem_sleep_default(suggested values are in bold):"]},{"l":"Other Sleep Mode Options","p":["There are a number of other Linux kernel command line options that can be used to configure sleep mode settings. Some of these options include:","acpi_sleep_default: This option specifies the default sleep mode for the system. The possible values are:","s3: Standby mode","s4: Hibernate mode","s5: Off mode","Example:","suspend_console: This option specifies whether to suspend the console when the system enters sleep mode. The possible values are:","on: The console will be suspended.","off: The console will not be suspended.","no_console_suspend: This option specifies that the console should not be suspended when the system enters sleep mode. This option overrides the value of the suspend_console option.","SUSPEND_TYPE: Set suspend type. options: mem, disk, freeze mem, freeze disk","PWR_OFF_DBLCLK: Set power off double click. options: true,false","SLEEP_STATE: Override default sleep.state property for the device"]},{"i":"intel-power-options","l":"Intel Power Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","INTEL_PSTATE_CPU_MIN_PERF_PCT/INTEL_PSTATE_CPU_MAX_PERF_PCT: Allow for adjusting intel_pstate max/min freq on boot by setting the min/max pref percent","Example:","CPU_ENERGY_PERFORMANCE_PREF: Allow for adjusting cpu energy performance Normal options: default, performance, balance_performance, balance_power, power","INTEL_PSTATE_STATUS: Set cpu scaling at boot (ie set pstate status to active/passive at boot)"]},{"i":"generic-power-options","l":"Generic Power Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_SCREEN_OFF_TIMEOUT: Set screen off timeout. options: integer in milliseconds","SET_SLEEP_TIMEOUT: Set screen sleep timeout. options: integer in milliseconds","SET_POWER_ALWAYS_ON: Set power always on. options: true or false","SET_STAY_ON_WHILE_PLUGGED_IN: Set stay on while plugged in. options: true or false"]},{"i":"generic-performance-options","l":"Generic Performance Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","FORCE_POWER_PROFILE: Sets the power_profile value. Options: ondemand, hotplug, interactive, performance","FORCE_IO_PROFILE: Sets the io_profile value. Options: ondemand, hotplug, interactive, performance","FORCE_CPU_GOV: Sets the cpu_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_CPU_SCALING_GOV: Sets the cpu_scaling_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_GPU_SCALING_GOV: Sets the gpu_scaling_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_THERMAL_THROTTLE_ENABLE: Sets the thermal_throttle_enable value. Options: (true|false)","FORCE_HW_TIMEOUT_MULTIPLIER: Force hw timeout multiplier, # X 5s. Options: (integer)"]},{"i":"memory","l":"Memory:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Example value: \"100\"","Example value: \"1024\"","Example value: \"1024M\"","Example value: \"128\"","Example value: \"16\"","Example value: \"256\"","Example value: \"32\"","Example value: \"512\"","Example value: \"512M\"","Example value: \"64\"","FORCE_ENFORCE_MIN_FREE_MB: Sets the enforce_min_free_mb value","FORCE_MAX_FREE_MEMORY: Sets the max free ram limit","FORCE_MEMORY_TRIM_ENABLE: Sets the memory_trim_enable value Options: (true|false)","FORCE_MIN_FREE_MEMORY: Sets the minimum free ram limit","FORCE_OOM_SCORE_ADJ: Sets the oom_score_adj value","FORCE_SCHED_MIN_ACTIVE_PAGES: Sets the sched_min_active_pages value","FORCE_SCHED_MIN_DIRTY_PAGES: Sets the sched_min_dirty_pages value","FORCE_SCHED_MIN_FREE_PAGES: Sets the sched_min_free_pages value","FORCE_SCHED_MIN_INACTIVE_PAGES: Sets the sched_min_inactive_pages value","FORCE_SCHED_MIN_RECLAIMABLE_PAGES: Sets the sched_min_reclaimable_pages value","FORCE_SCHED_MIN_UNRECLAIMABLE_PAGES: Sets the sched_min_unreclaimable_pages value","FORCE_SCHED_MIN_WRITEBACK_PAGES: Sets the sched_min_writeback_pages value"]},{"i":"lmkd","l":"LMKD:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Default for low-RAM devices = 10, for high-end devices = 20","Default for low-RAM devices = 30, for high-end devices = 100","FORCE_KILL_HEAVIEST_TASK: Kill heaviest eligible task (best decision) vs. any eligible task (fast decision). Default = false","FORCE_LMK_CRITICAL: The possible values of oom_adj range from -17 to +15 (Default=0).","FORCE_LMK_ENABLE: Force enable LMK Daemon Default = false (unless device is detected to have less than 2GB RAM)","FORCE_LOW_MEM: Forces the low_mem mode in Android to the specific true/false value Default = false (unless device is detected to have less than 2GB RAM)","FORCE_MINFREE_LEVELS: Use free memory and file cache thresholds for making decisions when to kill. This mode works the same way kernel lowmemorykiller driver used to work. AOSP Default = false, Our default = true","FORCE_PSI_COMPLETE_STALL_THRESHOLD: The complete PSI stall threshold, in milliseconds, for triggering critical memory notifications. If the device receives critical memory pressure notifications too late, decrease this value to trigger earlier notifications. If critical memory pressure notifications trigger unnecessarily, increase this value to make the device less sensitive to noise.","FORCE_PSI_PARTIAL_STALL_THRESHOLD: The partial PSI stall threshold, in milliseconds, for triggering low memory notification. If the device receives memory pressure notifications too late, decrease this value to trigger earlier notifications. If memory pressure notifications trigger unnecessarily, increase this value to make the device less sensitive to noise.","FORCE_SWAP_FREE_LOW_PERCENTAGE: Level of free swap as a percentage of the total swap space used as a threshold to consider the system as swap space starved.","FORCE_SWAP_UTIL_MAX: The max amount of swapped memory as a percentage of the total swappable memory. When swapped memory grows over this limit, it means that the system swapped most of its swappable memory and is still under pressure. This can happen when non-swappable allocations are generating memory pressure which can not be relieved by swapping because most of the swappable memory is already swapped out. The default value is 100, which effectively disables this check. If the performance of the device is affected during memory pressure while swap utilization is high and the free swap level is not dropping to Sets the swap_free_low_percentage, decrease the value to limit swap utilization.","FORCE_THRASHING_LIMIT_DECAY: The thrashing threshold decay expressed as a percentage of the original threshold used to lower the threshold when the system doesn’t recover, even after a kill. If continuous thrashing produces unnecessary kills, decrease the value. If the response to continuous thrashing after a kill is too slow, increase the value.","FORCE_THRASHING_LIMIT: Number of working set defaults as a percentage of the file-backed pagecache size used as a threshold to consider system thrashing its pagecache.","High end: 10 Low end: 50","High end: 100 Low end: 100","High end: 70 Low end: 200","Other options available for specialized builds:","Recommended: 700","The higher the score, more likely the associated process is to be killed by OOM-killer. If oom_adj is set to -17, the process is not considered for OOM-killing."]},{"i":"logginglogd","l":"Logging/Logd:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_MAX_LOGD: Sets the maximum logd value","Options: 1 = on, 0 = off","SET_LOGCAT_DEBUG: Enables logcat debugging","Options: true, false"]},{"i":"ota-updates","l":"OTA Updates:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_CUSTOM_OTA_URI: Sets the custom URL for OTA updates","Example:","SET_CUSTOM_OTA_URI=https://192.168.1.1/updates/update.json"]},{"i":"features","l":"Features:"},{"i":"kiosk-mode","l":"Kiosk Mode:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)",": This will add or remove the specified quick settings tile.","0: Disables the recent apps menu.","1: Displays up to 1 app in the recent apps menu.","2: Displays up to 2 apps in the recent apps menu.","3: Displays up to 3 apps in the recent apps menu.","4: Displays up to 4 apps in the recent apps menu.","5: Displays up to 5 apps in the recent apps menu.","all: This will restore all default quick settings tiles.","FORCE_DEFAULT_QS_TILES: Sets the config_defaultQsTiles value Options:","FORCE_DISABLE_NAV_HANDLE: Force disable gesture navigation handle. Options: (true|false)","FORCE_DISABLE_NAV_TASKBAR: Force disable navigation taskbar. Options: (true|false)","FORCE_DISABLE_NAVIGATION: Force disable navigation bar. Options: (true|false)","FORCE_DISABLE_RECENTS: Force disable SystemUI recents. Options: (true|false)","FORCE_DISABLE_STATUSBAR: Force disable statusbar. Options: (true|false)","FORCE_ENABLE_CLEAR_ALL_RECENTS: Sets the config_enableClearAllRecents value Options: (true|false)","FORCE_HIDE_NAVBAR_WINDOW: Force hide navigation bar window. Options: 0, 1","FORCE_SET_MAX_RECENTS: Sets the config_maxRecents value Options:","none: This will remove all default quick settings tiles.","Other options available for specialized builds:"]},{"i":"launcher-options","l":"Launcher Options:","p":["USE_LAUNCHER3: Forces Launcher3 to be set instead of secondary launcher in build","SET_SMARTDOCK_DEFAULT: Set's SmartDock as default launcher when booting into Desktop specific builds (requires a build with SmartDock included by default)","ENABLE_QUICKSTEP_TASKBAR: Set quickstep taskbar features to enabled (requires dev-options to be enabled & Launcher3 to also be enabled). options: true,false","FORCE_DESKTOP_ON_EXTERNAL: Enable desktop mode on external display (required for MultiDisplay Input). options: 0,1"]},{"i":"navigation--input-options","l":"Navigation & Input Options:","p":["androidboot.bliss.force_ime_on_all_displays=true: Force IME on secondary displays. Uses \"ro.boot.bliss.force_ime_on_all_displays\" property (true,false)","androidboot.force.navbar_on_secondary_displays=true: Allow a system property to override this for desktop mode navigation to work on secondary displays. (true/false)","ro.boot.force.right_mouse_as_back=true: Allows overriding AMOTION_EVENT_BUTTON_SECONDARY with AMOTION_EVENT_BUTTON_BACK, using a property trigger. (true/false)"]},{"i":"rotationorientation","l":"Rotation/Orientation:","p":["SET_SF_ROTATION=*: Sets surfaceflinger hardware rotation property to the value passed","SET_OVERRIDE_FORCED_ORIENT=*: Override forced orientation (true/false)","SET_SYS_APP_ROTATION=*: Forces system app rotation, and has three cases:","1.force_land: always show with landscape, if a portrait apk, system will scale up it","2.middle_port: if a portrait apk, will show in the middle of the screen, left and right will show black","3.original: original orientation, if a portrait apk, will rotate 270 degree","androidboot.android.force_rotation_on_external_displays: Set target orientation for external displays (0=0, 1=90, 2=180, 3-270)"]},{"i":"misc","l":"Misc:"},{"i":"battery-stats","l":"Battery Stats:","p":["androidboot.fake_battery=true: AOSP implementation of fake battery status","(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_FAKE_BATTERY_LEVEL: Let us fake the total battery percentage Options: (0-100)","SET_FAKE_CHARGING_STATUS: Allow forcing battery charging status Options: (0|1)"]},{"i":"package-management","l":"Package Management:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","With our package management features, we have the ability to also enable/disable various packages included in the system by default using the kernel cmdline.","Example: HIDE_APPS=com.termux,com.android.dialer,com.android.documentsui"]},{"i":"hideunhide-default-apps","l":"Hide/Unhide Default Apps:","p":["HIDE_APPS: Hides the apps via passed comma separated list","RESTORE_APPS: Restores the apps via passed comma separated list"]},{"i":"usb-mode-functions","l":"USB Mode Functions:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Allows switching default USB/ADB functions via cmdline","FORCE_USE_ADB_CLIENT_MODE: Forces USB into ADB Client mode (0=off, 1=on, 2=ADB enabled but not touching USB options)","FORCE_USE_ADB_MASS_STORAGE: Force enable ADB Mass Storage mode ofver USB (0=off, 1=on)"]},{"i":"iio-options-configuration","l":"IIO Options Configuration:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","This allows us to set ro.iio.* propertied through the following flags:","SET_IIO_ORDER: Sets ro.iio.accel.order property","SET_IIO_ACCEL_QUIRKS: Sets ro.iio.accel.quirks ptoperty","SET_IIO_ACCEL_X_OPT_SCALE: Sets ro.iio.accel.x.opt_scale property","SET_IIO_ACCEL_Y_OPT_SCALE: Sets ro.iio.accel.y.opt_scale property","SET_IIO_ANGLVEL_QUIRKS: Sets ro.iio.anglvel.quirks property","SET_IGNORE_ATKBD: Sets ro.ignore_atkbd property","SENSORS_FORCE_KBDSENSOR: Option to force kbd sensor","SET_IIO_MAGN_QUIRKS: Option to force magn quirks. Example: SET_IIO_MAGN_QUIRKS=no-trig,no-event"]},{"i":"set-timezone","l":"Set Timezone:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","To use this change, pass the grub/cmdline value for your timezone using the SET_TZ_LOCATION flag. Timezone reference can be found here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones","Example:"]},{"l":"Serial IO","p":["(Available through Android-Generic Add-On & add-ons for Bass)","SET_USB_BUS_PORTS: Sets permissions for tty ports (chmod 666) for /dev/bus/usb/*. Example: SET_USB_BUS_PORTS=001/001,001/002,001/003,001/004","SET_TTY_PORT_PERMS: Set USB bus port permissions (chmod 666) for /dev/tty*. Example: SET_TTY_PORT_PERMS=ttyS*,ttyACM*"]},{"i":"network--radio-control-options","l":"Network & Radio Control Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass)","Enable/Disable Wireless Devices (Change included only in specialized builds):","LOCKDOWN_WIRELESS_DEVICES: A kernel level switch to disable all wireless devices. options: 0,1","UNLOCKDOWN_WIRELESS_DEVICES: A kernel level switch to enable all disabled wireless devices. options: 0,1","Other Networking Options (Available in Bass builds):","FORCE_DISABLE_ALL_RADIOS: Set force disable all radios (only disables on boot, user can re-enable manually if given access). options: 0,1","FORCE_BLUETOOTH_SERVICE: Set force bluetooth service state. options: enable, disable"]}],[{"l":"Code of Conduct"},{"l":"Our Pledge","p":["We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.","We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community."]},{"l":"Our Standards","p":["Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience","Arguing over subjective preference, e.g. nationality, choice, religion, etc.","Being respectful of differing opinions, viewpoints, and experiences","Continued one-on-one communication after requests to cease","Demonstrating empathy and kindness toward other people","Encouraging a person to engage in self-harm","Examples of behavior that contributes to a positive environment for our community include:","Examples of unacceptable behavior include:","Focusing on what is best not just for us as individuals, but for the overall community","Giving and gracefully accepting constructive feedback","Other conduct which could reasonably be considered inappropriate in a professional setting","Public or private harassment","Publishing others' private information, such as a physical or email address, without their explicit permission","The use of sexualized language or imagery, and sexual attention or advances of any kind","Trolling, insulting or derogatory comments, and personal or political attacks","Unwelcome sexual or otherwise aggressive attention"]},{"l":"Enforcement Responsibilities","p":["Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.","Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate."]},{"l":"Scope","p":["This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers."]},{"l":"Enforcement","p":["Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainers responsible for enforcement at integrity@blissos.org. Participants warned to stop any harassing behavior are expected to comply immediately; failure to do so will result in an escalation of consequences. All complaints will be reviewed and investigated promptly and fairly.","All project maintainers are obligated to respect the privacy and security of the reporter of any incident."]},{"l":"Enforcement Guidelines","p":["Project maintainers will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:"]},{"l":"1. Correction","p":["Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.","Consequence: A private, written warning from project maintainers, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested."]},{"l":"2. Warning","p":["Community Impact: A violation through a single incident or series of actions.","Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban."]},{"l":"3. Temporary Ban","p":["Community Impact: A serious violation of community standards, including sustained inappropriate behavior.","Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban."]},{"l":"4. Permanent Ban","p":["Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.","Consequence: A permanent ban from any sort of public interaction within the community."]},{"l":"Attribution","p":["This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html."]}]]
\ No newline at end of file
+[[{"l":"Welcome to Bass OS Documentation"},{"l":"Table of contents"},{"l":"Install Bass OS","p":["Install From Bootable USB","Collecting bug reports"]},{"l":"Configuration","p":["Configuration through Command Line Parameters","Booting into generic builds","Booting into lockdown builds"]},{"l":"Features","p":["Admin Restriction","DNS Internet Restriction","Updates and OTA"]},{"l":"Applications","p":["Bliss Ethernet Manager","Bliss Kiosk Launcher","Bliss Restricted Launcher"]},{"l":"Interfaces","p":["Power Management API*","Bliss Ethernet Manager"]},{"l":"Development","p":["High Level Overview","Building Bass OS","Addon Development","Development FAQ","Maintaining Proper Authorship","Contributing Documentation","What are Linux Drivers?","Porting Linux Drivers"]},{"l":"Other Resources","p":["Bliss OS Documentation"]}],[{"l":"Collecting bug reports"},{"l":"Collecting Bug Reports","p":["This process is mostly the same as Android-x86 builds, but with a few additions that help things along. If you need to collect logs in order to submit a bug report, then the first thing you will want to do is reboot your Bass OS install using debug mode. We do this through Grub with the command:","Once your device starts to boot, you will be presented with a root console, just before the Android systems init process starts. From here, you can use root commands to remount as read/write, or do basic filesystem and kernel debugging. In order to proceed to Android, you will need to type 'exit' followed by Return twice in the console, and the system will continue to boot.","While in debug mode, there are logs found in both /tmp/log for early boot, as well as /data/log for Android boot. You will need those logs to submit a bug report."]}],[{"i":"#","p":["Install from bootable USB Installer"]},{"l":"Install From Bootable USB"},{"l":"Manual Install Bass OS"},{"i":"install-steps","l":"Install Steps:","p":["After this step, it will also prepare the install for A/B updates. This process will take a couple minutes at most.","Congratulations! You should now have a functional UEFI-boot with Bass OS!","Create a [new ] partition","First create the EFI partition, this is the partition that is used to install the bootloader.","for \"Size in Sectors\" all we need to do is enter +512M","Format Drive p1 Format Drive p2","From here we will want to change the drive partition scheme to be A) EFI (VFAT) B) Android (ext4). This means that we need to delete all partitions except for the top EFI partition, and create a single new partition with the remaining space. You will need to start by selecting \"Create/Modify partitions\", then remove all partitions on the device. Partitioning p1","Grab a coffee","In the next screen, we need to make two partiitons for this to work, as Bliss needs to install a bootloader to boot to. if you have a pre-existing install of linux, this step may be unnecessary.","Install Grub","Lastly we click [WRITE ] and [QUIT ]","leave First Sector default (Just press enter)","Next we need to make the second partition this is the partition that the bulk of android will be installed to.","Now that we have the drives partitioned, we can start to install android. Select the ANDROID partition that we have made before, and format it as ext4. this is the recomended format unless windows compatibility is need, in that case select NTFS. and click < Yes > on the next screen","Partitioned","Partitioning p2","press down until the largest chunk of free space is slected, and click [NEW ]","Set type as ef00 (or EFI)","The installer will begin to write the changes to the disk. This will take some time. Go grab another coffee!","The installer will procede to format and install android, you will then be prompted to install EFI GRUB2. we need to accept that, unless you have a pre-existing grub or other bootloader install","WARNING THIS WILL DELETE ANY DATA ON THE DRIVE","We can leave everything default. Although a name is not necesary we can call it ANDROID.","We don't necessairly need to name this partition, but it is best practice to name it EFI","We will want to start by booting into the installer by selecting the top Install option from Grub"]}],[{"l":"BlissEthernetManager"},{"l":"Setting Up Ethernet Interfaces","p":["If your version of BlissBass comes with the Eternet Manager, then you are able to setup multiple ethernet interfaces and configure them.","alt_text","Clicking on the Interfaces item allows you to select the target Ethernet interface to view/edit. You may need to click the refresh button at the top for changes to be reflected.","From there, you can set the interface as Up/Down, Unassigned/DHCP/Static, and depending on selection, you can set the interface IP, Gateway and DNS.","IP and Subnet mask are handled in the IP Address field (< IP Address>/< Subnet Mask>)","Gateway Address is handled through the Gateway Address field","DNS is handled through the DNS Addresses field"]},{"i":"bliss-ethernet-manager-aidl-interface","l":"Bliss Ethernet Manager AIDL Interface:","p":["The source package for BlissEthernet Manager contains the framework and system libs for the AIDL interface.","Gradle:","Java:","AIDLs:","alt_text"]},{"i":"bliss-ethernet-manager-adb-interface","l":"Bliss Ethernet Manager ADB Interface:","p":["We also supply a simple interface using the service framework provided by Android that allows you to set IP, DNS, and Gateway.","ADB Interface:"," is the method number in aidl","1: getAvaliableInterfaces","2: isAvaliable","3: Etc…","Examples:","getAvaliableInterfaces:","x86_64:/ # service call blissethernet 1 s16 eth0 Result: Parcel( 0x00000000: 00000000 00000002 00000004 00740065 '............e.t.' 0x00000010: 00300068 00000000 00000004 00740065 'h.0.........e.t.' 0x00000020: 00310068 00000000 'h.1..... ')","isAvaliable:","x86_64:/ # service call blissethernet 2 s16 eth0 Result: Parcel(00000000 00000001 '........')"]}],[{"l":"Setting Up Bliss Kiosk Launcher","p":["If your BlissBass builds comes with Bliss Kiosk Launcher, then you have the ability to restrict it’s access to various packages on the device, as well as set specific packages to auto-launch when booting the device into Lockdown mode (Intel Default), or locking the device while in Admin mode (Other Options > Intel - Admin)."]},{"i":"lockdown-mode","l":"Lockdown Mode:","p":["alt_text","In Lockdown mode, navigation bar, gesture handle and status bar are all disabled. The app drawer will only display allowed packages. Example:","While in Lockdown mode, you can access the Kiosk Launcher Settings by clicking the Exit button, and inputting the maintenance password set (default is: 123):"]},{"i":"admin-mode","l":"Admin Mode:","p":["This mode shows a sprocket next to the exit icon, and depending on boot mode, will also display the navigation handle and statusbar.","alt_text","Along with the app drawer containing all packages:"]},{"i":"configuration","l":"Configuration:","p":["Clicking on the sprocket from the home screen will launch the Kiosk Launcher Settings screen:","alt_text","From the settings screen, you can manage the Maintenance Password, Change whitelisted apps, and set which package you want to Auto Launch when Kiosk Launcher starts in Lockdown mode.","You can also test the Kiosk Launcher while within Admin mode to ensure functionality before rebooting to Lockdown mode."]}],[{"l":"Setting Up Bliss Restricted Launcher","p":["If your BlissBass builds comes with Bliss Restricted Launcher, then you have the ability to restrict it’s access to various packages on the device, as well as set specific packages to auto-launch across multiple connected displays when booting the device into Lockdown mode (Default), or locking the device while in Admin mode (Other Options > Admin)."]},{"i":"admin-mode","l":"Admin Mode:","p":["Admin mode will display both the sprocket and the lock button on the top right of the display, and allow access to navigation, statusbar, recents, and other Android features by default.","Admin mode desktop","This mode is open by default and allows for the launcher defaults to be configured."]},{"i":"configuration","l":"Configuration:","p":["Clicking on the sprocket from the home screen will launch the Restricted Launcher Settings screen:","Initial Settings Screen","The main settings screen has a number of suboptions to select from:"]},{"l":"Appearance","p":["The appearance settings screen allows you to change a number of details about the overall look and feel of the kiosk interface. Depending on the Free or Pro version of the app, there may be some options that are unavaialable like setting custom logo, and hiding/changing the logo overlay options.","Appearance Settings"]},{"l":"Apps","p":["Apps settings has all the options related to selecting your whitelisted apps and auto-launching them across multiple displays:","Apps Settings","The auto-start app options will show a list of apps for you to select from:","auto-start app selection"]},{"l":"Security","p":["The Security options is where you will initially want to set the Kiosk password, and enable/disable the various features on the kiosk that you want to be available in lockdown mode:","Security Settings"]},{"l":"System","p":["The system settings page allows you to set the kiosk screen timeout and enable/disable the on-screen keyboard (if your device has a secondary keyboard attaches, this override may be needed):","System Settings"]},{"i":"lockdown-mode","l":"Lockdown Mode:","p":["lockdown mode","You can configure Restricted Launchers Lockdown mode to have navigation bar, gesture handle and status bar are all disabled, and the app drawer will only display allowed packages.","While in Lockdown mode, you can access the Restricted Launcher Settings by clicking the sprocket at the top right of the screen, and a password prompt will display requiring the password set from Admin mode to be input:","lockdown password prompt"]}],[{"l":"Addon development"},{"l":"Addon Development","p":["Learning our addon development process will give you a good concept of how things are put together.","Let's say that you have a change that you want to add to Bass OS, but that change can be used on many devices, so you don't want to keep it as a private change that is never shared outside this single devices source. This is where Addons come into play.","Addons can consist of one or more of the following:","Patchsets - Single or multiple sets of patches that are to be applied on-top of the source when unfolding the OS.","Prebuilt APK's - An example of this is the Restricted Launcher Pro. We offer the free version of the prebuilt for all to include, but it contains branding that cannot be changed. But we offer the Pro version that can be rebranded and further customized as an addon.","Package/External Sources - An example of this is our Kiosk Launcher, as that requires the private source to be included in the OS in order to use it.","Script Addon - An automation script that does something or helps automate any point in the build process."]},{"l":"Patchset Addon Development","p":["The first example we will go over is for a patchsett based addon. For this, you will use a patches folder with a name following the addon_name. Along with a manifest .xml that links your addon as a .git. This will allow you to have a private repo as an addon and control access to it if needed."]},{"l":"Example patchset addon","p":["We have an example patchset addon for a change that can be found in /bigblissdrive03/bass-wg01/assets/examples/addon_templates/patchsets-network_options. Take a look at the README.md for that to get a good idea of the info we include as a starting point."]},{"l":"Where things go","p":["When syncing the Bass OS project, you will want to place the patchset addon folder ( patchsets-addon_name) in the private/addons/ folder. This location will be searched when the project is unfolded, and any manifest file found will be synced in the unfolding process. After sync is complete, any patches that are required for the addon will be automatically applied."]},{"l":"Manifest","p":["The manifest file should point to the path: vendor/bass/patches/patchsets-addon_name. You should also name the manifest file the unique name of your addon. The remote name defined within the manifest .xml should also be unique to your addon."]},{"l":"Patchset","p":["0001-change_name-1-of-3.patch","0001-change_name-2-of-3.patch","0001-change_name-3-of-3.patch","addon_name","bootable","common","device","Example:","generic","manifest","newinstaller","patchsets_addon_name","private-addon_name.xml","README.md","recovery","The patchset should be organized in multiple folders within the addon_name folder of your addon."]}],[{"i":"bass---high-level-overview","l":"Bass - High Level Overview","p":["Bass (Broad Apparatus Support System) is the combined operation of the various layers used in the Android OS stack that provides vendors, users, businesses, etc with additional configuration options that may be required to fine-tune a generic Android image to their hardware."]},{"l":"Overview","p":["Bass comes with a number of parts that work together to make the system configurable and reliable as well as save time and effort."]},{"i":"bass---system-architecture","l":"Bass - System Architecture","p":["Bass - System Architecture The various parts added to Android with Bass are as follows:","BASS Configurable HAL's: These are switchable Hardware Abstraction Layers for Graphics cards & rendering engines, audio interfaces, network interfaces, input & sensor interfaces, and more.","BASS Apps & Services: These are the various apps and system services that interface with the hardware and added configurations and allow for a tailored out of the box solution using a generic build.","BASS Vendor Configuration Layer: This layer is what handles the targeted look and feel as well the individual configurations specific to the brand or target application.","Vendor Addons, Apps & Services: These are all the private parts of the system that are not open-source or parts not meant for a generic audience. This provides the interface and middleware required for the addons and vendor specific apps or services to be included in the system that are specific to that devices target audience."]}],[{"i":"bass-os---android-12l","l":"Bass OS - Android 12L","p":["License","Please refer to https://bliss-bass.blisscolabs.dev for release notes, hardware requirements and demos of the various options."]},{"l":"Licensing","p":["Much of Bass OS is published under the General Public License 3.0. All generic patches are regularly submitted to Bliss OS where they can be obtained under the Apache License.","Bass OS does have a number of options, features, applications, etc. that can be accessed through purchasing licensing for the private addons, features and tools. See our licensing page for full details"]},{"i":"warning","l":"Warning!","p":["Bass OS is an open-source initiative maintained by Bliss Co-Labs. It is provided \"as is\" without any warranties or guarantees."]},{"l":"Building from sources","p":["Before building, ensure your system has at least 16 CPU cores, 32GB of RAM, a swap file is at least 16GB, and 500GB-700GB of free disk space available."]},{"l":"Install system packages","p":["(Ubuntu 22.04 LTS is only supported. Building on other distributions can be done using docker)","Install AOSP required packages.","Install additional packages","Install additional packages (for building mesa3d, libcamera, and other meson-based components)","Install the repo tool"]},{"l":"Fetching the sources and building the project"},{"l":"Setting up Bass OS Source","p":["#####!!NOTICE FOR LICENSED ADDONS/FEATURES!! If you hold an active license for any of the private addons and features for Bass OS, you will need to add the files that you were sent or given acces to, into the private/addons or private/manifests folder. If your project requires any vendor patches, those are placed in the patches-vendor/ folder. Once all items are placed properly, you can continue onto the unfolding steps. Please also check your organizations Bass-OS project folder to make sure it didn't come with those additions already added."]},{"l":"Unfolding the source","p":["Bass source uses an unfolding sequence to grab the latest stable point in development for the source, then applies any required changes on top, along with any customizations, licensed addons, modules, etc.","To start the unfolding process, we use the unfold_bliss.sh script:","This will sync the source, and patch it with the latest available updates for Bass OS. Once complete and all patches, and addons are applied successfully, you can move onto the next step."]},{"l":"Building Bass OS"},{"i":"build-options","l":"Build Options:"},{"i":"target-specific-build-scripts","l":"Target Specific build scripts:","p":["(!!NOTICE FOR LICENSED CUSTOMERS!!) If you have been supplied with the source, then chances are your source comes with a separate build script specific to your devices needs. Please check the project folder for a script with your product name or invoice number in it. Examples: build_ABC01.0.1.sh or build_Intel-AC013.sh. These will include the specific set of arguments passed to the build_bass script, so all you will need to do is run your targeted script to build."]},{"i":"general-build-script-usage","l":"General Build Script Usage:","p":["We offer a number of options to configure your builds with. You can use the -h argument to see the latest integrations available. We also symlink the build-x86 command with build_bass.sh and build-x86.sh, so the commands both act the same when building Bass OS","Example:"]},{"i":"features","l":"Features:","p":["Supports various navigation & UI switches","Supports various use-case launcher options (requires recent changes to vendor/agp-apps)","Automatically updates Grub menus and other build configs for launcher and mode options (requires recent changes to vendor/agp-apps)","Please note that some of the build options may require licensed access to the feature/addon/application in order to use it. In some cases, the build will continue with just a warning when these options are used. In other cases, the build will exit. To remedy this, use a different option or remove the offending option from the build command."]},{"l":"Examples","p":["Here are a few examples to help in understanding:","Bass Desktop: Desktop mode demo of Bass featuring SmartDock","Bass Restricted: Restricted mode demo of Bass featuring Bliss Restricted Launcher","Bass POS: Point-Of-Sale version of Bass featuring TabShop","Bass Tablet Go: Android Go based Tablet version of Bass OS"]},{"l":"Vendor Customization Layer","p":["If you have licensed access to the vendor customization layer for Bass OS, it comes with an easy to use menu driven interface for rebranding the OS. Below are a few combinations of the various command options put together in the form of Collections."]},{"l":"Features available","p":["Menu driven interface for updating assets and branding: Bass - Customization menu","Generates default wallpaper overlays","Generates branded bootanimation based on a single loop of frames","Generates branded grub background"]},{"l":"Notes","p":["Depending on your hardware and internet connection, downloading and building may take 8h or more.","After the successful build, find the images at iso/ under the folder name based on your build name generated by the build system and can also be found in aosptree/out/target/product/x86_64/."]}],[{"l":"Contributing to Bass OS","p":["We are not going to require any elitist rules for you to contribute to the project. That's just silly. So this doc will cover the various parts of the project and explain how to do things."]},{"l":"General Development","p":["This project contains many scripts and tools that help aid the support, feature selection, and option customization for Bass OS. Most of those scripts use bash and can also interface with the easy-menu-system we include."]},{"l":"Addon Development","p":["We can start with addon development as that will give you a good concept of how things are put together.","Let's say that you have a change that you want to add to Bass OS, but that change can be used on many devices, so you don't want to keep it as a private change that is never shared outside this single devices source. This is where Addons come into play.","Addons can consist of one or more of the following:","Patchsets - Single or multiple sets of patches that are to be applied on-top of the source when unfolding the OS.","Prebuilt APK's - An example of this is the Restricted Launcher Pro. We offer the free version of the prebuilt for all to include, but it contains branding that cannot be changed. But we offer the Pro version that can be rebranded and further customized as an addon.","Package/External Sources - An example of this is our Kiosk Launcher, as that requires the private source to be included in the OS in order to use it.","Script Addon - An automation script that does something or helps automate any point in the build process."]},{"l":"Patchset Addon Development","p":["The first example we will go over is for a patchsett based addon. For this, you will use a patches folder with a name following the addon_name. Along with a manifest .xml that links your addon as a .git. This will allow you to have a private repo as an addon and control access to it if needed."]},{"l":"Example patchset addon","p":["We have an example patchset addon for a change that can be found in /bigblissdrive03/bass-wg01/assets/examples/addon_templates/patchsets-network_options. Take a look at the README.md for that to get a good idea of the info we include as a starting point."]},{"l":"Where things go","p":["When syncing the Bass OS project, you will want to place the patchset addon folder ( patchsets-addon_name) in the private/addons/ folder. This location will be searched when the project is unfolded, and any manifest file found will be synced in the unfolding process. After sync is complete, any patches that are required for the addon will be automatically applied."]},{"l":"Manifest","p":["The manifest file should point to the path: vendor/bass/patches/patchsets-addon_name. You should also name the manifest file the unique name of your addon. The remote name defined within the manifest .xml should also be unique to your addon."]},{"l":"Patchset","p":["0001-change_name-1-of-3.patch","0001-change_name-2-of-3.patch","0001-change_name-3-of-3.patch","addon_name","bootable","common","device","Example:","generic","manifest","newinstaller","patchsets_addon_name","private-addon_name.xml","README.md","recovery","The patchset should be organized in multiple folders within the addon_name folder of your addon."]}],[{"l":"Development FAQ","p":["Much of what we are doing with Android source is lacking proper documentation as to what it does, and how. This document will try to answer a few of those questions.","What is bootable/newinstaller repo ? What is the purpose of it ? what does it contain ?","Bootable/newinstaller was initally created to handle the ramdisk.img, initrd.img and install.img creation, as well as packaging the final .iso/.img/,rpm file. This means it contains a set of scripts for the initrd image, a set of scripts for ths te installer image, and scripts to setup the filesystem and root environment.","How grub is handled in BlissOS ? How does it show first when normal AndroidOS boots straight to bootanimation ?","This is done by using the typical Linux method for booting with initrd.img, kernel, and system.img/ramdisk.img, where a grub menuentry is created that references the location of each img, and loads itlike normal linux would. The initrd.img and kernel load first, then after zygote loads, the init.sh file takes over and set's up the remaining hardware dynamically, and then initiallizes the graphics composer.","How does it recognize PC Bios on reboot ? as normally there is Bootloader in Android devices!","See above answers","What are the different Partitions that BlissOS Requires for running? This is in terms of Developer point of view nd not user! Does it have same partition table as that of any Android mobile ?","See above answers, with the addition of the install process creating a data.img or data folder on the install partiton, and that is detected by the initrd startup scripts and set as Internal Storage.","What type of kernels BlissOS supports or in general an Android-x86 support ? r there any specific one's ?","Linux/Google Android 11/12 LTS kernels, with about 20-30 patches added on top to support our filesystem and modularize all the drivers or options."]}],[{"l":"Maintaining Proper Authorship","p":["One of the most important things you need to keep in mind while working on open-source projects is maintaining correct authorship. In this article, we'll show you why maintaining proper authorship is important, give you a couple examples on correct and incorrect commits, and show you the overall procedure of correctly pulling in commits from others."]},{"i":"what-is-kanging","l":"What is \"kanging\"?","p":["[https://www.urbandictionary.com/define.php?term=kanged Kanging] is a term used in the Android development community for the action of passing off someone else's code as one's own, intentionally or unintentionally."]},{"i":"why-is-kanging-bad","l":"Why is kanging bad?","p":["Kanging is bad because the developers who worked hard on the commits do not get the recognition they deserve. Over time, this may cause the developer to quit releasing public source code or even retire from the Android development community. This has definitely happened before!"]},{"i":"kanging-examples-what-you-should-avoid-doing","l":"Kanging examples (what you should avoid doing)","p":["'''Example 1:''' You're trying to cherry-pick some commits from a different repository, but keep running into git merge issues. Out of frustration, you copy the code from the commit, and then just commit it using git commit -a. Satisfied, you push it up to GitHub.","'''Example 2:''' You bring up a bunch of commits, and squash them before pushing to GitHub.","'''Example 3:''' You intentionally want to pass off another developer's work as your own. You cherry-pick the commit, and then amend the commit to rewrite the author information.","Let's go over why this is wrong. Example 1 is an example of an unintentional kang. You didn't want to resolve the git merge issues, so decided to just copy the code and commit it as your own. This is bad because the author information does not get transferred over with your copy, which you have to specify manually.","Example 2 is more of an accident. If you squash multiple commits, all authorship information for the range of commits is lost. In addition, it becomes a real headache for other developers if something in the range of your commits is wrong. Because you cannot individually revert commits in a squash, squashing is very much discouraged and should ONLY be used when you have a lot of commits that you committed yourself and are small in nature.","Example 3 is an example of an intentional kang. We won't explain why because it should be fairly obvious."]},{"l":"How to maintain proper authorship","p":["The process is fairly simple yet important to understand.","If you are cherry-picking commits, the authorship information is transferred automatically. Provided that you are running git cherry-pick, the entire commit information, down to when the commit was created, is picked into your repository. You don't have to do anything in this case.","If you are committing someone else's code yourself, then you must manually specify who the author is. There are a lot of reasons why you would do this, from merge issues to incompatible code with the existing codebase. To manually specify an author, follow the [[#Manually specifying an author | Manually specifying an author section below]].","Finally, do NOT squash a range of commits that are not your own. This completely wipes authorship information from the range of commits and causes a massive headache for other developers."]},{"l":"Manually specifying an author","p":["You need to first determine the original author's name and email address.","GitHub no longer shows the author information when you mouse over the profile picture, which is quite unfortunate. However, there is an easy workaround.","Go to the commit that you want to pick. [https://github.com/BlissRoms/Documentation-release/commit/5ae1c6c4441786cd3ad5bd1773c831ba13cd86bc We'll use my commit as an example.]","Add the word .patch, with the period, to the end of the URL and press Enter to navigate to the raw patch.","In the patch, find the section that contains the author. It should be at the top of the page.","Now, it's time to commit with the correct author information. Make the necessary changes, and then commit using this command:","Following the example, I would write:","Once done, push to GitHub or Gerrit."]}],[{"l":"Porting Linux Drivers","p":["When it seems that there might be a missing driver or hardware support for your specific device, the best way to add support for that is o search online for a Linux kernel module for your target component.","Once you've tracked down or created Linux drivers for your device, you have to turn it into a Linux kernel module, and then add it to external/kernel-drivers for it to be included in the current kernel build. Examples of others we add are here https://github.com/BlissRoms-x86/external_kernel-drivers/tree/r11-r36","The examples only add one Android.mk file, and the one I use is generic for just about any kernel module that has a standard MAKEFILE, not a MAKEFILE.am file.","So you should really only need to add your kernel module folder to external/kernel-drivers/ and copy the Android.mk into it, then build source as normal. It'll get picked up as one of the last steps in building and packaging the kernel","Once you have it packaged up, it's best practice to compile the full source and test that it is functioning properly, and once confirmed, submit the change to https://github.com/BlissRoms-x86/external_kernel-drivers as a pull-request."]}],[{"i":"what-are-linux-drivers","l":"What are Linux Drivers?","p":["For those looking to help gain a better understanding of how Linux drivers work, here is a YouTube video that helps to explain things a bit https://youtu.be/juGNPLdjLH4"]}],[{"l":"Admin Restriction","p":["Some Bass Lockdown builds come with a password restricted Admin mode. We use a grub flag to pass the password through to the system, which then creates a sha256 hash of that string and compares it against the hash saved within the system. In order to enter Admin mode, you must manually boot into Grub by tapping the ‘shift’ key while booting, and select the Admin mode menu option, then tap ‘e’ to edit. From there, you will add:","Where ‘your_companies_complex_password_schema1234’ is replaced with the password set in the source. Failure to enter the correct password here will result in the device rebooting into Lockdown mode.","In order to meet the strict security needs, changes in the bootloader are made to always default to Lockdown mode. So in the event of a failed password attempt, the device will reboot and boot back into the default Lockdown mode unless the user prompts the grub menu to show and enters the correct bootmode password in order to boot into Admin mode or Debugging Admin mode."]},{"l":"Creating a New Admin Password","p":["To create a new Admin mode password, you will need to generate a new hash and update the source file located at vendor/branding/security/blissmode_password. The supported characters for the password are (24 characters [a-z][A-Z][0-9][@#$%&]). To generate a new hash, we use the simple script:","In order to confirm that a set password is working, you can run a check on the hashed sum values from Linux: \\","We also leave feedback of a password check success or failure in the debugging shell at boot. To access that, please select the Debugging Admin boot option from Grub."]}],[{"i":"internet-restriction-dns","l":"Internet Restriction (DNS)","p":["In some cases, the system is equipped with an internet restriction method that is active while the device is in Lockdown mode."]},{"l":"Updating the DNS configuration","p":["In order to configure what websites and IP addresses are allowed to be accessed, we use a DNS configuration that follows the server rules found in Googles dnsmasq.conf example. By default, the blissdns.conf file contains the following settings:"]}],[{"l":"Updating Bliss Bass builds","p":["We support a variety of methods for updating Bliss Bass builds. Our installwe is simular to Bliss OS, but we add a few product focused options and features."]},{"i":"manually---usb-installer","l":"Manually - USB Installer","p":["When installed this way, you can easily update to the newest versions of your Bliss Bass by running the USB installer and selecting the EXT4 partition, and select Do Not Format. This will retain the data from the previous install."]},{"i":"manually---usb-oem-update","l":"Manually - USB OEM Update","p":["If you have installed the OS using the Bootable USB installer, then you can also update the OS manually by inserting the USB with the new version of BlissBass on it, and on Grub boot menu, navigate to OEM Install > OEM Update","Once selected, the device will boot into the OEM installer and auto-update the existing OS on the device."]},{"i":"ota---local-streaming","l":"OTA - Local Streaming","p":["The UpdateService AIDL allows us to stream an OTA zip from the local device or network attached endpoint.","The UpdaterSDK interface has three main parts: \\"]},{"i":"iupdateraidl","l":"IUpdater.aidl"},{"i":"iupdatercallbackaidl","l":"IUpdaterCallback.aidl"},{"i":"updateiteminfoaidl","l":"UpdateItemInfo.aidl","p":["You can use the BlissUpdaterSDK-debug.aar from your target app to stream all required update information to the BlissUpdater app and system update engine."]},{"i":"example-updaterclient","l":"Example: UpdaterClient","p":["The UpdaterClient app acts as an example app for interfacing with the BlissUpdaterSDK. The apps MainActivity calls the AIDL methods with each button, and prints out the output in the textbox above.","alt_text","Clicking Select update file will launch the ACTION_GET_CONTENT intent and then the ParcelFileDescriptor will be passed to the UpdaterManager.importUpdate. And the import process is triggered, import results can be observed from callbacks onImportStarted and onImportCompleted","Once the import status is complete, the output will be the imported files information:","Using the imported ID (in this case, local), we can enter the ID and initiate the Install process:","From there, it will also register the updater service notification:","Once the install process starts, it will have a status of 9 and you can track the installProgress percentage.","And after that is complete the finalizing process is started and set to true and the installProgress will track the process percentage.","Then after receiving a status of 10 (Installed) or 5 (tmp zip Deleted), then the updater service will trigger for a restart. And we can display that in the example by enabling that action","The restart is carried out by the BlissPowerManager:"]},{"i":"ota---local-server","l":"OTA - Local Server","p":["By default, testing OTA on an unsecured HTTP server is disabled. In order to test OTA, you will need to setup a secured HTTPS nginx server, or change this line in the Updater package to True: https://github.com/BlissRoms/platform_packages_apps_BlissUpdater/blob/arcadia-next/AndroidManifest.xml#L23 Then recompile BlissBass to disable this security measure."]},{"i":"manually-setting-ota-uri-address","l":"Manually setting OTA URI address:","p":["We do allow the ability to manually set the OTA update URI via kernel cmdline interface. This allows you to set the value only when needed for added security. To do so, you should add the following value:","SET_CUSTOM_OTA_URI- Sets the custom URL for OTA updates","Or you can set the following system property via ADB:","bliss.updater.uri","Setting Up The Server:","On the server, we will need to have it setup as a basic nginx web server, with the OTA update .zip located in the same folder as the update.json, with the updates/update.json file formatted like this:","The values are as follows:","“ datetime” - is calculated using the date command. Example:","“ id” - is the sha256 value. Example:","“ size” - is the size in bytes. Example:"]},{"i":"ota---dedicated-update-server","l":"OTA - Dedicated Update Server","p":["ShipperStack","BlissLabs has produced ShipperStack, and that is what we use for our update server needs. You can find more information on how to setup and host on the project documentation page.","LineageOS Updater","The updater we use is also compatible with the LineageOS updater framework. You can also find a version of that that is configured for local web servers as well here"]}],[{"l":"Power Management API","p":["We include a simple app to demonstrate the power management API."]},{"i":"bliss-power-management-aidl-interface","l":"Bliss Power Management AIDL Interface:","p":["copy paste “ system_libs/bliss-power-framework.jar” from sample app","gradle:","java:"]},{"i":"adb-interface","l":"ADB Interface:","p":[" is the method number in aidl","1: reboot","2: shutdown","3: sleep"]}],[{"l":"BlissEthernetManager"},{"l":"Setting Up Ethernet Interfaces","p":["If your version of BlissBass comes with the Eternet Manager, then you are able to setup multiple ethernet interfaces and configure them.","alt_text","Clicking on the Interfaces item allows you to select the target Ethernet interface to view/edit. You may need to click the refresh button at the top for changes to be reflected.","From there, you can set the interface as Up/Down, Unassigned/DHCP/Static, and depending on selection, you can set the interface IP, Gateway and DNS.","IP and Subnet mask are handled in the IP Address field (< IP Address>/< Subnet Mask>)","Gateway Address is handled through the Gateway Address field","DNS is handled through the DNS Addresses field"]},{"i":"bliss-ethernet-manager-aidl-interface","l":"Bliss Ethernet Manager AIDL Interface:","p":["The source package for BlissEthernet Manager contains the framework and system libs for the AIDL interface.","Gradle:","Java:","AIDLs:","alt_text"]},{"i":"bliss-ethernet-manager-adb-interface","l":"Bliss Ethernet Manager ADB Interface:","p":["We also supply a simple interface using the service framework provided by Android that allows you to set IP, DNS, and Gateway.","ADB Interface:"," is the method number in aidl","1: getAvaliableInterfaces","2: isAvaliable","3: Etc…","Examples:","getAvaliableInterfaces:","x86_64:/ # service call blissethernet 1 s16 eth0 Result: Parcel( 0x00000000: 00000000 00000002 00000004 00740065 '............e.t.' 0x00000010: 00300068 00000000 00000004 00740065 'h.0.........e.t.' 0x00000020: 00310068 00000000 'h.1..... ')","isAvaliable:","x86_64:/ # service call blissethernet 2 s16 eth0 Result: Parcel(00000000 00000001 '........')"]}],[{"l":"Using Scrcpy For Remote Management","p":["scrcpy is a popular open-source tool that allows remote access and control of your Android device using adb interface.","It comes in a number of forms:","scrcpy:","https://github.com/Genymobile/scrcpy","guiscrcpy:","https://github.com/srevinsaju/guiscrcpy","qtscrcpy:","https://github.com/barry-ran/QtScrcpy"]},{"i":"installing-guiscrcpy","l":"Installing guiscrcpy:","p":["This guide will run through using the guiscrcpy tool. We will start off by navigating to the latest releases page and downloading the \"guiscrcpy-vXXXX.X.X.dev.r.glibcX.X-x86_64.AppImage\" file as it contains all the required dependencies to run on most setups.","Once downloaded, you will want to set executable permissions for the AppImage file by right-clicking, selecting Properties, and checking the box next to Allow this file to run as an executable, then you can close the dialog.","permissions"]},{"i":"main-program","l":"Main Program:","p":["Launching the AppImage will load to display the main GUI: main GUI"]},{"i":"connecting-to-a-device","l":"Connecting to a device:","p":["To connect to a new device, you will want to make sure that you have enabled ADB over wifi from the device, located in Settings > System > Developer Options (may require you to enable developer options first). Then from the remote PC, start by clicking on the wireless icon under the options panel. From there, you can hit the refresh button to display any devices broadcasting ADB on the network, or you can type in the IP directly and tap the Connect button to connect to that device. device connection Once a device is connected, it will show the status in the grey textbox like below: device connected From here, we can close the window and continue to the next steps."]},{"l":"Remote operation of the device","p":["Once we are connected, you can select the Start Scrcpy button to remote into the device","remote display - primary screen","You can use your mouse and keyboard to operate the device, or you can use the button tools provided by guiscrcpy (moving those out of the main interaction area first)."]},{"i":"connecting-to-secondary-display","l":"Connecting to secondary display:","p":["In order to remote into the connected displays on the device, this requires us to use the \"additional flags\" preferences from within guiscrcpy, adding --display # where # is the display ID for your target display.","Example: second-display specification","After adding --display 2, we can click the Start Scrcpy button and it will remote into the secondary display connected to the device. remote display - display ID 2"]},{"i":"other-options","l":"Other Options:","p":["You can configure the options further by using the \"additional flags\" textbox. A good reference for the possibilities is the official scrcpy documentation."]}],[{"l":"Booting into generic builds"},{"i":"booting-into-generic-builds","l":"Booting into generic builds:"},{"i":"tabletpciotiiotgame-mode-builds","l":"Tablet/PC/IOT/IIOT/Game Mode builds","p":["!!WARNING!! - THESE BUILDS ARE MEANT TO REPLACE YOUR EXISTING OPERATING SYSTEM OR BE INSTALLED ON NEW HARDWARE. THESE ARE NOT INTENDED FOR DUAL-BOOTING","!!Notice!!: These builds come with A/B OTA Update support, and might not work in Live mode. Only supported installer is the Bootable USB install method we include in the .iso."]},{"l":"Booting into the OS","p":["(!!NOTICE FOR BUILDS THAT HIDE GRUB!!) When the device reboots, it will not show the grub menu by default, and automatically boot into the last known boot mode. In order to show the grub menu, tap shift multiple times while the initial BIOS boot logo is displayed. If done correctly, you will be presented with the Grub menu. If no keys are pressed, the bios boot menu will show a black screen afterwards while Grub is loading the configuration in the background.","Once the device boots into Grub, the top option or two will be our default mode (some builds offer specific boot options per CPU manufacturer: Intel Default or AMD Default) boot options.","While the Debugging modes can be found in the Other Options section of the boot menu."]}],[{"l":"Booting into lockdown builds"},{"i":"booting-into-lockdown-builds","l":"Booting into lockdown builds:"},{"i":"restricted-launcher--pos-builds","l":"Restricted Launcher & POS Builds","p":["!!WARNING!! - THESE BUILDS ARE MEANT TO REPLACE YOUR EXISTING OPERATING SYSTEM OR BE INSTALLED ON NEW HARDWARE. THESE ARE NOT INTENDED FOR DUAL-BOOTING","!!Notice!!: These builds come with A/B OTA Update support, and might not work in Live mode. Only supported installer is the Bootable USB install method we include in the .iso."]},{"l":"Booting into the OS","p":["(!!NOTICE FOR BUILDS THAT HIDE GRUB!!) When the device reboots, it will not show the grub menu by default, and automatically boot into the last known boot mode. In order to show the grub menu, tap shift multiple times while the initial BIOS boot logo is displayed. If done correctly, you will be presented with the Grub menu. If no keys are pressed, the bios boot menu will show a black screen afterwards while Grub is loading the configuration in the background.","(!!PLEASE NOTE!!): Only Admin mode will have access to the Android notification stack, navigation options, status bar, etc. In some builds, lockdown mode removes all these functions at the system level for redundancy and added security. The options used to configure those restrictions can be overridden with the following options:","Navigation: Disables the system navigation gestures options: true, false","FORCE_DISABLE_NAVIGATION=*","Navigation Gesture Handle: Disables the gestural navigation handle options: true, false","FORCE_DISABLE_NAV_HANDLE=*","Navigation Taskbar (only on large-screen devices): Disables SystemUI Taskbar (not Launcher3) options: true, false","FORCE_DISABLE_NAV_TASKBAR=*","Statusbar: Disabled the statusbar at the top of the screen (does not disable Launcher3s gesture to show notification drawer) options: true, false","FORCE_DISABLE_STATUSBAR=*"]},{"l":"Restricted Launcher Setup","p":["(!!NOTICE FOR INITIAL SETUP!!) We recommend disconnecting all but the primary display when starting up the OS. Once setup is complete, you can connect any displays and continue testing and operation.","Once the device boots into Grub, the top option or two will be our locked down mode ( Intel Default or AMD Default)","While the Admin modes can be found in the Other Options section of the boot menu.","The Restricted Launcher & POS builds will initially require setup through Admin mode. So after install, you will want to reboot, the tap the shift key until the Grub menu shows. From there, select Other Options> and select one of the Admin options from there.","Once booted, you should setup the devices wifi/network. Afterwards, you will want to tap on the Sprocket icon at the top right, and navigate to the Security tab, and tap on Change Password.","After setting the admin password, we can select the default features we want available in Lockdown mode, and navigate back to the Restricted Launcher page, and configure your Appearance, Apps and System options.","Appearance: Allows you to set the default positions/placement of the on-screen logo overlay and settings button overlay","Apps: Allows you to set your whitelisted apps up, you can also set what whitelisted apps you want to auto-launch per-display.","System: Allows you to change options for default screen timeout and on-screen keyboard display","Once setup is complete, we can then back out and test our lockdown settings by hitting the Lock icon at the top right of the home screen, or reboot the device, and select the top boot option (some builds offer specific boot options per CPU manufacturer: Intel Default or AMD Default) to enter Lockdown mode."]},{"l":"Kiosk Launcher Setup","p":["By default, the Bliss Kiosk Launcher UI will have two modes, Lockdown and Admin modes.","To configure the launcher, we want to start off by booting onto Admin mode. Then we cna start the Kiosk Launcher and configure it from there. The default password for the kiosk launcher settings is 123.","Please see BlissKioskLauncher for further details on the launchers usage."]}],[{"l":"Configuration Through Command Line Parameters","p":["Bliss OS (and the Bass builds) utilizes an expanded configuration layer, our Broad Apparatus Support System (Bass for short) allows one generic .iso to be configured through kernel command line parameters on a per-device basis. This allows end users to fine tune the performance of the OS to the capabilities of the device."]},{"l":"Intro to Kernel Command Line Parameters","p":["We use Grub, Refind, or other Linux bootloaders to boot the device once installed. The menu entry is how we also pass many of our parameters for configuring the device as well. Here is an example of a typical menu entry for Grub for Bliss OS 15.8.x:","The line we are targeting for our configuration is the one that starts with “ linux /AndroidOS/kernel”. Here are some of the explanations for the configs we support.","If your Grub menu entry looks a little different, and has some of the commands at the top, you can also edit there to add your configuration preferences."]},{"i":"supported-parameters","l":"Supported Parameters:","p":["Warning: Note that not all of the configs listed here are available in the open-source Bliss OS source, but are available through licensing the Android-Generic Project add-on for that feature, or licensing the use of our Bass builds or Bass source (which comes with most available AG add-on's) for your organization","Here are a few of the supported parameters that we support, organized by stack."]},{"i":"debugging","l":"Debugging:","p":["This will enable logging or low level debugging console before the system starts to boot Android.","This is a root console, and can be used for testing or troubleshooting. Pressing exit, twice will continue with the Android boot process.","Command:","DEBUG=*","Options:","1: high-level debugging console (logs to /tmp/log)","2: low-level debugging console (logs to /data/log.txt & /tmp/log)","You will also need to enable the console if you wish to use alt-f1/f7 virtual consoles:","Example:"]},{"i":"graphics-stack","l":"Graphics Stack:","p":["This includes a number pf parameters that we can use to customize the stack to our hardware's capabilities."]},{"i":"hardware-composer","l":"Hardware Composer:","p":["This allows us to include multiple hardware-composer options, and select the ones we want to target per-device.","By default, if you set HWC without anything like HWC=, Bliss will use drmfb-composer","Command:","HWC=*","Options:","drm: Use drm_hwcomposer","drm_celadon: Use Project Celadon's fork of drm_hwcomposer","drm_minigbm: Use drm_hwcomposer with minigbm support","drm_minigbm_celadon: Use Project Celadon's fork of drm_hwcomposer with minigbm support","Example:"]},{"i":"gralloc","l":"Gralloc:","p":["We pair up our Gralloc options to work with certain HWC options.","Command:","GRALLOC=*","Options:","gbm: This is gbm_gralloc and it's compatible with drm & drm_celadon","gbm_hack: This is gbm_gralloc but with a HACK commit to fix some issue with iris or nouveau. It's compatible with drm & drm_celadon","minigbm: This is minigbm and it's compatible with drm_minigbm, drm_minigbm_celadon","minigbm_arcvm: This is minigbm but made specifically for virgl by Google, compatible with drm_minigbm, drm_minigbm_celadon","minigbm_gbm_mesa: This is minigbm made by rsglobal which he tried to port gbm_gralloc philosophy to minigbm. Compatible with drm_minigbm, drm_minigbm_celadon","Example:"]},{"i":"gralloc4-configurations","l":"Gralloc4 Configurations:","p":["In some cases, we are working with hardware that requires Gralloc4 specs. We can force minigbm to use Gralloc4 by using:","GRALLOC4_MINIGBM: Force using gralloc4 with minigbm (only compatible with drm_minigbm_celadon)"]},{"i":"angle--software-rendering","l":"ANGLE & software rendering","p":["ANGLE is available in BlissOS 14.10 and above, if you have a device that can use Vulkan, you can try ANGLE with Vulkan backend using ANGLE=1.","Alternatively, you can also use SwiftShader Vulkan with ANGLE as a software rendering solution if you are running it inside something like a virtual machine by setting nomodeset ANGLE=1 or HWACCEL=0 ANGLE=1","There's one more option for software rendering, which is the legacy SwiftShader EGL, simply set nomodeset or HWACCEL=0 to use it.","For some virtualized methods uses, you may have a blinking cursor artifact that shows on screen. To remove this artifact, include the following boot flag: vt.global_cursor_default=0","NOTE: You may want to turn on Color Inversion when using software rendering because the color might be inverted"]},{"i":"media-stack","l":"Media Stack:"},{"i":"video-encodersdecoders","l":"Video Encoders/Decoders:","p":["By default, BlissOS will use AOSP's codec2 software decoder. We also offer a few various options that allow you to select different video decoders stack options:","CODEC2_LEVEL: This will set the C2 level (default value is 4, you can disable codeec2 completely with '0').","FFMPEG_OMX_CODEC: This will enable OMX version of FFMPEG codecs (disable codec2 with CODEC2_LEVEL=0 to use this codecs).","FFMPEG_CODEC2_PREFER: This will force Bliss to use codec2 version of FFMPEG codecs by default.","FFMPEG_HWACCEL_DISABLE: This will disable hardware accelleration for the FFMPEG codecs.","FFMPEG_CODEC_LOG: This will show more log of FFMPEG codecs, enable if you want to debug it","FFMPEG_CODEC2_DEINTERLACE& FFMPEG_CODEC2_DEINTERLACE_VAAPI: configuring deinterlacing option for FFMPEG codec2, you can find the options in this commit made by Micheal Goffioul","OMX_NO_YUV420: This will force the system to not use YUV420 color format on OMX codec (fixes some black or glitchy screens, use it with CODEC2_LEVEL=0)","FFMPEG_CODEC2_DRM: turn on/off DRM prime handle on ffmpeg codecs, 0 is the default because not any Gralloc supporting it."]},{"i":"networking","l":"Networking:","p":["We include the ability to have Ethernet appear as WiFi as some appli/cations will not work without a WiFi or Cell connection present. In order to enable this mode, we use the VIRT_WIFI boot flag: VIRT_WIFI=1"]},{"i":"disk-access","l":"Disk Access:","p":["(Available on Bliss OS 14.1x, 15.8.x, & 16.x) For use cases where you are dual booting or sharing system resources with multiple drives, you might want to enable automatic mounting of all disks within Android: INTERNAL_MOUNT=1: Allows device to mount other internal drives on boot."]},{"i":"usbpci","l":"USB/PCI:"},{"i":"usb","l":"USB:"},{"i":"usb-modes","l":"USB Modes:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Switch USB mode (ADB/Storage) !! Requires kernel configs !!:","FORCE_USE_ADB_CLIENT_MODE: Forces client mode adb settings","FORCE_USE_ADB_MASS_STORAGE: Forces USB mass_storage mode"]},{"i":"power--memory","l":"Power & Memory:"},{"i":"power","l":"Power:"},{"i":"default-sleep-mode-options","l":"Default Sleep Mode Options:","p":["deep: This option will choose the deepest sleep state supported by the hardware.","Example:","mem: This option will choose the memory state.","nonvs: This option will not save non-volatile storage (NVS) to disk before entering S4 sleep.","off: This option will choose the off state.","old_ordering: This option will use the old ACPI sleep state ordering.","s2idle: This option will choose the S2 idle state.","s3_bios: This option will use the BIOS-provided S3 sleep state.","s3_mode: This option will use the kernel's own S3 sleep state.","s3bios: This option will choose the S3 BIOS state.","s3standby: This option will choose the S3 standby state.","s4_nohwsig: This option will disable the ACPI hardware wake signal for S4 sleep.","sci_force_enable: This option will force the ACPI SCI interrupt to be enabled.","shallow: This option will choose the shallowest sleep state supported by the hardware.","The default value for acpi_sleep is s3_bios, and the suggested value for most devices is s3_mode.","The default value for mem_sleep_default is deep, and the suggested value for most devices is shallow","The following are the options for acpi_sleep(suggested values are in bold):","The following are the options for mem_sleep_default(suggested values are in bold):"]},{"l":"Other Sleep Mode Options","p":["There are a number of other Linux kernel command line options that can be used to configure sleep mode settings. Some of these options include:","acpi_sleep_default: This option specifies the default sleep mode for the system. The possible values are:","s3: Standby mode","s4: Hibernate mode","s5: Off mode","Example:","suspend_console: This option specifies whether to suspend the console when the system enters sleep mode. The possible values are:","on: The console will be suspended.","off: The console will not be suspended.","no_console_suspend: This option specifies that the console should not be suspended when the system enters sleep mode. This option overrides the value of the suspend_console option.","SUSPEND_TYPE: Set suspend type. options: mem, disk, freeze mem, freeze disk","PWR_OFF_DBLCLK: Set power off double click. options: true,false","SLEEP_STATE: Override default sleep.state property for the device"]},{"i":"intel-power-options","l":"Intel Power Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","INTEL_PSTATE_CPU_MIN_PERF_PCT/INTEL_PSTATE_CPU_MAX_PERF_PCT: Allow for adjusting intel_pstate max/min freq on boot by setting the min/max pref percent","Example:","CPU_ENERGY_PERFORMANCE_PREF: Allow for adjusting cpu energy performance Normal options: default, performance, balance_performance, balance_power, power","INTEL_PSTATE_STATUS: Set cpu scaling at boot (ie set pstate status to active/passive at boot)"]},{"i":"generic-power-options","l":"Generic Power Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_SCREEN_OFF_TIMEOUT: Set screen off timeout. options: integer in milliseconds","SET_SLEEP_TIMEOUT: Set screen sleep timeout. options: integer in milliseconds","SET_POWER_ALWAYS_ON: Set power always on. options: true or false","SET_STAY_ON_WHILE_PLUGGED_IN: Set stay on while plugged in. options: true or false"]},{"i":"generic-performance-options","l":"Generic Performance Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","FORCE_POWER_PROFILE: Sets the power_profile value. Options: ondemand, hotplug, interactive, performance","FORCE_IO_PROFILE: Sets the io_profile value. Options: ondemand, hotplug, interactive, performance","FORCE_CPU_GOV: Sets the cpu_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_CPU_SCALING_GOV: Sets the cpu_scaling_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_GPU_SCALING_GOV: Sets the gpu_scaling_governor value. Options: ondemand, hotplug, interactive, performance","FORCE_THERMAL_THROTTLE_ENABLE: Sets the thermal_throttle_enable value. Options: (true|false)","FORCE_HW_TIMEOUT_MULTIPLIER: Force hw timeout multiplier, # X 5s. Options: (integer)"]},{"i":"memory","l":"Memory:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Example value: \"100\"","Example value: \"1024\"","Example value: \"1024M\"","Example value: \"128\"","Example value: \"16\"","Example value: \"256\"","Example value: \"32\"","Example value: \"512\"","Example value: \"512M\"","Example value: \"64\"","FORCE_ENFORCE_MIN_FREE_MB: Sets the enforce_min_free_mb value","FORCE_MAX_FREE_MEMORY: Sets the max free ram limit","FORCE_MEMORY_TRIM_ENABLE: Sets the memory_trim_enable value Options: (true|false)","FORCE_MIN_FREE_MEMORY: Sets the minimum free ram limit","FORCE_OOM_SCORE_ADJ: Sets the oom_score_adj value","FORCE_SCHED_MIN_ACTIVE_PAGES: Sets the sched_min_active_pages value","FORCE_SCHED_MIN_DIRTY_PAGES: Sets the sched_min_dirty_pages value","FORCE_SCHED_MIN_FREE_PAGES: Sets the sched_min_free_pages value","FORCE_SCHED_MIN_INACTIVE_PAGES: Sets the sched_min_inactive_pages value","FORCE_SCHED_MIN_RECLAIMABLE_PAGES: Sets the sched_min_reclaimable_pages value","FORCE_SCHED_MIN_UNRECLAIMABLE_PAGES: Sets the sched_min_unreclaimable_pages value","FORCE_SCHED_MIN_WRITEBACK_PAGES: Sets the sched_min_writeback_pages value"]},{"i":"lmkd","l":"LMKD:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Default for low-RAM devices = 10, for high-end devices = 20","Default for low-RAM devices = 30, for high-end devices = 100","FORCE_KILL_HEAVIEST_TASK: Kill heaviest eligible task (best decision) vs. any eligible task (fast decision). Default = false","FORCE_LMK_CRITICAL: The possible values of oom_adj range from -17 to +15 (Default=0).","FORCE_LMK_ENABLE: Force enable LMK Daemon Default = false (unless device is detected to have less than 2GB RAM)","FORCE_LOW_MEM: Forces the low_mem mode in Android to the specific true/false value Default = false (unless device is detected to have less than 2GB RAM)","FORCE_MINFREE_LEVELS: Use free memory and file cache thresholds for making decisions when to kill. This mode works the same way kernel lowmemorykiller driver used to work. AOSP Default = false, Our default = true","FORCE_PSI_COMPLETE_STALL_THRESHOLD: The complete PSI stall threshold, in milliseconds, for triggering critical memory notifications. If the device receives critical memory pressure notifications too late, decrease this value to trigger earlier notifications. If critical memory pressure notifications trigger unnecessarily, increase this value to make the device less sensitive to noise.","FORCE_PSI_PARTIAL_STALL_THRESHOLD: The partial PSI stall threshold, in milliseconds, for triggering low memory notification. If the device receives memory pressure notifications too late, decrease this value to trigger earlier notifications. If memory pressure notifications trigger unnecessarily, increase this value to make the device less sensitive to noise.","FORCE_SWAP_FREE_LOW_PERCENTAGE: Level of free swap as a percentage of the total swap space used as a threshold to consider the system as swap space starved.","FORCE_SWAP_UTIL_MAX: The max amount of swapped memory as a percentage of the total swappable memory. When swapped memory grows over this limit, it means that the system swapped most of its swappable memory and is still under pressure. This can happen when non-swappable allocations are generating memory pressure which can not be relieved by swapping because most of the swappable memory is already swapped out. The default value is 100, which effectively disables this check. If the performance of the device is affected during memory pressure while swap utilization is high and the free swap level is not dropping to Sets the swap_free_low_percentage, decrease the value to limit swap utilization.","FORCE_THRASHING_LIMIT_DECAY: The thrashing threshold decay expressed as a percentage of the original threshold used to lower the threshold when the system doesn’t recover, even after a kill. If continuous thrashing produces unnecessary kills, decrease the value. If the response to continuous thrashing after a kill is too slow, increase the value.","FORCE_THRASHING_LIMIT: Number of working set defaults as a percentage of the file-backed pagecache size used as a threshold to consider system thrashing its pagecache.","High end: 10 Low end: 50","High end: 100 Low end: 100","High end: 70 Low end: 200","Other options available for specialized builds:","Recommended: 700","The higher the score, more likely the associated process is to be killed by OOM-killer. If oom_adj is set to -17, the process is not considered for OOM-killing."]},{"i":"logginglogd","l":"Logging/Logd:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_MAX_LOGD: Sets the maximum logd value","Options: 1 = on, 0 = off","SET_LOGCAT_DEBUG: Enables logcat debugging","Options: true, false"]},{"i":"ota-updates","l":"OTA Updates:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_CUSTOM_OTA_URI: Sets the custom URL for OTA updates","Example:","SET_CUSTOM_OTA_URI=https://192.168.1.1/updates/update.json"]},{"i":"features","l":"Features:"},{"i":"kiosk-mode","l":"Kiosk Mode:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)",": This will add or remove the specified quick settings tile.","0: Disables the recent apps menu.","1: Displays up to 1 app in the recent apps menu.","2: Displays up to 2 apps in the recent apps menu.","3: Displays up to 3 apps in the recent apps menu.","4: Displays up to 4 apps in the recent apps menu.","5: Displays up to 5 apps in the recent apps menu.","all: This will restore all default quick settings tiles.","FORCE_DEFAULT_QS_TILES: Sets the config_defaultQsTiles value Options:","FORCE_DISABLE_NAV_HANDLE: Force disable gesture navigation handle. Options: (true|false)","FORCE_DISABLE_NAV_TASKBAR: Force disable navigation taskbar. Options: (true|false)","FORCE_DISABLE_NAVIGATION: Force disable navigation bar. Options: (true|false)","FORCE_DISABLE_RECENTS: Force disable SystemUI recents. Options: (true|false)","FORCE_DISABLE_STATUSBAR: Force disable statusbar. Options: (true|false)","FORCE_ENABLE_CLEAR_ALL_RECENTS: Sets the config_enableClearAllRecents value Options: (true|false)","FORCE_HIDE_NAVBAR_WINDOW: Force hide navigation bar window. Options: 0, 1","FORCE_SET_MAX_RECENTS: Sets the config_maxRecents value Options:","none: This will remove all default quick settings tiles.","Other options available for specialized builds:"]},{"i":"launcher-options","l":"Launcher Options:","p":["USE_LAUNCHER3: Forces Launcher3 to be set instead of secondary launcher in build","SET_SMARTDOCK_DEFAULT: Set's SmartDock as default launcher when booting into Desktop specific builds (requires a build with SmartDock included by default)","ENABLE_QUICKSTEP_TASKBAR: Set quickstep taskbar features to enabled (requires dev-options to be enabled & Launcher3 to also be enabled). options: true,false","FORCE_DESKTOP_ON_EXTERNAL: Enable desktop mode on external display (required for MultiDisplay Input). options: 0,1"]},{"i":"navigation--input-options","l":"Navigation & Input Options:","p":["FORCE_NAVBAR_ON_SECONDARY_DISPLAYS: Enable navbar/gesture navigation on external display. options: 0,1","FORCE_IME_ON_SECONDARY_DISPLAYS: Enable on-screen keyboard on external display (required for MultiDisplay Input). options: 0,1","androidboot.bliss.force_ime_on_all_displays=true: Force IME on secondary displays. Uses \"ro.boot.bliss.force_ime_on_all_displays\" property (true,false)","androidboot.force.navbar_on_secondary_displays=true: Allow a system property to override this for desktop mode navigation to work on secondary displays. (true/false)","ro.boot.force.right_mouse_as_back=true: Allows overriding AMOTION_EVENT_BUTTON_SECONDARY with AMOTION_EVENT_BUTTON_BACK, using a property trigger. (true/false)"]},{"i":"rotationorientation","l":"Rotation/Orientation:","p":["SET_SF_ROTATION=*: Sets surfaceflinger hardware rotation property to the value passed","SET_OVERRIDE_FORCED_ORIENT=*: Override forced orientation (true/false)","SET_SYS_APP_ROTATION=*: Forces system app rotation, and has three cases:","1.force_land: always show with landscape, if a portrait apk, system will scale up it","2.middle_port: if a portrait apk, will show in the middle of the screen, left and right will show black","3.original: original orientation, if a portrait apk, will rotate 270 degree","androidboot.android.force_rotation_on_external_displays: Set target orientation for external displays (0=0, 1=90, 2=180, 3-270)"]},{"i":"misc","l":"Misc:"},{"i":"battery-stats","l":"Battery Stats:","p":["androidboot.fake_battery=true: AOSP implementation of fake battery status","(Available through Android-Generic Add-On & add-ons for Bass builds)","SET_FAKE_BATTERY_LEVEL: Let us fake the total battery percentage Options: (0-100)","SET_FAKE_CHARGING_STATUS: Allow forcing battery charging status Options: (0|1)"]},{"i":"package-management","l":"Package Management:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","With our package management features, we have the ability to also enable/disable various packages included in the system by default using the kernel cmdline.","Example: HIDE_APPS=com.termux,com.android.dialer,com.android.documentsui"]},{"i":"hideunhide-default-apps","l":"Hide/Unhide Default Apps:","p":["HIDE_APPS: Hides the apps via passed comma separated list","RESTORE_APPS: Restores the apps via passed comma separated list"]},{"i":"usb-mode-functions","l":"USB Mode Functions:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","Allows switching default USB/ADB functions via cmdline","FORCE_USE_ADB_CLIENT_MODE: Forces USB into ADB Client mode (0=off, 1=on, 2=ADB enabled but not touching USB options)","FORCE_USE_ADB_MASS_STORAGE: Force enable ADB Mass Storage mode ofver USB (0=off, 1=on)"]},{"i":"iio-options-configuration","l":"IIO Options Configuration:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","This allows us to set ro.iio.* propertied through the following flags:","SET_IIO_ORDER: Sets ro.iio.accel.order property","SET_IIO_ACCEL_QUIRKS: Sets ro.iio.accel.quirks ptoperty","SET_IIO_ACCEL_X_OPT_SCALE: Sets ro.iio.accel.x.opt_scale property","SET_IIO_ACCEL_Y_OPT_SCALE: Sets ro.iio.accel.y.opt_scale property","SET_IIO_ANGLVEL_QUIRKS: Sets ro.iio.anglvel.quirks property","SET_IGNORE_ATKBD: Sets ro.ignore_atkbd property","SENSORS_FORCE_KBDSENSOR: Option to force kbd sensor","SET_IIO_MAGN_QUIRKS: Option to force magn quirks. Example: SET_IIO_MAGN_QUIRKS=no-trig,no-event"]},{"i":"set-timezone","l":"Set Timezone:","p":["(Available through Android-Generic Add-On & add-ons for Bass builds)","To use this change, pass the grub/cmdline value for your timezone using the SET_TZ_LOCATION flag. Timezone reference can be found here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones","Example:"]},{"l":"Serial IO","p":["(Available through Android-Generic Add-On & add-ons for Bass)","SET_USB_BUS_PORTS: Sets permissions for tty ports (chmod 666) for /dev/bus/usb/*. Example: SET_USB_BUS_PORTS=001/001,001/002,001/003,001/004","SET_TTY_PORT_PERMS: Set USB bus port permissions (chmod 666) for /dev/tty*. Example: SET_TTY_PORT_PERMS=ttyS*,ttyACM*"]},{"i":"network--radio-control-options","l":"Network & Radio Control Options:","p":["(Available through Android-Generic Add-On & add-ons for Bass)","Enable/Disable Wireless Devices (Change included only in specialized builds):","LOCKDOWN_WIRELESS_DEVICES: A kernel level switch to disable all wireless devices. options: 0,1","UNLOCKDOWN_WIRELESS_DEVICES: A kernel level switch to enable all disabled wireless devices. options: 0,1","Other Networking Options (Available in Bass builds):","FORCE_DISABLE_ALL_RADIOS: Set force disable all radios (only disables on boot, user can re-enable manually if given access). options: 0,1","FORCE_BLUETOOTH_SERVICE: Set force bluetooth service state. options: enable, disable"]}],[{"l":"Code of Conduct"},{"l":"Our Pledge","p":["We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.","We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community."]},{"l":"Our Standards","p":["Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience","Arguing over subjective preference, e.g. nationality, choice, religion, etc.","Being respectful of differing opinions, viewpoints, and experiences","Continued one-on-one communication after requests to cease","Demonstrating empathy and kindness toward other people","Encouraging a person to engage in self-harm","Examples of behavior that contributes to a positive environment for our community include:","Examples of unacceptable behavior include:","Focusing on what is best not just for us as individuals, but for the overall community","Giving and gracefully accepting constructive feedback","Other conduct which could reasonably be considered inappropriate in a professional setting","Public or private harassment","Publishing others' private information, such as a physical or email address, without their explicit permission","The use of sexualized language or imagery, and sexual attention or advances of any kind","Trolling, insulting or derogatory comments, and personal or political attacks","Unwelcome sexual or otherwise aggressive attention"]},{"l":"Enforcement Responsibilities","p":["Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.","Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate."]},{"l":"Scope","p":["This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers."]},{"l":"Enforcement","p":["Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainers responsible for enforcement at integrity@blissos.org. Participants warned to stop any harassing behavior are expected to comply immediately; failure to do so will result in an escalation of consequences. All complaints will be reviewed and investigated promptly and fairly.","All project maintainers are obligated to respect the privacy and security of the reporter of any incident."]},{"l":"Enforcement Guidelines","p":["Project maintainers will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:"]},{"l":"1. Correction","p":["Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.","Consequence: A private, written warning from project maintainers, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested."]},{"l":"2. Warning","p":["Community Impact: A violation through a single incident or series of actions.","Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban."]},{"l":"3. Temporary Ban","p":["Community Impact: A serious violation of community standards, including sustained inappropriate behavior.","Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban."]},{"l":"4. Permanent Ban","p":["Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.","Consequence: A permanent ban from any sort of public interaction within the community."]},{"l":"Attribution","p":["This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html."]}]]
\ No newline at end of file
diff --git a/setup_and_configuration/booting-into-generic-builds/index.html b/setup_and_configuration/booting-into-generic-builds/index.html
index 1994e40a..8c8dd357 100644
--- a/setup_and_configuration/booting-into-generic-builds/index.html
+++ b/setup_and_configuration/booting-into-generic-builds/index.html
@@ -3,7 +3,7 @@
-
+
@@ -30,11 +30,11 @@
-
+
-
+
-
+
diff --git a/setup_and_configuration/booting-into-lockdown-builds/index.html b/setup_and_configuration/booting-into-lockdown-builds/index.html
index 2a330242..ec97de84 100644
--- a/setup_and_configuration/booting-into-lockdown-builds/index.html
+++ b/setup_and_configuration/booting-into-lockdown-builds/index.html
@@ -3,7 +3,7 @@
-
+
@@ -30,11 +30,11 @@
-
+
-
+
-
+
diff --git a/setup_and_configuration/configuration-through-command-line-parameters/index.html b/setup_and_configuration/configuration-through-command-line-parameters/index.html
index 1fde82fe..f3cf88c5 100644
--- a/setup_and_configuration/configuration-through-command-line-parameters/index.html
+++ b/setup_and_configuration/configuration-through-command-line-parameters/index.html
@@ -3,7 +3,7 @@
-
+
@@ -30,11 +30,11 @@
-
+
-
+
-
+
@@ -762,6 +762,8 @@
+FORCE_NAVBAR_ON_SECONDARY_DISPLAYS
: Enable navbar/gesture navigation on external display. options: 0,1
+FORCE_IME_ON_SECONDARY_DISPLAYS
: Enable on-screen keyboard on external display (required for MultiDisplay Input). options: 0,1
androidboot.bliss.force_ime_on_all_displays=true
: Force IME on secondary displays. Uses "ro.boot.bliss.force_ime_on_all_displays" property (true,false)
androidboot.force.navbar_on_secondary_displays=true
: Allow a system property to override this for desktop mode navigation to work on secondary displays. (true/false)
ro.boot.force.right_mouse_as_back=true
: Allows overriding AMOTION_EVENT_BUTTON_SECONDARY with AMOTION_EVENT_BUTTON_BACK, using a property trigger. (true/false)
diff --git a/sitemap.xml.gz b/sitemap.xml.gz
index 94c831c5..5e34f345 100644
Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ