Tweaking

For (most) tweaking you need root access. Your phone/tablet/tvbox needs to be rooted. Check Short Overview for that.

Most of this is based on Android 4.x

A nice read on some Android commands are here. Part 2 and Part 3.


Tip: run Chrome without ads: Chrome > Settings > Privacy and Security > Secure DNS > Other > https://dns.adguard-dns.com/dns-query

Tip: use ADB AppControl to disable bloatware packages 



Android 10+ and the device_config settings


Until Android 10 most OS related settings were stored in global, system and secure settings.  Now we have on top of that the extra device_config command to manage settings related to the OS. The syntax is the same: device_config put/get/delete/list SPACE variable


For the configuration of the device_config db: device_config list configuration


With adb you can manage the device_config settings, BUT the gms service restores the defaults in the background once, 5 mins after boot complete


To make your changes persistent use this command:

Android 12+ device_config set_sync_disabled_for_tests persistent 

Android 11, nothing so far. Let me know. (With Magisk you can create script that waits 5+1 minutes and then sets the variables)


Some device_config commands I use:


device_config put activity_manager max_cached_processes 512 #32 3-4GB RAM

device_config put activity_manager max_phantom_processes 1024 #32

device_config put activity_manager kill_bg_restricted_cached_idle false

device_config put activity_manager oomadj_update_policy 1 #1 0=slow 1=quick

device_config put activity_manager use_compaction true #Less than 6GB: App compactor reclaims background apps without killing them


device_config put wifi rx_tput_sufficient_high_thr_kbps 2000 #8000 exclamation mark on wifi if below this?

device_config put wifi tput_sufficient_high_thr_kbps 2000 #8000

device_config put wifi rx_tput_sufficient_low_thr_kbps 20 #2000 switch to mobile below this?

device_config put wifi tput_sufficient_low_thr_kbps  20 #2000

device_config put wifi data_stall_rx_tput_thr_kbps 20 #2000

device_config put wifi data_stall_tx_tput_thr_kbps 20 #2000

device_config put wifi data_stall_tx_per_thr 95 #90

device_config put wifi data_stall_cca_level_thr 100 # 80%



Delete stored wifi network (no root required)


Have been looking for this a long time. Finally found a solution. How to remove stored wifi network with a command line. Yes it is possible and it doesn't need root at all.


First you need to know Android stores previous connected wifi networks. If you want to remove them from the list you can do that from the wifi settings menu. But what if you don't have that option? Well you can do it with a command from adb shell.


After connecting to your device with adb then start a shell. Then we want the list of stored networks on this device:

cmd netpolicy list wifi-networks

It will show a list with previpously saved wifi networks looking like this:

wifinetwork0;none

wifinetwork1;none

wifinetwork2;none

wifinetwork3;none

The numbers represent the netId we need. So the first Wifi network listed is netId 0. (numbers stay until reboot)

Now the magic. This is for Android 9 but probably work for Android 12 as well:

service call wifi 16 i32 1

Result: Parcel(00000000 00000001   '........')  #done!

And wifinetwork1 is deleted. Check with cmd netpolicy list wifi-networks

Be aware that wifinetwork2 does NOT become 1 in the list. It is still 2. Until reboot, then a new list is build.



Prevent apps running in background (no root required)


Since Android 7? there is a hidden setting to disable apps running in the background. The OP is called RUN_IN_BACKGROUND and RUN_ANY_IN_BACKGROUND.

To find packages running in the background, and thus consumind battery and RAM use this command in adb shell:

ps -A| grep "\."


To disable running an apps (package) in the background use this command in adb shell:


appops set packagename RUN_IN_BACKGROUND ignore

appops set packagename RUN_ANY_IN_BACKGROUND ignore

appops write-settings

To force a process to keep running in the background:

appops set com.pittvandewitt.viperfx RUN_IN_BACKGROUND allow

appops set com.pittvandewitt.viperfx RUN_ANY_IN_BACKGROUND allow

appops write-settings

Note: deny send error back to app, ignore doesn't so app think background is running OK

To see the current OP's for packagename and how much time is spend in that mode:

appops get packagename 

To undo changes use:

appops reset packagename

appops write-settings

To see all apps that can/cannot run in background:

appops query-op RUN_IN_BACKGROUND allow | sort

appops query-op RUN_IN_BACKGROUND ignore | sort

To see alls OP's for all packages: dumpsys appops 


Note: appops is a shortcut to the cmd appos command


Mirror your device on PC/Mac


Very easy with opensource ScrCpy latest here: https://github.com/Genymobile/scrcpy/releases/latest

More info here https://fossbytes.com/mirror-android-phone-to-pc-windows-macos/

Drag and Drop files for transfer to /sdcard, when APK it will be installed. Keyboard and Mouse, Copy Paste, Recording, etc.


Backup and restore device with Google drive


You can do backups and restores to your own Google Drive for each device. This can be done using a few command from the ADB Shell.

adb shell

bmgr enabled          (is it enabled? )

bmgr enable true     (if not enabled yet does settings put secure backup_enabled 1)


Selecting the right transport (backup location)

bmgr list transports    (show all available transports)

    android/com.android.internal.backup.LocalTransport                    (/cache/backup/<token>/_full/)

    com.google.android.gms/.backup.migrate.service.D2dTransport

  * com.google.android.gms/.backup.BackupTransportService           (Google Drive)

For example to set transport to local:

bmgr transport android/com.android.internal.backup.LocalTransport  

Selected transport android/com.android.internal.backup.LocalTransport (formerly com.google.android.gms/.backup.BackupTransportService)


Note: This is the /cache/backup/<token>/_full/<packagename> (Environment.getDownloadCacheDirectory())

-rw------- 1 system system 1186816 2021-01-19 00:09 com.feedr

bmgr list transports

  * android/com.android.internal.backup.LocalTransport                     (/cache/backup)

    com.google.android.gms/.backup.migrate.service.D2dTransport

    com.google.android.gms/.backup.BackupTransportService             (Google Drive)

bmgr list sets      (show all devices with your google account, or local disk if transport is local)

  1 : Local disk image

or with gms BackupTransportService you see your devices in the cloud (Google Drive)

 ...ea593 : Redmi Note 8 Pro

 ...28418 : Xiaomi Redmi 4X

 ...ad91b : cm84

 ...86d68 : Asus Memo Pad HD7

 ...76576 : Samsung...


List the status of the backup

dumpsys backup


Do the backup

For the best backup use the fullbackup option! For example launchers will have widgets restored too.

bmgr fullbackup com.wolf.firelauncher

bmgr run                    (run any pending operations now)

dumpsys backup        (check for Pending key/value backup)


Do the restore

dumpsys backup|grep Current       (show current "TOKEN", here 1)

Current:   1

bmgr restore 1 com.wolf.firelauncher

Scheduling restore: Local disk image

restoreStarting: 1 packages

onUpdate: 0 = com.wolf.firelauncher

restoreFinished: 0

done

bmgr run       (run any pending operations now)


Restore package from other device

bmgr list sets

  ...179e3e4 : Hope Lite

  ...0e28418 : Xiaomi Redmi 4X

  ...a68ad1b : cm84

  ...86d7e68 : Asus Memo Pad HD7

The sets are the TOKENS and device names. 

So if you want to restore settings from a certain package from another device:

bmgr restore <device token> <packagename>


Check backups and other info

dumpsys backup

and search for "Ever backed up"


Scheduled Backups

When using "dumpsys backup" you will notice scheduled times. These are epoch Unix times. (use "date -d @1611321304  #don't use last 3 digits!!!)

When using "dumpsys jobscheduler|grep -i backup" 

  JOB #1000/20536: d98d960 android/com.android.server.backup.FullBackupJob

    1000 tag=*job*/android/com.android.server.backup.FullBackupJob

      Service: android/com.android.server.backup.FullBackupJob

  JOB #1000/20537: 3f6a4a1 android/com.android.server.backup.KeyValueBackupJob

    1000 tag=*job*/android/com.android.server.backup.KeyValueBackupJob

      Service: android/com.android.server.backup.KeyValueBackupJob

  JOB #u0a42/1: cbfb24f com.google.android.gms/.backup.component.GmsBackupSchedulerService

    u0a42 tag=*job*/com.google.android.gms/.backup.component.GmsBackupSchedulerService

      Service: com.google.android.gms/.backup.component.GmsBackupSchedulerService

  JOB #u0a42/2: 88de59d com.google.android.gms/.backup.component.MmsBackupSchedulerService

    u0a42 tag=*job*/com.google.android.gms/.backup.component.MmsBackupSchedulerService

      Service: com.google.android.gms/.backup.component.MmsBackupSchedulerService

      com.miui.backup

      com.android.wallpaperbackup


Now you can use "cmd jobscheduler" 


Red "1" is Job ID.

Get status with "cmd jobscheduler get-job-state com.google.android.gms 1" and it is status "waiting"

Run it now with "cmd jobscheduler run com.google.android.gms 1"

Note: view your backups on Google Drive: https://drive.google.com/drive/backups

Usage bmgr (Android 9):

backup pkg

enable

enabled

run 

init

list transports/sets

restore <token> <filter> pkg / android

transport -c

wipe pkg

fullbackup pkg

backupnow --all [--non-incremental/--incremental]

cancel backups

whitelist  (print transport whitelist)

Auto backup:

   bmgr backup @pm@

   bmgr run

Note:  https://developer.android.com/guide/topics/data/testingbackup

Starting / Stopping apps from the command line (adb)

Android apps are started using so called activities. These activities are listed in the AndroidManifest.xml inside the apk (zip) file.

You can start these activities (and actions) using the am (activity manager) command from a shell. 

am start com.android.settings

am force-stop com.android.settings

am force-stop com.google.android.gms

rm /data/app/com.google.android.gms-2.apk

rm -r /data/data/com.google.android.gms

am start com.google.android.gms

am start -n com.android.settings/.wifi.WifiSettings

am start -n com.android.settings/.wifi.WifiInfo

am start -n com.android.settings/.wifi.WifiManageNetworks

am start -n com.android.settings/.wifi.WifiConnectionSettings   (Normal/Downtown/Home)

am start -n com.android.settings/.ManageApplications

am start -n com.android.settings/.DevelopmentSettings

You can also start actions instead of activities with am -a

am start -n com.android.settings/.TestingSettings

am start -n com.android.settings/.ActivityPicker

am start -a android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS

am start -n com.android.settings/.RadioInfo (enable 4G/LTE if radio present)

is the same result as 

am start -n com.android.settings/.BandMode

am start -n com.android.settings/.ManageApplications

am start -n com.android.settings/.torchlight.TorchlightSettings

am start -n com.android.settings/.TetherSettings

am start -n com.android.settings/.wifi.hotspot.TetherWifiSettings

am start -a android.intent.action.VIEW -d http://www.google.com

am start -n com.android.phone/.callsettings.PhoneNumberLocator

Do a factory RESET with a broadcast

am start -n com.android.phone/.callsettings.CallAlert

am broadcast -a android.intent.action.MASTER_CLEAR

am start -n com.android.phone/.Settings

am start -n com.android.phone/.NetworkSetting

am start -n com.android.phone/.GsmUmtsOptions

Setting airplane mode ON/OFF

am start -n com.android.phone/.CdmaOptions

am start -n com.android.phone/.GsmUmtsCallOptions

settings put global airplane_mode_on 1

am start -n com.android.phone/.CdmaCallOptions

am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true

am start -n com.android.phone/.GsmUmtsCallForwardOptions

am start -n com.android.phone/.CellBroadcastSms

Off

am start -n com.android.phone/.AutoRejectSetting

am start -n com.android.phone/.DataUsage

settings put global airplane_mode_on 0

am start -n com.android.phone/.CallFeaturesSetting

am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

am start -n com.android.phone/.UnlockPINLock (MT)

am start -n com.android.phone/.UnlockPUKLock (MT)

Wifi On:

am start -n com.android.phone/.UnlockSIMLock (MT)

svc wifi enable

am start -n com.android.phone/.PreferredNetworks

am start -n com.android.phone/.callsettings.AnsweringCall

am start -n com.android.phone/.RoamingAutoDialSettings   (Always call to Korea, must be a Samsung option ;) )

Wifi Off:

am start -n com.android.phone/.RoamingSettings

svc wifi disable

am start -n com.android.phone/.RoamingGuard

am start -n com.android.phone/.AutomaticConnectionsSettings

Bluetooth On:

am start -n com.android.phone/.SafetyAssuranceSetting

am start -n com.android.phone/.callsettings.PhoneNumberLocator  (handy !!)

service call bluetooth_manager 12

am start -n com.sec.factory/.app.ui.UIBarometer

Bluetooth Off:

am start -n com.sec.factory/.app.ui.UINFC

service call bluetooth_manager 8

am start -n com.sec.factory/.app.ui.UIOTG

am start -n com.sec.android.app.camera/.Camera

Volume Up:

am start -n com.sec.android.app.camera/.Camcorder

service call audio 1 i32 1

am start -n com.sec.android.gallery3d/.app.SlideshowDream

Volume Down:

service call audio 1 i32 -1

am start -n com.android.musicfx/.ControlPanelPicker

Car Mode On:

service call uimode 1

Try am start -a android.intent.action.MAIN for all registered activities :)

Build.prop

The /system/build.prop file houses the main system settings for Android. Leave it alone. For changing system parameters use a new file called default.prop and place it in the same folder /system. Watch for permissions and owner settings to be the same as build.prop.

 

To get all the current properties use the getprop command in a adb shell. You can set properties with the setprop command or of course using /system/default.prop to make them stick after a reboot.

 

90% of the properties are Android OS (and OS version) related, 10% manufacturer specific. There are a lot of build.prop around with a lot of BS in it. Do research before you use them.

You can find 99.9% of the variables on your device using following commands from an adb shell:

busybox find /system -exec sh -c "busybox strings {} | grep 'ro\.' | sort" \; > /sdcard/_ro_props.txt

busybox find /system -exec sh -c "busybox strings {} | grep 'persist\.' | sort" \; > /sdcard/_persist_props.txt

busybox find /system -exec sh -c "busybox strings {} | grep 'debug\.' | sort" \; > /sdcard/_debug_props.txt

busybox find /data/dalvik-cache -exec sh -c "busybox strings {} | grep 'debug\.' | sort" \; > /sdcard/_debug_props.txt

...

Found that grep -r 'debug\.' /system doesn't work very well.

Note: some persistent.x.x values are stored in the /data/property folder. Check that folder if you remove persistent variables from prop file! 

Note: setting wrong values like false instead of 0 may cause boot problems. Make sure you have CWM Recovery installed

Getprop and Setprop

In a adb shell you can set and get properties mentioned above. Use getprop to list all properties of your device. Use setprop <property> <value>

to set a property. Some properties are Read Only. Usually they start with ro. and can only be set in the system.prop or default.prop. Some properties are stored in the /data/property folder and they will start with persistent. (but not all persistent. props are stored there)

Note: search all properties on your phone with this kind of command: find /system -type f -exec strings -f {} \; | grep "persist\."

busybox

You can get the latest busybox here. It should be copied to the /system/xbin folder on your device and set with the proper permissions and owner: 755 root.root and not with the sticky bit on owner (4755, same applies to sqlite3) Sticky bit on owner or groups means that everyone can run that file with elevated root permissions. That is not safe. You should first su to gain root access and then use busybox or sqlite3.

Busybox can create links for the applets itself like: /system/xbin/busybox --install -s /system/xbin

To remove all its symbolic links again use: find /system/xbin -type l -delete (assuming there are no other symbolic links in /system/xbin)

Linux RAM memory and OOM

In Android Short Overview you can find a short explanation of how the Linux kernel handles RAM memory. Basically you have two situations: a device with or without swap/paging file. Low ram devices (512MB) did popup with Android 4.4 and they use the zram swap disks (compressed RAM disk).

A swap disk is used to write memory pages (4KB) to a disk device or file to free up more RAM when needed. Since zram swap disks compress data you can extend your working RAM memory that way.

Swapping has nothing to do with caching. Linux will use a part of RAM to hold temporary data from programs or files. For me it is not clear how the kernel decides how 

much RAM to use for caching. I cannot find any parameter that sets the size of the cache. Is it simply "all RAM that is not used by any program"?

An explanation of vm.swappiness is as follows. The value vm.swappiness (default 60) controls the balance between anonymous cache pages (for paging running program data) and file cache pages (requested file data, VFS). When a swap file is present vm.swappiness also controls the tendency to page out running program pages to the swap. Lower values keep programs in RAM, will only be swapped when OOM occurs.

There is a formula coded in Linux kernel that goes like this:

swappiness 0 will maximize running program data caching (causes more disk io loading files), will try to avoid swap files

swappiness 60 will balance program data and file cache

swappiness 100 will maximize requested file caching, will use swap files


With the parameter vm.vfs_cache_pressure you can manage the kernels tendency to free up file cache pages (VFS) when more RAM is needed.

The value has a default value of 100. Larger values, like 200, will cause the file cache to be shrunken quicker, thus leaving less files cached.

Example RAM allocation on device with no swap:

A short explanation:

Buffers and Cached are file related. Could be anything that is inside an APK file. These are dropped fastest (together with Inactive(file))because the can be reloaded from disk when needed again. Cached can also be paged out to swap (SwapCached)

AnonPages are non-file related program data. These are allocated on the fly when you start an APK. These can be dropped when OOM closes programs. If you have a swap device (or file) these AnonPages will be paged out to swap (if OOM/LMK did not kill them before)

Adding more swap with help of a swapfile

You can use the (mostly) ununsed /cache partition for adding extra swap storage to your device. You will have to make a swap file there and add it to swap space.

# First 2 commands only once in shell by hand (add 128MB swap)

dd if=/dev/zero of=/cache/swap.swp bs=1024 count=131072

mkswap /cache/swap.swp

swapon /cache/swap.swp

Put last line in your /etc/install-recovery.sh file since /cache file system is persistent flash partition

Check after reboot again with cat /proc/swaps or with busybox free -m

                        total       used       free     shared    buffers     cached

Mem:                842        717        124              0             5            22

-/+ buffers/cache:        690        147

Swap:                   0            0            0

In this example the total cache (vsf and anon) is 5+22 = 27 MB. Total used RAM for Android is 717-5-22 = 690 MB (see buffers/cache line)

zram

Newer kernels support zram partitions. These are dynamic compressed RAM file systems that are used for swap files (paging/caching) on mostly low RAM devices.

An example to initialize zram at startup:

        echo 536870912 > /sys/block/zram0/disksize

        mkswap /dev/block/zram0

        swapon /dev/block/zram0 -p 32758

Note:

I have done quite some testing on low RAM phones with large apps but have found that SWAP is very sparsely used under heavy RAM situations. I even saw used SWAP shrink when started more apps simultaneously. Linux likes to reclaim cache memory first. After that OOM/LMK will kill apps before they have a chance to be paged to the SWAP device. The swappiness settings does not make very much of a difference at this point.

The only time I saw the SWAP usage grow significantly was when testing was if the device was in rest for an hour.

- Android, I want to use SWAP under heavy RAM load, not when it is in rest -

Note1: Disable Kernel Samepage Merging (KSM) since it has little memory gain and cost you battery due to constant cpu usage (about 5%)

Edit your build.prop and set :ro.config.ksm.support=false or put this in your install-recovery.sh: echo 0 > /sys/kernel/mm/ksm/run

Or change the parameters to be less aggressive:

pages_to_scan 20 and sleep_millisecs 7000 (which is default anyway without init.rc settings)

From /init.rc:

on property:ro.config.ksm.support=true

    write /sys/kernel/mm/ksm/pages_to_scan 100

    write /sys/kernel/mm/ksm/sleep_millisecs 500

    write /sys/kernel/mm/ksm/run   1

Note2: keep an eye on the kswapd0 process (use top -m 1). It could be using very high cpu if you misconfigure memory management. This will be hours at 80% or more.

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name

   35  0  80% R     1      0K      0K     root     kswapd0

 1455  0   2% S    20 384964K  91784K  bg u0_a0    com.nng.igoprimoisr.javaclient

32525  0   2% R     1   1152K    424K     root     top

  931  0   1% S     5   6016K    456K     root     /system/bin/mpdecision

  428  1   1% S   118 503360K  77156K  fg system   system_server

This kswapd lock issue, causing high cpu and battery drain, will occur on devices without swap device. You can beat it by changing VM settings.

The best that worked for me was setting vm.swappiness to 10 (default 60) and don't set OOM levels low (advised: 4096,5632,8192,14336,16384,20480). Also increase vm.min_free_kbytes to at lease 2 or 3 % (at lease 4096 = 4MB).

To find last cpu usage to see kswapd (raging at 94% at least 30 seconds) use dumpsys cpuinfo

Load: 11.03 / 11.05 / 12.38

CPU usage from 58447ms to 21204ms ago:

  94% 35/kswapd0: 0% user + 94% kernel

  3.8% 32530/com.google.android.gm: 3.3% user + 0.5% kernel

  ...

  0% 531/com.android.systemui: 0% user + 0% kernel / faults: 4 minor

  0% 1007/thermald: 0% user + 0% kernel / faults: 95 minor

253% TOTAL: 9.8% user + 243% kernel

dumpsys batteryinfo|grep -C 1 kswapd0

    Proc kswapd0:

      CPU: 0ms usr + 39m 6s 0ms krn

Reset Battery statistics with: dumpsys batteryinfo --reset

If you suffer from kswapd rage you can try this solution:

echo "0,1,2,4,9,15" > /sys/module/lowmemorykiller/parameters/adj

echo "6144,8192,10240,12288,14336,16384" > /sys/module/lowmemorykiller/parameters/minfree 

echo 3072 > /proc/sys/vm/min_free_kbytes # higher for smaller page cache

echo 60 > /proc/sys/vm/swappiness

See kernel source for laptop_mode and swappiness: https://github.com/torvalds/linux/blob/master/mm/vmscan.c

It worked for a problematic device I have with 3.4.0 kernel.

OOM Configuration

Every running app gets an OOM SCORE, That goes from 0 to 1000. Apps with score 1000 will be killed sooner when OOM ( Out-Of-Memory) condition occurs. OOM happens when Android cannot allocate (get) more RAM for running apps.

The apps oom_score can adjust with the oom_score_adj value. This can vary between -1000 and 1000.

The values for each app can be found in the /proc/<PID> folder in the files oom_adj, oom_score, oom_score_adj

OOM ADJ levels are functional levels from 0 to 15, -12 and -16. Running apps can have any ADJ level from 0 to 15. The higher the ADJ level, the higher the OOM SCORE. The more likely it is killed when allocatable RAM runs lower.

First we have to find the defined oom_adj levels. They can be found with the dumpsys activity oom command.

The oom_adj levels:

  OOM levels:

    -16: SYSTEM_ADJ

    -12: PERSISTENT_PROC_ADJ

      0: FOREGROUND_APP_ADJ

      1: VISIBLE_APP_ADJ

      2: PERCEPTIBLE_APP_ADJ

      3: BACKUP_APP_ADJ

      4: HEAVY_WEIGHT_APP_ADJ

      5: SERVICE_ADJ

      6: HOME_APP_ADJ

      7: PREVIOUS_APP_ADJ

      8: SERVICE_B_ADJ

      9: CACHED_APP_MIN_ADJ

     15: CACHED_APP_MAX_ADJ

Example with the Launcher app:

ps shows a PID of 742   (u0_a130  742  146   385412 68888 ffffffff 400c2a70 S com.anddoes.launcher)

cat /proc/742/oom_adj      shows 0  (=foreground)

cat /proc/742/oom_score  shows 61

Now we start another activity on the phone like System settings and the Launcher is switched to the home adj level. The oom_adj went up to 6 (=home app) and the oom_score went up to 422

To see all OOM SCORES of all apps you can use: ps -o

USER     PID   PPID  VSIZE  RSS    OOM_ADJ  OOM_SCORE    WCHAN    PC         NAME

u0_a130  742   151   413800 59968  6        422          ffffffff 4020da70 S com.anddoes.launcher

Note: processes with the -16 and -12 oom_adj value will never be killed by OOM.

Changing the OOM configuration

All oom_adj are in 4Kb values, so called memory pages. For MB you will have to multiply all values with 4.

More about OOM configuration here.

First we need to find which OOM adj levels are configured. You can do that with the command: 

cat /sys/module/lowmemorykiller/parameters/adj 

Example for OOM adj levels configured: 0,1,2,4,9,15

Now we look at the memory threshold configured on your device with that command: /sys/module/lowmemorykiller/parameters/minfree

That will give you something like this: 3072,4546,5816,14522,16663,20480

So to complete the story the complete picture for above situation is:

0   FOREGROUND_APP    12 MB (3072x4kB)

1   VISIBLE_APP             18 MB (4546x4kB)

2   PERCEPTIBLE_APP      23 MB (5816x4kB)

3    BACKUP_APP                  57 MB

4   HEAVY_WEIGHT_APP 57 MB (14522x4kB)

5    SERVICE                         65 MB

6    HOME                            65 MB

7    PREVIOUS_APP               65 MB

8    SERVICE_B                     65 MB

9   CACHED_APP_MIN    65 MB (16663x4kB)

10  CACHED ..                     80 MB

11  CACHED ..                     80 MB

12  CACHED ..                     80 MB

13  CACHED ..                     80 MB

14  CACHED ..                     80 MB

15 CACHED_APP_MAX    80 MB (20480x4kB)

All other, not listed in the adj file) oom_adj memory thresholds are copied from next listed one above.

So if you want to use all oom_adj levels     (or can it be only 6 entries?):

echo "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" > /sys/module/lowmemorykiller/parameters/adj

echo "1024,2048,3072, ....." > /sys/module/lowmemorykiller/parameters/minfree

To check the times oom kicked in see: cat /sys/module/lowmemorykiller/parameters/oomcount

(or cat /sys/module/lowmemorykiller/parameters/lmkcount)

List all OOM values for processes with ps -o

USER     PID   PPID  VSIZE  RSS    OOM_ADJ  OOM_SCORE    WCHAN    PC         NAME

root      1     0     540    376    -16     0            c013d634 000117e0 S /init

root      2     0     0      0      0       0            c00a2de0 00000000 S kthreadd

u0_a15    2506  147   358632 32692  7       449          ffffffff 401f1a70 S com.google.android.gms.feedback

u0_a39    3015  147   334812 53424  1       120          ffffffff 401f1a70 S com.google.android.tts

system    3133  147   329568 31724  2       154          ffffffff 401f1a70 S com.android.MtpApplication

Disable OOM (not advised)

Disable OOM all together (disarm it):

echo 9999 > /sys/module/lowmemorykiller/parameters/adj     # OOM adj level for process to kill

echo    1 > /sys/module/lowmemorykiller/parameters/minfree # kill if free mem reaches (4kb blocks)

or simple one level OOM:

echo    4 > /sys/module/lowmemorykiller/parameters/adj     # OOM level (BACKUP_APP_ADJ) process or higher to kill

echo 8192 > /sys/module/lowmemorykiller/parameters/minfree # kill if free mem reaches (4kb blocks)

There are more memory management systems these days. I know of LMK and DHA/FHA.

Tip: use Kernel Adiutor for this OOM and other Kernel stuff

Note: messing with these parameters can cause crashes or battery drain. Manufacturers know what they do settings these to the best values.

Start or stop init.rc services

In the /init.rc file there are initial services that are started at boot time. You can start or stop them. Use this command to find them:

cat /init.rc|grep service

So if you want to stop the mtpd you type: stop mtpd

If you want to stop and start the ril deamon (telephony) then: stop ril-daemon   and   start ril-daemon

If you want to stop Android just type stop. You can start Android again typing only start.

Note:  you cannot start or stop services from apps with these commands.

Applying settings at startup (init.d)

When your device boots the kernel's /init.rc file is executed. This file is in the kernel you you cannot do easy editing on it.

Some "init.rc" services are started from this file to. 

Take a close look at that /init.rc file. You will see that /system/etc/install-recovery.sh is called8 there like this:

 

service flash_recovery /system/etc/install-recovery.sh

    class main

    oneshot

   

 

Now we can create a shell script /system/etc/install-recovery.sh that executes anything you want at boot time.

 

#!/system/bin/sh

sysctl -w net.ipv6.conf.wlan0.disable_ipv6=1

...

etc 

 

Of course you can put into the install-recovery script what you want. Most setprop or sysctl commands or even use it for a semi init.d mechanism.

Command you can use in the install-recovery.sh (example):

# We might need the total RAM in this script

RAM_MB=$(($(busybox awk '/MemTotal/{print $2}' /proc/meminfo)/1024))

# Misc tweaks for battery life, write back dirty cache ever 10 sec

busybox sysctl -w vm.dirty_writeback_centisecs=1000 #500

#echo "1000" > /proc/sys/vm/dirty_writeback_centisecs #500

busybox sysctl -w vm.dirty_expire_centisecs=400 #200

# Increase the read ahead for all disks (def 128, inode ext4 32)

#busybox find /sys -name read_ahead_kb -exec sh -c "echo 256 > {}" \; #128 (32*4KB blocks)

#busybox find /sys/fs/ext4 -name inode_readahead_blks -exec sh -c "echo 64 > {}" \; #32

# Decrease the read ahead for all disks (def 128, inode ext4 32) to minimize unusable dirty cache

busybox find /sys -name read_ahead_kb -exec sh -c "echo 64 > {}" \; #128 (16*4KB blocks)

busybox find /sys/fs/ext4 -name inode_readahead_blks -exec sh -c "echo 16 > {}" \; #32

# cat /proc/sys/kernel/random/entropy_avail should be > 2000

# cat /proc/sys/kernel/random/poolsize   > poolsize/2=write write/2=read

busybox sysctl -w kernel.random.read_wakeup_threshold=1024 # 64

busybox sysctl -w kernel.random.write_wakeup_threshold=2048 # 128

# zram read buffer only 64KB

echo "64" > /sys/devices/virtual/block/zram0/queue/read_ahead_kb #128

busybox sysctl -w vm.min_free_kbytes=1024 #5120

busybox sysctl -w vm.swappiness=1 #60 if no swap disk/file then 0? With zram swap 100 !!

busybox sysctl -w vm.overcommit_ratio=70   #50 %RAM at expense of cache?

busybox sysctl -w vm.vfs_cache_pressure=200 #100 >100 reclaim cache more for running programs

# avc cache. Not less than "entries". Check with cat /selinux/avc/hash_stats

echo 256 > /sys/fs/selinux/avc/cache_threshold #512

# For devices with zram

if [ -f /sys/block/zram0/disksize ]; then

  ZRAM=$((RAM_MB/4)) #zram is compressed, aiming at 1/4 real RAM

  swapoff /dev/block/zram0

  echo 1 > /sys/block/zram0/reset

  sleep 2 # needed after reset!!!

  echo $((ZRAM*1024*1024)) > /sys/block/zram0/disksize

  mkswap /dev/block/zram0

  swapon /dev/block/zram0

fi

busybox sysctl -w net.ipv6.conf.all.disable_ipv6=1 #0

# On a wifi only tablet you don't need telephone

# On a wifi only tablet you don't need telephone

if [ "$(getprop init.svc.ril-daemon)" == "running" ] && [ "$(getprop gsm.sim.operator.alpha)" == "" ]

 then stop ril-daemon

fi

# list them with: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

echo hotplug > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# adjust the low memory killer OOM

echo "1024,1280,4096,5120,6144,7680" > /sys/module/lowmemorykiller/parameters/minfree

sync

busybox sysctl -w vm.drop_caches=3

If you can mount rootfs as rw (mount -o remount,rw /) you can change the /init.rc file to fire any shell script without the need to flash boot.img again. 

Below you find some options to put in your install-recovery.sh file

#!/system/bin/sh

logfile=/data/local/tmp/mylog.log

echo $(date) > $logfile

# disable Google Play Services for better battery

#pm disable com.google.android.gms

# We might need the total RAM in MB for this script

RAM_MB=$(($(busybox awk '/MemTotal/{print $2}' /proc/meminfo)/1024))

# check if Low mem is available first

grep LowTotal /proc/meminfo && LOW_MB=$(($(busybox awk '/LowTotal/{print $2}' /proc/meminfo)/1024))

grep LowTotal /proc/meminfo && RATIO_MB=$((100*$LOW_MB/$RAM_MB)) #Ratio > 55?

#echo $((RAM_MB*4)) > /proc/sys/vm/min_free_kbytes # official Sqrt(Memtotal*16)

echo RAM: $RAM_MB LRAM: $LOW_MB RATIO: $RATIO_MB >> $logfile

sleep 30 # wait until /etc/init.qcom.post_boot.sh (or other) script has run

### Tweaks for performance and stability

#echo 500  > /proc/sys/vm/dirty_expire_centisecs #200

#echo 1000 > /proc/sys/vm/dirty_writeback_centisecs #500 (write to disk later)

#echo 10  > /proc/sys/vm/dirty_ratio #20 %FREERAM talking kb's

#echo 2  > /proc/sys/vm/dirty_background_ratio #5 %FREERAM talking kb's

#echo 0 > /proc/sys/vm/overcommit_memory #1 

#echo 60 > /proc/sys/vm/overcommit_ratio #50+swap see /proc/meminfo:CommitLimit %RAM

#echo 50 > /proc/sys/vm/swappiness #60 (0-100)

#ls /sys/fs/cgroup/memory/sw/memory.swappiness && echo 50 > /sys/fs/cgroup/memory/sw/memory.swappiness

#echo 50 > /proc/sys/vm/vfs_cache_pressure #100 (0-1000) free more page then vfs cache (kswapd)

ls /proc/sys/vm/highmem_is_dirtyable && echo 1 > /proc/sys/vm/highmem_is_dirtyable # faster I/O

ls /proc/sys/vm/extfrag_threshold && echo 100 > /proc/sys/vm/extfrag_threshold #500

# cat /proc/sys/kernel/random/entropy_avail  must be > 2000

echo 128 > /proc/sys/kernel/random/read_wakeup_threshold  #(64)

echo 256 > /proc/sys/kernel/random/write_wakeup_threshold #(128)

echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 #(0)

echo 2 > /proc/sys/net/ipv4/tcp_adv_win_scale #(1)

echo 1 > /proc/sys/net/ipv4/tcp_low_latency #(0)

echo "Original oom parameters:" >> $logfile

cat /sys/module/lowmemorykiller/parameters/adj >> $logfile

cat /sys/module/lowmemorykiller/parameters/minfree >> $logfile

cat /proc/sys/vm/min_free_kbytes >> $logfile

# Valid OOM 0 to 15

#  OOM levels:

#    SYSTEM_ADJ: -16

#    PERSISTENT_PROC_ADJ: -12

#    FOREGROUND_APP_ADJ: 0

#    VISIBLE_APP_ADJ: 1

#    PERCEPTIBLE_APP_ADJ: 2

#    HEAVY_WEIGHT_APP_ADJ: 3

#    BACKUP_APP_ADJ: 4

#    SERVICE_ADJ: 5

#    HOME_APP_ADJ: 6

#    PREVIOUS_APP_ADJ: 7

#    SERVICE_B_ADJ: 8

#    HIDDEN_APP_MIN_ADJ: 9

#    HIDDEN_APP inbetween (aka CACHED_APP)

#    HIDDEN_APP_MAX_ADJ: 15

# two settings that are overriden by some other post boot script.

# to view OOM levels: dumpsys activity oom

# OOM ADJ and SCORE with: ps -o

#echo "0,1,2,4,9,15" > /sys/module/lowmemorykiller/parameters/adj #(0,1,2,4,9,12)

#echo "6144,8192,10240,12288,14336,16384" > /sys/module/lowmemorykiller/parameters/minfree #24,32,40,48,56,64 MB

#echo 4096 > /proc/sys/vm/min_free_kbytes # higher for smaller page cache (3072)

#echo $((RAM_MB*4)) > /proc/sys/vm/min_free_kbytes # for 900MB about 3600KB

# kernel 3.4.0 assigns to little lowmem, correct lowmem watermark. See /proc/zoneinfo

uname -r|grep '3.4.0' && echo "16 16" > /proc/sys/vm/lowmem_reserve_ratio # double it

#Stop OOM, Kill processes with oom_adj value 9999 if minfree is 4kb (will never happen!)

#echo 9999 > /sys/module/lowmemorykiller/parameters/adj # OOM adj level for process

#echo 1 > /sys/module/lowmemorykiller/parameters/minfree # kill if free mem reaches (4kb blocks)

# Simple OOM kill all process with OOM ADJ level 4 or higher when free mem less than 32 MB

#echo 4 > /sys/module/lowmemorykiller/parameters/adj # OOM adj level for process (BACKUP_APP_ADJ)

#echo 8192 > /sys/module/lowmemorykiller/parameters/minfree # kill if free mem reaches 32 MB

#echo 5 > /sys/module/lowmemorykiller/parameters/debug_level #2 (0-5) write logcat killed process

#echo 64 > /sys/module/lowmemorykiller/parameters/cost #32 64 is less agressive adj

# disk read ahead buffer (def 128, inode ext4 32) (cat /proc/diskstats, find /sys -name read_ahead_kb)

# smaller read_ahead causes less dirty pages in cache

# test speed: hdparm -tT /dev/block/vold/179:33 (see mount)

busybox find /sys -name read_ahead_kb -exec sh -c "echo 64 > {}" \; #(128) (16*4KB blocks)

busybox find /sys/fs/ext4 -name inode_readahead_blks -exec sh -c "echo 16 > {}" \; #(32)

# Give netd more prio for quicker inet

busybox renice -15 $(pidof netd)

# let kswapd0 only run on CPU0 (testing)

#echo 0 > /proc/irq/$(pidof kswapd0)/smp_affinity_list

# External sdcard read_ahead from 128 KB to 256 KB (/dev/block/vold/179:33 /storage/extSdCard)

echo 256 > /sys/devices/virtual/bdi/179:32/read_ahead_kb

governor=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`

echo Original governor: $governor >> $logfile

# we want hotplug or interactive, if found (return code $? is 0) set it

grep interactive /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors && governor=interactive

grep hotplug /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors && governor=hotplug

#activate the governor, will create "/sys/devices/system/cpu/cpufreq/$governor" folder

if [ $governor ]; then

 chmod 644 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

 echo $governor > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

 chmod 444 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

fi

case "$governor" in

"interactive")

  # Interactive governor if no hotplug

  echo 20000 > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay

  echo 95 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load #85

#  echo 1209600 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq

  echo 0 > /sys/devices/system/cpu/cpufreq/interactive/input_boost

  echo 80000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time

  echo 20000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate

  echo Interactive governor set >> $logfile

  ;;

"hotplug")

  # hotplug governor

  echo 30 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_down_avg_times

  echo 10 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_down_differential

  echo 0 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_hotplug_disable

  echo 1 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_num_base

#  echo 4 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_num_limit

  echo 10 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_up_avg_times

  echo 95 > /sys/devices/system/cpu/cpufreq/hotplug/cpu_up_threshold

  echo 10 > /sys/devices/system/cpu/cpufreq/hotplug/down_differential

  echo 0 > /sys/devices/system/cpu/cpufreq/hotplug/ignore_nice_load

  echo 1 > /sys/devices/system/cpu/cpufreq/hotplug/io_is_busy

  echo 0 > /sys/devices/system/cpu/cpufreq/hotplug/powersave_bias

  echo 1 > /sys/devices/system/cpu/cpufreq/hotplug/sampling_down_factor

  echo 80000 > /sys/devices/system/cpu/cpufreq/hotplug/sampling_rate

  echo 30000 > /sys/devices/system/cpu/cpufreq/hotplug/sampling_rate_min

  echo 85 > /sys/devices/system/cpu/cpufreq/hotplug/up_threshold

  echo Hotplug governor set >> $logfile

  ;;

*)

  echo Could not find Interactive or Hotplug governor >> $logfile

  ;;

esac

# check if we need telephone services to run on this device

baseband=`getprop ro.baseband`

echo ro.baseband property: $baseband >> $logfile

case "$baseband" in

 "whatever" | "unknown") #Tablet without GSM/SIM

  stop netmgrd

  stop qmuxd

  stop ril-daemon

esac

# Clear battery statistics at boot

dumpsys batteryinfo --reset || dumpsys batterystats --reset

### For Phone

### Disable Bandwidth restrictions (Don't use on Android 6+, traffic monitor won't work!)

setprop persist.bandwidth.enable 0

ndc bandwidth disable 

### limit debug file in /data/system/dropbox

#content insert --uri content://settings/secure --bind name:s:dropbox_max_files --bind value:i:1

#content insert --uri content://settings/global --bind name:s:dropbox_max_files --bind value:i:1 (Android > 4.2)

rm /data/system/dropbox/*

### remove tombstones (crash logs)

rm /data/system/shared_prefs/*

rm /data/tombstones/*

# First 2 commands only once in shell by hand

#dd if=/dev/zero of=/cache/swap.swp bs=1024 count=131072

#mkswap /cache/swap.swp

ls /cache/swap.swp && swapon /cache/swap.swp

### sync file system, clear page cache

sync

echo 1 > /proc/sys/vm/drop_caches

echo Done >> $logfile

echo For details see $logfile

exit 0

Devices without swap disk(about 1 GB RAM):

echo 3514 > /proc/sys/vm/min_free_kbytes

echo "6144,8192,10240,12288,14336,16384" > /sys/module/lowmemorykiller/parameters/minfree #24,32,40,48,56,64 MB

For Low RAM devices with zram swap (512 MB RAM):

echo 100 > /proc/sys/vm/swappiness #(60) force to use swap

echo 100 > /sys/fs/cgroup/memory/sw/memory.swappiness

setprop sys.vm.swappiness 100

echo 2048 > /proc/sys/vm/min_free_kbytes #we have swap file so this can be low

echo "2048,4096,5120,7168,8192,12800" > /sys/module/lowmemorykiller/parameters/minfree #8,16,20,28,32,50 MB

#sysctl -w vm.extra_free_kbytes=2048    #4500

sysctl -w vm.user_reserve_kbytes=8192    #14218

sysctl -w vm.page-cluster=0                    #3(8) 0=1 1=2 2=4 3=8 pages of 4 KB per read (high=laggy)

For low RAM devices (512MB) you can win some free RAM decreasing the default display cache sizes. These are based on a screen resolution of 1280x800. More info here. A 800x480 screen uses 2.6 times less memory for display cache.

For low RAM or screen resolution like 800x480 you can set caches like this in build.prop/default.prop:

#ro.hwui.fbo_cache_size=16

ro.hwui.fbo_cache_size=8

#ro.hwui.layer_cache_size=16

ro.hwui.layer_cache_size=8

#ro.hwui.texture_cache_size=24

ro.hwui.texture_cache_size=10

#ro.hwui.texture_cache_flush_rate=0.6

ro.hwui.texture_cache_flush_rate=0.2

ro.hwui.texture_cache_flushrate=0.2

A nice read on memory on Android (low RAM devices) here.

To view the current app memory usage: dumpsys meminfo

To view the linux vm memory status: cat /proc/vmstat   or   cat /proc/meminfo

To view the OOM situation: dumpsys activity oom

For low ram devices add more swap with help of /cache/swap.swp like described earlier.

Storage Speed Test

You can test the read speed of your NAND and sdcard with the busybox hdparm utility. Use mount to find the storage devices.

/dev/block/vold/179:33 /storage/extSdCard vfat rw,dirsync,no

Then test for cached and direct read mode speeds:

hdparm -tT /dev/block/vold/179:33

/dev/block/vold/179:33:

Timing buffer-cache reads:   360 MB in 0.51 seconds = 721924 kB/s

Timing buffered disk reads:   53 MB in 3.00 seconds = 18062 kB/s

dumpsys command

dumpsys -l          list all the possible services you can use with dumpsys command. (user, not root)

With every service found (see examples below) you can use the -h option: dumpsys activity -h

activity [activities] [broadcasts] [oom] [permissions] [providers] [services]

battery

content    (like system/global/secure settings)

deviceidle

package l[ibraries] f[eatures] perm[issions] pref[erred]

window

dumpsys activity services | grep ServiceRecord    # get all running package services

Using dumpsys to fake battery status:

dumpsys battery info

dumpsys battery level 5  # fake battery level

dumpsys battery usb 0  # disable charging

dumpsys battery reset  # back to reality

Using dumpsys to force deviceidle ("app doze mode"):  

dumpsys deviceidle enabled    # ask if "app doze mode" is enabled

dumpsys deviceidle enable all    #  Nougat, mLightEnabled=true  mDeepEnabled=true

dumpsys deviceidle disable light   # Nougat, disable only light doze mode

dumpsys deviceidle disable

dumpsys deviceidle force-idle

dumpsys deviceidle whitelist

dumpsys deviceidle step deep   # Nougat, activate deep doze

dumpsys package com.android.systemui   # list all activities, intents broadcasts, permissions and services fro that package

dumpsys statusbar  # list all possible icons on statusbar

dumpsys sensorservice  # list of all devices sensors

dumpsys usb -h <..>  # emulate usb port functions

dumpsys power  # list all power related setting

dumpsys uimode  # list twilight mode, sunrise sunset :)

dumpsys deviceidle  # list device Doze variables and state

dumpsys deviceidle force-idle # Force device Doze

Etc...

sysctl command

Other more kernel (unix) related variables can be set using sysctl command from the adb shell or by a shell script. If you have a rooted device you have busybox installed. One of the busybox applets is sysctl. If busybox is installed properly you can type sysctl in an adb shell.

With sysctl -a you get all the current values. You can set values with sysctl -w <name>=<value>

 

Examples:

sysctl -w net.ipv6.conf.wlan0.disable_ipv6=1

sysctl -w net.ipv4.tcp_app_win=44

sysctl -w net.ipv4.tcp_mtu_probing=1

sysctl -w net.ipv4.tcp_wmem="4096 16384 404480"

 

All sysctl variables have files with their value in it. Alternatively to the sysctl -w command you can use echo to change them too. The values are all stored under the /proc/sys/ folder. 

Example: echo 1 > /proc/sys/net/ipv4/tcp_mtu_probing

svc command

From the shell or in a script you can use the svc command to control some states: power, 3G, wifi and usb

Available commands:

    help     Show information about the subcommands

    power    Control the power manager

    data     Control mobile data connectivity

    wifi     Control the Wi-Fi manager

    usb      Control Usb state

    nfc      Control NFC functions

svc wifi enable - turn on wifi

svc wifi prefer - prefer wifi data over 3G

svc usb getFunction - see how usb is connected

svc usb setFunction mtp,mass_storage,adb  - change usb mode, cat /init.usb.rc | grep 'sys.usb.config='

Android's settings db

Android uses a lot of SQLite3 databases to store settings. Much Android apps use a SQLite db. Also Android itself. The most important settings of Android can be found in the settings secure and the system tables of the database, and global table since Android 4.x

Settings and the table name where they are stored vary per Android version and API/SDK level. Some settings are depreciated, others move from the system to the global table when API levels (Android versions/SDK) go up.

Get your API level: adb shell getprop ro.build.version.sdk

Googles documentation on the settings:

Most of the settings can be found if you decompile framework.jar and framework2.jar

content query --uri content://settings/system --sort "name ASC"

content query --uri content://settings/secure --sort "name ASC"

content query --uri content://settings/global --sort "name ASC"

content query --uri content://settings/secure --where "name like 'wifi%'"

content insert --uri content://settings/secure --bind name:s:wifi_idle_ms --bind value:i:60000

content insert --uri content://settings/secure --bind name:s:dropbox_max_files --bind value:i:1

or for Android 4.2+

content insert --uri content://settings/global --bind name:s:wifi_idle_ms --bind value:i:60000

content insert --uri content://settings/global --bind name:s:dropbox_max_files --bind value:i:1

content insert --uri content://settings/system --bind name:s:auto_toast_count --bind value:i:1

content update --uri content://com.anddoes.launcher.settings/favorites --where "title='Maps'" --bind title:s:'Google Maps'

content insert --uri content://settings/secure --bind name:s:default_input_method --bind value:s:com.sec.android.inputmethod/.SamsungKeypad

Note: be very careful with these commands. Use insert instead of update. The databases may be lost or emptied if you do it wrong. Make backup first!

Example tracing a value found in content://settings/system  (check system for your Android version first)

content query --uri content://settings/system | grep with_circle

>> Row: 403 _id=59333, name=with_circle, value=0

busybox find /system -exec sh -c "busybox strings -f {} | grep 'with_circle' " \;

>> /system/framework/framework.odex: with_circle

Another way of setting wifi_idle_ms is to use the settings command.

settings put global wifi_idle_ms 300000

settings get global wifi_idle_ms

settings put secure wifi_watchdog_on 0

settings put secure wifi_watchdog_poor_network_test_enabled 0

settings put secure sysui_qs_tiles wifi,bt,inversion,cell,airplane,rotation,flashlight,readmode,location,cast,hotspot,remotewindow,hotknot,audioprofile,dataconnection,simdataconnection,dulsimsettings,apnsettings

settings put secure sysui_qs_tiles default

settings delete secure sysui_qs_tiles

settings put system screen_brightness_mode 0

settings put system screen_auto_brightness_adj 0

settings put secure display_density_forced 340

settings put secure lock_screen_show_notifications 1

settings put secure lock_screen_allow_private_notifications 1

settings put secure lock_screen_owner_info "If lost please contact Tweakradje at gmail dot com"

settings put global zen_mode 1   # don't disturb mode

settings put global heads_up_notifications_enabled 1  # big notification toast at top of screen

settings put global heads_up_snooze_length_ms 2000

settings put global add_users_when_locked 0   # not very secure to switch this on

settings put global dropbox_max_files 1 # reduce nr crash files in /data/system/dropbox to 1

settings put secure location_providers_allowed +gps  # add gps option to existing values

settings put secure location_providers_allowed -gps  # remove gps option to existing values

(Android 6+)

settings list system

settings list secure

settings list global

From Android 6 (MarshMallow) these settings have moved from a sqlite3 db to xml files, located at /data/system/users/0/settings_system.xml, settings_secure.xml and settings_global.xml

To get all LIVE monitored settings values you can use this dumpsys content:

dumpsys content | grep settings/ | sort

  settings/global/HIC_enable: pid=2044 uid=10031 user=-1 target=3df1a5c

  settings/global/adb_always_notify: pid=1739 uid=1000 user=0 target=eb5ce2c

  settings/global/adb_enabled: pid=1739 uid=1000 user=0 target=44061df

  settings/global/add_users_when_locked: pid=2044 uid=10031 user=0 target=2377dd5

To get all settings used in the ROM:

dumpsys activity provider all > /sdcard/_ALL_SETTINGS.TXT (up to Android 7)

dumpsys settings > /sdcard/_ALL_SETTINGS.TXT (from Android 7)

Or use from Windows command line: adb bugreport > bugreport.txt

adb over wifi

You can use adb over wifi too. Here is how.

On your pc now type: adb connect <ip of your device>

Note: It is not wise to put service.adb.tcp.port in your default.prop or build.prop as it opens a permanent hole for hackers.

Trim Flash storage cells

You device stores info in Flash Memory. Like SSD disks do. These memory cells can only be used for writing X times. So they are protected and switched off when they have been released to be rewritten, like a file has been deleted. This to protect them from being written to many times.

After a month or so you can make them available again for storage (trimming). Use the fstrim command for that.

busybox fstrim -s /data

busybox fstrim -s /system

busybox fstrim -s /cache

Handy Linux commands

To get your way around Linux these command come in handy. For the correct syntax just type the command. With 20% of all the linux commands you can do 80% of the work.

cd <a folder> - change directory, example: cd /etc

ls <options> <pattern> - list a folders content, example: ls -l *.prop

cat <files> - show content of <files>, example: cat /init.rc  Create file: cat > file1.txt  Add to file: cat >> file1.txt  then enter multi line text and close with CTRL+\ Z

cp <options> <source> <destination> - copy files or folders, example: cp /sdcard/install-recovery.sh /etc

rm <options> <files> - remove a file or folder, example: rm /data/dalvik*/*

echo <sometext> - print <sometext> on the screen, example: echo $?  which print last command errorlevel

grep <options> <pattern> <files> - find content in <files>, example: grep -ir 'debug\.' *

chown <owner>.<group> <files> - user 0 and group 0 is root, example: chown 0.0 *.sh

chmod <-R> <pattern> <files> - pattern is 3 bytes: owner group world, like 755, r=4 w=2 x=1 for each byte, example: chmod 755 *.sh

  find -type f -exec chmod 644 {} \;     change all file permissions to rw-r--r--

  find -type d -exec chmod 755 {} \;    change all directory permissions to rwxr-xr-x

find <from> <options> <pattern> - find files but very powerfull, example: find / -name '*prop' -exec cat {} \;

lsmod - list loaded modules/drivers (list them with ls -l /system/lib/modules)

insmod <filename.ko> - load a module/driver, example: insmod /system/lib/modules/ath6kl_sdio

rmmod <module> - unload module, example: rmmod  ath6kl_sdio

modinfo <filename> - get all the info for that module

ps - process status gives you a list of what is running on your system

(renice <prio> <pid> - change priority of a running process)

top <options> - shows the processes that use the most cpu, example: top -n 1 -m 10

mount <options> - connects a block device to a folder, example: mount -o remount,rw /system

ln <-s> <source> <destination> - make links in the file system, example: ln -s /system/etc /etc

df  <folder> - disk free shows amount of free bytes of mounted block devices, example: df /system

du <options> <folder> - disk usage shows amount of used bytes of a folder, example: du -k -s /system

sync - write cache to disk (called dirty cache)

reboot - reboot the device

while ! pidof com.android.settings ; do sleep 1 ; done   -  wait for android settings db

while ! pidof com.android.systemui ; do sleep 1 ; done   -  wait for android GUI

BRIGHTNESS="$(cat /sys/class/leds/lcd-backlight/brightness)"  -  put output of command into variable 

date -d @1611321304  #convert Linux epoch date (secs since 1-1-1970) to readable format, don't use last 3 numbers

...

Android has a stripped down version of busybox called toolbox. You can find the commands with ls -l /system/bin and see links "-> toolbox"

Busybox adds loads of commands to this list. Type busybox to list all commands. You can run these commands by typing busybox <command>

Then you can use output redirection and piping. Some examples:

echo 1000 > /proc/sys/vm/dirty_writeback_centisecs

cat /system/build.prop | grep -i 'ro\.'

One beautiful example of the find command. Change the owner and group on only folders in the /system folder

busybox find /system -type d -maxdepth 1 -exec chown root.root {} \;

Or on every single file starting with the /system folder:

busybox find /system -type f -exec chown root.root {} \;

Or find all files called read_ahead_kb beginning at the /sys folder and echo 256 into them:

busybox find /sys -name read_ahead_kb -exec sh -c "echo 256 > {}" \;

Use text from clipboard to fill a_file via terminal: 

or cat >> a_file to append clipboard text to an existing file

Search *.odex file for content "ro.":  find / -type f -exec strings -f {} \; | grep "ro\."

Mass rename files, for example *.*.ORG into *.*: for f in *.ORG; do mv "$f" "${f%.ORG}"; done

                                 or rename *.* into *.*.ORG: for f in *; do mv "$f" "${f}.ORG"; done

Network info

This will show you commands to get info about your network cards and ip/mac adresses, routing, live connectios etc. This is all done from the adb shell.

First you want to know which network cards you have in your device: netcfg

netcfg

rmnet0   DOWN                            178.225.239.54/30  0x00000000 00:00:00:00:00:00

rmnet1   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

.....

ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00

lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00

sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00

p2p0     UP                                     0.0.0.0/0   0x00001003 e6:40:e2:57:36:6b

wlan0    UP                                  10.0.0.138/24  0x00001043 e4:40:e2:57:36:6b

or ip addr or ip link

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: rmnet0: <> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000

    link/[530]

    inet 178.225.239.54/30 scope global rmnet0

.....

16: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether e4:40:e2:57:36:6b brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.138/24 brd 10.0.0.255 scope global wlan0

    inet6 fe80::e640:e2ff:fe57:366b/64 scope link

       valid_lft forever preferred_lft forever

17: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000

    link/ether e6:40:e2:57:36:6b brd ff:ff:ff:ff:ff:ff

With the command netstat you will get all live network connections.  To see all network traffic bytes since boot use dumpsys netstats

If you have a rooted device you can disable the bandwidth limit with setprop persist.bandwidth.enable 0 or temporarily with ndc bandwidth disable

Powerrrrrr...and CPU's

 

Android like any other OS runs on the cpu. As time goes by the number of cpu cores grow. Now we are on quad cores. That means you have 4 cpu's packed in one chip. To have so much cpu power has a downside on a phone or tablet: huge power consumption so short battery life.

Cpu's therefore have a few tricks to reduce power consumption:

The process that regulates those things (scaling) to happen is called the governor. Simply put: more cpu cores and more Mhz if you need it.

 

Android has a few of those governors built in. You can find them for your device in the kernel file:

/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

ondemand userspace powersave hotplug performance

 

The current governor can be found in this file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

 

For multiple core cpu's on phone and tablet it is advised to use the hotplug governor. Also if you have multiple cpu's only the cpu0 cpufreq files are used.

 

If you use other governors you can also switch cores on or off and set the max core speed like this:

echo 1 > /sys/devices/system/cpu/cpu1/online

echo 1 > /sys/devices/system/cpu/cpu2/online

echo 1 > /sys/devices/system/cpu/cpu3/online

echo 1508000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

 

But you cannot set any speed for your cpu cores. The speeds allowed are fixed in this file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

1508000 1404000 1300000 1209000 988000 754000 497250

 

To monitor your cpu in real time you can use this program called PerfMon by ChainFire. To manage your governor you can use programs like NSTools or No-frills CPU Control.

 

When your device turn off the screen it usually goes into the Deep Sleep state.  If it doesn't then something is very wrong. Most common is that some process keeps the data connection on continuously. You can check the cpu state history with CPU Spy or No-frills CPU Control (in settings add Deep Sleep).

 

There are many "Battery Savers" in the store. Most switch off Wifi and 3G/2G/Radio at given times, kill tasks that run or even lower the CPU frequency while the screen is off. I cannot recommend any of them but I have tried a few. Most use more power then they save. Below I will name a few.

 

Deep Sleep Battery Saver has a different approach then other battery savers. It will force running processes to stop (go into deep sleep) and wakes them up at given intervals. In the free version you cannot set much but for most users it will do. 

 

Night Battery Saver and Timed Toggles just switch off your data connections during a given period. Very simple and effective.

The GPU

Beside de cpu(s) Android devices also have a GPU for processing graphics, hardware encoding/decoding video, OpenGL, etc. 

Default the Android GUI (like Home Launcher) use the cpu to render it. If you have enabled the Development Options you can set the GPU to to that for you. Force GPU for 2D in all applications.

You can also set it in /system/default.prop (don't use system.prop)

debug.sf.hw=1

persist.sys.ui.hw=1

persist.sys.composition.type=gpu

The Surface Flinger

On Android there is a part that takes care of the GUI graphics when you scroll or swipe on the screen. It is called the Surface Flinger.

You can set some properties to make it behave to your liking. My preferred settings that can be set in /system/build.prop or better in /system/default.prop are:

debug.sf.hw=1

# Surface flinger 1.0 2.0 4000

ro.fling.distance.coef=2.0

ro.fling.duration.coef=3.0

ro.max.fling_velocity=3000

Package Manager from the command line

The binary for installing and managing packages (apk's) is simply called pm. pm is very useful and can do things you can't from the gui.

Some usage info:

pm list packages

pm list features

pm list libraries

pm path PACKAGE

pm dump PACKAGE

pm install ANY.APK

pm uninstall [-k] PACKAGE

pm clear PACKAGE

pm enable PACKAGE_OR_COMPONENT

pm disable PACKAGE_OR_COMPONENT

pm block PACKAGE_OR_COMPONENT

pm unblock PACKAGE_OR_COMPONENT

pm grant PACKAGE PERMISSION

pm revoke PACKAGE PERMISSION

pm set-install-location [0/auto] [1/internal] [2/external]

pm get-install-location

for p in `pm list packages -d -u` ; do pm clear ${p/package:/} ; done #clear data for every disabled package

pm install /sdcard/whatsapp.apk installs WhatsApp on your device.

pm list packages |grep whats   shows  package:com.whatsapp

pm list packages -d -f    shows all disabled packages with apk path

cd /data/data && for d in * ; do pm list package $d ; done || rm -r $d

pm path com.whatsapp   shows  package:/data/app/com.whatsapp-1.apk

pm dump com.whatsapp   shows all info about whatsapp

pm disable com.whatsapp  disables  WhatsApp

pm disable com.google.android.youtube   disables Youtube (which is a system app, cannot be done by GUI)

pm enable com.whatsapp

pm disable radiotime.player/tunein.player.pro.FordReceiver  disable the action for BT changed in TuneIn Radio

To remove all data from disabled packages:

for p in $(pm list packages -d) ; do echo $p | busybox awk -F ':' '{print "/data/data/" $2}' | xargs rm -r ; done

To disable all Samsung Knox packages:

for p in $(pm list packages |grep nox) ; do echo $p | busybox awk -F ":" '{print $2}' | xargs pm disable ; done

To remove all Samsung Knox packages:

for p in $(pm list packages -f|grep nox) ; do echo $p | busybox awk -F "/" '{print "/"$2"/"$3"/"$4}' | xargs rm -r ; done

On newer version of Android you need to use pm disable-user <packagename> to disable an app. Also even newer versions you use block to completely disable an app.

pm list packages to find all packages installed

package:com.android.defcontainer

package:com.sec.phone

package:com.android.providers.partnerbookmarks

package:com.android.contacts

package:com.sec.android.gallery3d

package:com.android.phone

...

The administration files for packages can be found in /data/system with packages.list and packages.xml

cat packages.list|grep -i download

com.android.providers.downloads.ui 10022 0 /data/data/com.android.providers.downloads.ui default 1028,1015,1023,1024

com.android.providers.downloads 10022 0 /data/data/com.android.providers.downloads default 1028,1015,1023,1024

cat packages.xml|grep -i download

    <package name="com.android.providers.downloads.ui" codePath="/system/app/SecDownloadProviderUi.apk" nativeLibraryPath="/data/app-lib/SecDownloadProviderUi" flags="573125" ft="14e8ffd5870" it="14b96292d80" ut="14e8ffd5870" version="19" sharedUserId="10022">

    <package name="com.android.providers.downloads" codePath="/system/priv-app/SecDownloadProvider.apk" nativeLibraryPath="/data/app-lib/SecDownloadProvider" flags="1074314949" ft="14e8ffd5c58" it="14b96293168" ut="14e8ffd5c58" version="19" sharedUserId="10022">

Disabled packages administration is stored per user. This store is in the /data/system/users/<user_nr>/package-restrictions.xml file.

Install apk packages from the PC with Right Click on apk:

[HKEY_CLASSES_ROOT\apk_auto_file\shell\Install\command]

@="cmd /c \"\"C:\\windows\\adb.exe\"  install -r \"%1\"  & TimeOut 10\""

Which sould read in the registry: cmd /c ""C:\windows\adb.exe"  install -r "%1"  & TimeOut 10"

To disable a service from a package. For example the wallpaper service:

dumpsys activity | grep ServiceRecord | grep ImageWallpaper

pm disable com.android.systemui/.ImageWallpaper

pm enable com.android.systemui/.ImageWallpaper

The netd daemon

All network is controlled by the netd daemon and its command interface ndc.

ndc bandwidth

ndc clatd

ndc dualon

ndc firewall

ndc idletimer

ndc interface

ndc ipfwd

ndc ipv6fwd

ndc list_ttys

ndc nat

ndc netinfo

ndc network

ndc pan

ndc pppd

ndc pppoectl

ndc resolver

ndc route

ndc rtsol

ndc softap

ndc tether

ndc IPv6Tether

ndc throughput

An example to switch of bandwidth management: ndc bandwidth disable

iptables firewall

There is a firewall onboard. Android uses the linux iptables firewall. The ruleset can not be loaded from /etc/iptables or whatever. It is built into the kernel. But you can add your own rules or whatever by a shell script like /etc/install-recover.sh else you loose your own rules after a reboot. Btw: iptables need root

There are three tables to manage that you can address with the -t option. Default you manage the filter table. But there is filter, nat, mangle, raw and security(?).

A few command you need to know:

The default rules are created by the /system/bin/netd daemon using the ndc firewall shell command.

Use the ndc firewall enable or disable command to turn it on or off.

There are several Firewalls in the playstore that use iptables. Droidwall is the mother of them all. AFWall+ continued development as did Avast Antivirus and Security.

Like Droidwall they only cover the App data traffic on your Wifi and 3G network. AFWall+, like Droidwall, offers the possibility to add your own advanced iptables commands in a script.

Example to log and monitor outgoing connections for applications (UID):

iptables -I OUTPUT 1 -j LOG --log-prefix "[IPT OUT START] " --log-level 4 --log-uid    (Insert in chain OUTPUT as rulenum)

iptables -A OUTPUT -j LOG --log-prefix "[IPT OUT END] " --log-level 4 --log-uid         (Append to chain OUTPUT)

Then if you view the ruleset you will see this:

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 8 level 4 prefix "[IPT OUT START] "

    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 8 level 4 prefix "[IPT OUT START] "

 8648 1087K bw_OUTPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 8 level 4 prefix "[IPT OUT END] "

    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 8 level 4 prefix "[IPT OUT END] "

View logging with the command: fgrep '[IPT OUT ' /proc/kmsg  or  grep '\[IPT OUT ' /proc/kmsg  or for a oneshot dmesg | grep '\[IPT OUT '

<4>[28158.336077] c0 [IPT OUT START] IN= OUT=wlan0 SRC=10.0.0.138 DST=74.125.206.139 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=27906 DF PROTO=TCP SPT=35042 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 UID=10021 GID=10021

<4>[28158.336380] c0 [IPT OUT START] IN= OUT=wlan0 SRC=10.0.0.138 DST=74.125.206.139 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=27906 DF PROTO=TCP SPT=35042 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 UID=10021 GID=10021

You find the applications UID with the quickest with the command: cat /data/system/packages.list|grep 10021

To remove the rules again to stop logging, list the rules with iptables -S and then

iptables -D OUTPUT -j LOG --log-prefix "[IPT OUT START] " --log-uid

iptables -D OUTPUT -j LOG --log-prefix "[IPT OUT END] " --log-uid

or simply reboot your device.

To block a Domain: iptables -A OUTPUT -p tcp -m string --string "a_domain.com" --algo kmp -j REJECT --reject-with icmp-host-unreachable

Use iptables -s nat <any command> to manage the nat table. For listing the rules it becomes iptables -t nat -S

For oem there is the /system/bin/oem-iptables-init.sh file. 

Battery level in task bar

For Android lower than 4.4 in adb shell 

content insert --uri content://settings/system --bind name:s:display_battery_level --bind value:i:1

content insert --uri content://settings/system --bind name:s:display_battery_percentage --bind value:i:1

For Android 4.4+:

content insert --uri content://settings/system --bind name:s:status_bar_show_battery_percent --bind value:i:1 #inside battery icon

content insert --uri content://settings/system --bind name:s:status_bar_show_battery_percent --bind value:i:2 #outside battery icon

settings put system status_bar_show_battery_percent 1

stop

reboot

Selecting another Radio Band on your Phone

Modern phones can work in all countries arround the world. So Phones support a lot of Radio frequencies (Bands) and protocols.

Most Phones will figure it out themselves. Sometimes you want to fix your Phone to a proper frequency.

 

GSM      800/850/900/1700/1900/2100MHz

WCDMA 800/850/900/1700/1900/2100MHz

You need adb.exe again. Start a cmd shell in Windows and connect with adb using:

...or on most Samsungs you can Dial *#2263# or on other phones *#*#4636#*#* Select "Phone Information" then "Select Radio Band"

 

Select the proper Band for your country, or Automatic.

You can check (on Samsung at least) your current Radio connection when dialing *#0011#

CSC on Samsung devices

Samsung adds or removes features with CSC function. This consists of various parts:

/system/CSCVersion.txt  (the complete csc zip file)

/system/SW_Configuration.xml

/system/csc (folder with CSCVerstion.txt content)

...

PEH

common

contents.db

customer.xml

language.xml

others.xml

sales_code.dat

In customer.xml and others.xml you can add many options.

GPS with supl

Although there is a /etc/gps.conf file my Samsung device don't do AGPS with any of the options there. It is restricted to certain customers by CSC. To get AGPS you can do the following.

Edit the /system/csc/customer.xml file with Notepad++ (-rw-r--r-- root     root        17337 2016-01-26 23:40 customer.xml):

<CustomerData>

  <GeneralInfo>

       ...

  </GeneralInfo>

  <Settings>

    <GPS>

      <!-- GPSActivation>gpsActivation</GPSActivation -->

      <AGPS>

        <ServAddr>supl.nokia.com</ServAddr>

        <Port>7275</Port>

        <SuplVer>2</SuplVer>

        <TLS>1</TLS>

      </AGPS>

    </GPS>

    <Main>

Save it and copy it back to the /system/csc folder. Make sure the permission are correct (like above). Reboot your device.

After reboot check if the settings are applied with: logcat -d|grep -i csc

You should see:

D/CscGPS  (  736): CSCGPS.updateParameters

D/CscGPS  (  736): supl host : supl.nokia.com

D/CscGPS  (  736): supl_ver : 1

D/CscGPS  (  736): supl port : 7275

D/CscGPS  (  736): CSCGPS.GPSUpdate

High quality audio over Bluetooth (bluez stack)

For devices using the (older) Bluez bleutooth stack you can pump up the bluetooth audio quality. You need to change 2 files in the /etc/bluetooth folder.

main.conf

[General]

#DisablePlugins = network,input

Name = %m

Class = 0x40020C

DiscoverableTimeout = 120

PairableTimeout = 180

PageTimeout = 8192

DiscoverSchedulerInterval = 3600

InitiallyPowered = true

RememberPowered = false

DeviceID = 0075:100:100  (keep your device id here)

ReverseServiceDiscovery = true

NameResolving = true

DebugKeys = false

EnableLE = true

AttributeServer = false

DefaultLinkPolicy = 15

audio.conf

[General]

Enable=Sink,Control

#Disable=Headset,Gateway,Source

Master=false

SCORouting=HCI

AutoConnect=true

[Headset]

HFP=true

MaxConnections=2

MaxConnected=2

FastConnectable=true

[A2DP]

APTXSources=1

MPEG12Sources=1

SBCSources=1

SBCQuality=HIGH

APTXSinks=1

SBCSinks=1

MPEG12Sinks=1

#DelayReporting=

[AVRCP]

InputDeviceName=AVRCP

MetaDataEnable=true

[WBspeech]

WBSEnable = true

I2sEnable = 0x01

IsMaster = 0x00

ClockRate = 0x02

PcmInterfaceRate = 0x00

For MediaTek (blueangel stack) there is a configuration embedded in the /system/lib/libbtcusttable.so file. 

Android Bluedroid has a config file in /data/misc/bluedroid/bt_config.xml

Increase Google Maps Offline refresh time

You need a rooted device and a SQLite editor. With SQLite goto the Maps app and select the gmm_offline-<nubmer>.db database. Select the offlineRegions table. You will see the World (Global Data) and your own offline regions records. Long click the expirationTimeMs field and select Edit Field.

Change the value from 1450382334427 to 9450382334427 milliseconds for all records. Exit SQLite editor.

If you now start Maps and goto offline regions you will see an expiration date of 92620 days instead of 30 days. If you download new regions this will be reset!

Add neko tile

 cmd statusbar add-tile com.android.egg/.neko.NekoTile


....