├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── greetings.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── META-INF └── com │ └── google │ └── android │ ├── update-binary │ └── updater-script ├── README.md ├── SECURITY.md ├── common ├── addon │ └── Volume-Key-Selector │ │ ├── install.sh │ │ └── tools │ │ ├── arm │ │ └── keycheck │ │ └── x86 │ │ └── keycheck ├── functions.sh ├── install.sh ├── overlay10 │ ├── AndroidManifest.xml │ └── res │ │ └── xml │ │ └── config_webview_packages.xml ├── overlay9 │ ├── AndroidManifest.xml │ └── res │ │ └── xml │ │ └── config_webview_packages.xml └── tools │ └── tools.zip ├── config.txt ├── customize.sh ├── module.prop ├── post-fs-data.sh ├── service.sh ├── status.txt ├── system └── placeholder └── uninstall.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Declare files that will always have LF line endings on checkout. 2 | *.sh text eol=lf 3 | *.prop text eol=lf 4 | *.md text eol=lf 5 | *.xml text eol=lf 6 | META-INF/** text eol=lf 7 | 8 | # Denote all files that are truly binary and should not be modified. 9 | common/addon/**/tools/** binary 10 | common/tools/** binary -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: androidacy # Replace with a single Patreon username 4 | 5 | custom: https://www.androidacy.com/donate/ # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug, needs-triage 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS and Android version: [e.g. OxygenOS 11.0.1, android 11] 28 | - Device [e.g. OnePlus 8 Pro Plus Max Gold Edition] 29 | - Version [e.g. 22] 30 | 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement, needs-triage 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/first-interaction@v1 10 | with: 11 | repo-token: ${{ secrets.GITHUB_TOKEN }} 12 | issue-message: 'Thanks for your contribution! Please keep in mind we will get to this issue when we have a chance. Logs and device information are mandatory if you do not want your issue closed without response.' 13 | pr-message: 'Thanks for your contribution! All pull requests must be meaningful and follow general good coding practices. Also keep in mind we do not merge many pull requests!' 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __MACOSX 2 | .DS_Store 3 | /*.zip 4 | 5 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # Changelog 3 | 4 | ### 9.1 5 | 6 | - Remove recovery install completely. It's been broken for awhile now anyway. 7 | - Properly respect FORCE_CONFIG 8 | - API updates 9 | 10 | ### 9.0 11 | 12 | - Add volume key selection for options 13 | - Improve security 14 | - Switch to new backend 15 | - Misc fixes 16 | 17 | ### 8.1.4 18 | 19 | - Fix debloats 20 | - Implement browser signature verification 21 | 22 | ### 8.1.3 23 | 24 | - Address situation where, especially on android 10+, internal storage isn't accessible 25 | - Bugfixes and performance improvements 26 | - Code formatting 27 | 28 | ### 8.1.0 29 | 30 | - Address download error 31 | - Cleanup sepolicy; implement proper install solution 32 | - Properly support MIUI and Android 11 33 | - Move away from github and move some download logic server side. 34 | - Fix vanilla chromium download 35 | 36 | ### 8.0.2 37 | 38 | - Fix files not getting downloaded to the right location for some users 39 | - Fix ungoogled chromium extensions download 40 | 41 | ### 8.0.1 42 | 43 | - Huge refactor 44 | - Support android 11 45 | - Change default back to only installing bromite webview. 46 | - Make sure to edit config.txt appropriately, and place in /sdcard/WebviewManager 47 | - Code optimization 48 | - Add support for extensions version of ungoogled-chromium 49 | - Seperate browser and webview choice 50 | - Remove most checks in offline mode 51 | - Add better error handling 52 | - Fix some events don't properly trigger an install abort 53 | 54 | ### 7.3.0 55 | 56 | - Misc code refactoring 57 | 58 | ### 7.1.1 59 | 60 | - Fix several critical bugs in the 7.x release 61 | 62 | - Try to fix offline install 63 | 64 | - Misc refactoring 65 | 66 | ### 7.0.1 67 | 68 | - Rebrand the module to reflect new abilities 69 | 70 | - Add support for bundling browser 71 | 72 | - Add ungoogled chromium and vanilla chromium 73 | 74 | - Massive code refactoring 75 | 76 | - Switch to Magisk's internal BusyBox 77 | 78 | - Use aria2 for faster downloads 79 | 80 | - Fix broken version check 81 | 82 | - Add verification for WebView apk 83 | 84 | - Other optimizations 85 | 86 | ### 6.1.0 87 | 88 | - Support recovery and system installs - system installs are experimental and I will NOT provide support for them 89 | 90 | - Update used tools 91 | 92 | - Hopefully fix "no connection" issues for some users 93 | 94 | ### 6.0.0 95 | 96 | - Rework overlay to prevent some boot loop 97 | 98 | - Separate overlays for Android 10 and < 10 99 | 100 | - Fix overlay flag on Android < 9 101 | 102 | - Verify downloads for security 103 | 104 | - Prepare for bromite upstream changes 105 | 106 | - Extract libraries from all, meaning even if install fails no crashing should occur 107 | 108 | ### 5.0.1 109 | 110 | - Switch to MMT-ex template 111 | 112 | - Major code refactoring 113 | 114 | - Better support Android 10 115 | 116 | - Update bundled overlay 117 | 118 | - Add backup for overlays.xml just in case 119 | 120 | - Misc bugfixes & improvements 121 | 122 | ### 4.4.3 123 | 124 | - Hopefully last release 4.x series 125 | 126 | - Misc bugfixes 127 | 128 | - Fixes for API < 28 129 | 130 | - Boot script updates 131 | 132 | - Reworked logging (thanks @JohnFawkes) 133 | 134 | - Updated sepolicy 135 | 136 | ### 4.4.1 137 | 138 | - Introduce better logging 139 | 140 | - Start using sepolicy.rule instead of going permissive 141 | 142 | - Move sepolicy dependent commands to boot scripts 143 | 144 | - Fix said boot scripts - for real this time 145 | 146 | - Full android 10 support 147 | 148 | - Prevent overlay install on custom ROMs 149 | 150 | - This will be the last release using Unity. 5.0 will use MMT-ex, meaning ONLY magisk will be supported 151 | 152 | ### 4.3.0 153 | 154 | - Misc fixes 155 | 156 | ### 4.2.2 157 | 158 | - Fixed overlay not copying to the right place 159 | 160 | - Update unity 161 | 162 | - Remove some debugging code 163 | 164 | ### 4.2.0 165 | 166 | - Fixes for overlay on custom ROMs 167 | 168 | - Uninstall script fixes 169 | 170 | - Code cleaned up and refactored 171 | 172 | - Update to latest unity 173 | 174 | - Support offline installs 175 | 176 | - Whenever upstream bromite adds support Android 10 will work 177 | 178 | - Support new module format 179 | 180 | - Misc. bugfixes 181 | 182 | ### 4.1.0 183 | 184 | - Fixes for app installation on boot 185 | 186 | - More dynamic in boot script should no longer mess with manual app updates 187 | 188 | ### 4.0.0 189 | 190 | - Fixed compatibility with stock ROMs 191 | 192 | - Migration to unity template 193 | 194 | - Updated boot scripts 195 | 196 | ### 3.7.3 197 | 198 | - Always download latest Bromite WebView apk 199 | 200 | ### 3.7.2 201 | 202 | - Download APK from official sources 203 | 204 | - Update replace logic 205 | 206 | - Update install logic 207 | 208 | ### 3.6.2 209 | 210 | - Updated bromite to 75.0.3770.132 211 | 212 | - Fixed boot script (I say that a lot...) 213 | 214 | ### 3.6.1 215 | 216 | - Improve install logic 217 | 218 | - Improve replace logic 219 | 220 | - Fix boot script (hopefully) 221 | 222 | - First steps towards Pixel/stock compatibility 223 | 224 | - Re-add 64 bit curl binary 225 | 226 | ### 3.5.1 227 | 228 | - Hotfix for multiple modules. All because of a comment in the code BTW 229 | 230 | - Hotfix for Chrome removal, wasn't received well 231 | 232 | ### 3.5 233 | 234 | - Attempt to fix support on Pixels and Pixel ROMs 235 | 236 | - `reverted` 237 | 238 | - Script cleanup 239 | 240 | ### 3.4 241 | 242 | - `reverted` 243 | 244 | ### 3.3 245 | 246 | - Further fix webview recognition on reboot 247 | 248 | ### 3.2 249 | 250 | - Add uninstall script to fixed issues with no webview on uninstall 251 | 252 | ### v3.1 253 | 254 | - Bugfixes, probably added more bugs 255 | 256 | ### v3.0 257 | 258 | - Now fetches needed files from internet to reduce filesize 259 | 260 | - Fix installer script 261 | 262 | - Fix boot script 263 | 264 | ### v2.1.1 265 | 266 | - Fix boot script 267 | 268 | ### v2.0 269 | 270 | - Unbreak the module 271 | 272 | ### v1.5 273 | 274 | - Fix script 275 | 276 | ### v1.4 277 | 278 | - Add support for more CPU arch besides arm64 279 | 280 | - Update bromite to v75 281 | 282 | ### v1.3 283 | 284 | - Misc bugfixes 285 | 286 | ### v1.2 287 | 288 | - Updated libs 289 | 290 | ### v1.1 291 | 292 | - Fix WebView crash 293 | 294 | ### v1.0 295 | 296 | - Initial release 297 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2021 Androidacy. All rights reserved unless otherwise specified. 2 | 3 | This work is licensed under the Androidacy Open Source License, hereafter referred to as the "AOSL". 4 | 5 | Androidacy believes strongly in the power of both free and open source software, and as such, our software is offered that way. We hereby grant you the license to look at, reuse, and share our works, with some limitations and requirements. 6 | 7 | The AOSL grants you a irrevocable license to: 8 | - Obtain the publicly available source code of our Application 9 | - Modify the source as you see fit for personal use 10 | - Suggest changes to Androidacy, who is under no obligation to make them 11 | 12 | The AOSL, however, does NOT give you the license to: 13 | - Resell our works, modified or unmodified, for a profit 14 | - Rebrand our work as your own 15 | - Republish our unmodified Software on any unofficial sources or mirror it 16 | - Request private source code. 17 | - Use this Software to harm or otherwise damage Androidacy or any of our clients 18 | 19 | Androidacy will make a best effort to include the source code of any compenents of the Software; however, we are under no obligation to, and will only publish code as we see fit. We also reserve the right to monetize our work as we see fit. 20 | 21 | In addition, if you use an open source compenent by Androidacy in your project, you are hereby obligated to share the source code and any modifications you make to it. You must also credit Androidacy for any code you reuse. 22 | 23 | THIS SOFTWARE IS OFFERED "AS-IS", WITH NO WARRANTIES EXPRESSED OR IMPLIED. IT IS OFFERED IN THE HOPE THAT IS FOUND USEFUL, BUT ANDROIDACY MAKES NO WARRANTIES OF MERCHANTABILITY FOR ANY PURPOSE WHATSOEVER. 24 | 25 | 26 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | # Its broken okay?!?! 8 | # shellcheck disable=SC2155 9 | # shellcheck disable=SC2034 10 | # shellcheck disable=SC1090 11 | # shellcheck disable=SC2086 12 | # shellcheck disable=SC2169 13 | # shellcheck disable=SC2046 14 | # shellcheck disable=SC2044 15 | # shellcheck disable=SC2166 16 | # shellcheck disable=SC2039 17 | 18 | umask 022 19 | 20 | # Global vars 21 | TMPDIR=/dev/tmp 22 | PERSISTDIR=/sbin/.magisk/mirror/persist 23 | 24 | [ -z $TMPDIR ] && TMPDIR=/dev/tmp; 25 | 26 | rm -rf $TMPDIR; 27 | mkdir -p $TMPDIR; 28 | cd $TMPDIR; 29 | 30 | # echo before loading util_functions 31 | ui_print() { echo "$1"; } 32 | 33 | require_new_magisk() { 34 | ui_print "*******************************" 35 | ui_print " Please install Magisk v19.0+! " 36 | ui_print "*******************************" 37 | exit 1 38 | } 39 | 40 | is_legacy_script() { 41 | unzip -l "$ZIPFILE" install.sh | grep -q install.sh 42 | return $? 43 | } 44 | 45 | print_modname() { 46 | local len 47 | len=$(echo -n $MODNAME | wc -c) 48 | len=$((len + 2)) 49 | local pounds=$(printf "%${len}s" | tr ' ' '*') 50 | ui_print "$pounds" 51 | ui_print " $MODNAME " 52 | ui_print "$pounds" 53 | ui_print "*******************" 54 | ui_print " Powered by Magisk " 55 | ui_print "*******************" 56 | } 57 | 58 | ############## 59 | # Environment 60 | ############## 61 | 62 | OUTFD=$2 63 | ZIPFILE=$3 64 | 65 | mount /data 2>/dev/null 66 | 67 | # Load utility functions 68 | [ -f /data/adb/magisk/util_functions.sh ] || MODPATH="/" 69 | . /data/adb/magisk/util_functions.sh 70 | [ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk 71 | 72 | # Preperation for flashable zips 73 | setup_flashable 74 | 75 | # Mount partitions 76 | mount_partitions 77 | 78 | # Detect version and architecture 79 | api_level_arch_detect 80 | 81 | recovery_actions() { 82 | # Make sure random won't get blocked 83 | mount -o bind /dev/urandom /dev/random 84 | # Unset library paths 85 | OLD_LD_LIB=$LD_LIBRARY_PATH 86 | OLD_LD_PRE=$LD_PRELOAD 87 | OLD_LD_CFG=$LD_CONFIG_FILE 88 | unset LD_LIBRARY_PATH 89 | unset LD_PRELOAD 90 | unset LD_CONFIG_FILE 91 | mount_apex 92 | } 93 | 94 | recovery_cleanup() { 95 | local DIR 96 | ui_print "- Unmounting partitions" 97 | (umount_apex 98 | if [ ! -d /postinstall/tmp ]; then 99 | umount -l /system 100 | umount -l /system_root 101 | fi 102 | umount -l /vendor 103 | umount -l /persist 104 | for DIR in /apex /system /system_root; do 105 | if [ -L "${DIR}_link" ]; then 106 | rmdir $DIR 107 | mv -f ${DIR}_link $DIR 108 | fi 109 | done 110 | umount -l /dev/random) 2>/dev/null 111 | [ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB 112 | [ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE 113 | [ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG 114 | } 115 | 116 | # Setup busybox and binaries 117 | $BOOTMODE && boot_actions || recovery_actions 118 | 119 | ############## 120 | # Preparation 121 | ############## 122 | 123 | # Extract prop file 124 | unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2 125 | [ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!" 126 | 127 | $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules 128 | MODULEROOT=$NVBASE/$MODDIRNAME 129 | MODID=$(grep_prop id $TMPDIR/module.prop) 130 | if test -n $MODPATH 131 | then 132 | MODPATH=$MODULEROOT/$MODID 133 | fi 134 | MODNAME=$(grep_prop name $TMPDIR/module.prop) 135 | 136 | # Create mod paths 137 | rm -rf $MODPATH 2>/dev/null 138 | mkdir -p $MODPATH 139 | 140 | ########## 141 | # Install 142 | ########## 143 | 144 | if is_legacy_script; then 145 | unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 146 | 147 | # Load install script 148 | . $TMPDIR/install.sh 149 | 150 | # Callbacks 151 | print_modname 152 | on_install 153 | 154 | # Custom uninstaller 155 | [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh 156 | 157 | # Skip mount 158 | $SKIPMOUNT && touch $MODPATH/skip_mount 159 | 160 | # prop file 161 | $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop 162 | 163 | # Module info 164 | cp -af $TMPDIR/module.prop $MODPATH/module.prop 165 | 166 | # post-fs-data scripts 167 | $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh 168 | 169 | # service scripts 170 | $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh 171 | 172 | ui_print "- Setting permissions" 173 | set_permissions 174 | else 175 | print_modname 176 | 177 | unzip -o "$ZIPFILE" customize.sh -d $MODPATH >&2 178 | 179 | if ! grep -q '^SKIPUNZIP=1$' $MODPATH/customize.sh 2>/dev/null; then 180 | ui_print "- Extracting module files" 181 | unzip -o "$ZIPFILE" -x 'META-INF/*' -d $MODPATH >&2 182 | 183 | # Default permissions 184 | set_perm_recursive $MODPATH 0 0 0755 0644 185 | fi 186 | 187 | # Load customization script 188 | [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh 189 | fi 190 | 191 | # Handle replace folders 192 | for TARGET in $REPLACE; do 193 | ui_print "- Replace target: $TARGET" 194 | mktouch $MODPATH$TARGET/.replace 195 | done 196 | 197 | if $BOOTMODE; then 198 | # Update info for Magisk Manager 199 | mktouch $NVBASE/modules/$MODID/update 200 | cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop 201 | fi 202 | 203 | # Copy over custom sepolicy rules 204 | if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then 205 | ui_print "- Installing custom sepolicy patch" 206 | PERSISTMOD=$PERSISTDIR/magisk/$MODID 207 | mkdir -p $PERSISTMOD 208 | cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule 209 | fi 210 | 211 | # Remove stuffs that don't belong to modules 212 | rm -rf \ 213 | $MODPATH/system/placeholder $MODPATH/customize.sh \ 214 | $MODPATH/README.md $MODPATH/.git* 2>/dev/null 215 | 216 | ############## 217 | # Finalizing 218 | ############## 219 | 220 | cd / 221 | $BOOTMODE || recovery_cleanup 222 | rm -rf $TMPDIR 223 | 224 | ui_print "- Done" 225 | exit 0 226 | -------------------------------------------------------------------------------- /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # REPOSITORIES ARCHIVED AND MOVED TO https://github.com/Androidacy 2 | 3 | Webview Switcher - An Androidacy Project 4 | 5 | ![Logo](https://www.androidacy.com/wp-content/uploads/rsz_cropped-adobe_post_20210202_00133408277657334196729-1024x576-1.png) 6 | 7 |
8 | 9 | ## Links 10 | 11 | - [Website](https://www.androidacy.com/?utm_source=WebviewManager) 12 | - [Blog and updates](https://www.androidacy.com/blog/?utm_source=WebviewManager) 13 | * [Upstream repository](https://github.com/androidacy/WebviewSwitcher). All development is done here until stable release. 14 | 15 | ### Be sure to check out our new module, Font Manager! 16 | 17 | - Downloads are [here](https://dl.androidacy.com/?eeFolder=Magisk-Modules&eeListID=1&utm_source=WebviewManager) 18 | - The source is [here](https://github.com/androidacy/FontManager) 19 | - XDA thread is [here](https://forum.xda-developers.com/t/magisk-module-fontrevival-for-emojis-and-fonts.4194631/) 20 | 21 | ## What is this? 22 | 23 | With this module, you can install several different default browsers and webviews. Take a peak in [config.txt](https://github.com/androidacy/WebviewSwitcher/blob/master/config.txt) for more information! 24 | 25 | Different webviews and browser have additional advantages to the default ones: they are often more up to date, secure, privacy friendly, and better performing! 26 | 27 | The module will always download the latest version of the webview and/or browser, to update it just reflash the module! 28 | 29 | The latest update should now work on all ROMs Android v7.0+. ROMs versions 5.x to 6.x are not explicitly supported. Overly customized OEM ROMs such as MIUI have limited support. 30 | 31 | ## What is a WebView? 32 | 33 | Webview is a shared component between apps to display web content instead of directing to a browser. It's like a minimal browser, but for non-browsers that display web content in any other way than sending you to a browser or custom tab, apps that use it include email, wewbview wrapper apps, or even some banking apps. Even the Google app uses a webview. 34 | 35 | **PLEASE NOTE SOME APPS WON'T WORK WITHOUT GOOGLE'S OWN WEBVIEW**. We can't fix that and any issues on it will be closed and ignored. Complain to the app developer, not us. We're not even sure why this happens or if/how they check. 36 | 37 | ## Credits 38 | 39 | Bromite itself is created by and copyright of the developers of the [Bromite project](https://github.com/bromite/bromite). The upstream official repository can be found [here](https://github.com/bromite/bromitewebview). The source code is [here](https://github.com/bromite/bromite) 40 | 41 | Ungoogled-chromium Android is created by and copyright [The Ungoogled Chromium Authors](https://ungoogled-software.github.io/). Source code for Android builds can be found [here](https://git.droidware.info/wchen342/ungoogled-chromium-android) 42 | 43 | Chromium is created by and copyright [The Chromium Project](http://www.chromium.org/). Source code used in the Chromium implemrntation is [here](https://github.com/bromite/chromium) 44 | 45 | All binaries utilized and the original MMT-Extended template are developed by and copyright Zackptg5 excluding BusyBox and the original installer template which is built by and copyright John Wu. The upstream binaries are copyright and developed by the original authors. 46 | 47 | Module created by Androidacy with help early on from Skittles9823 and Zackptg5. The module is licensed under the AOSL (see LICENSE). 48 | 49 | The logging code used was orginally developed by and copyright John Fawkes, and modified later by Androidacy 50 | 51 | ## ETAs/ Versions 52 | 53 | This module downloads the latest browser and/or webview APK every time it is flashed. We will otherwise update as we see fit. 54 | At any time the latest alpha if available can be downloaded by zipping the master branch of the upstream repository, although you should wait for us to do a release on [the filehost](https://dl.androidacy.com/?utm_source=WebviewManager), click on magisk modules then bromitewebview 55 | 56 | In addition, there may be third party ways to update any apps that can be installed with the module. We do not endorse nor did we create these ways! 57 | 58 | ## Changelog 59 | 60 | - Check out what's new [here](https://github.com/Magisk-Modules-Repo/bromitewebview/blob/master/CHANGELOG.md) 61 | 62 | ## Donations 63 | 64 | Donations: [here](https://www.androidacy.com/donate/?utm_source=WebviewManager) 65 | 66 | We recommend you check out the websites of the developers of the included apps for donation links. 67 | 68 | ## Support 69 | 70 | Any issues with any bundled app should be reported to the respective developer, not us. 71 | 72 | Issues with the module should be filed [here](https://github.com/Magisk-Modules-Repo/bromitewebview/issues/). 73 | 74 | The XDA thread is [here](https://forum.xda-developers.com/android/software/bromite-magisk-module-t3936964) 75 | 76 | The telegram channel is [here](https://t.me/androidacy_announce) 77 | 78 | Here is our [Discord](https://discord.gg/gTnDxQ6) [very inactive] 79 | 80 | 81 | ## Compatibility 82 | 83 | - Android 5.x to 11.0 (7.x+ recommended). 84 | - Some heavily customized stock ROMs may have issues. This is especially true on android 11! 85 | - MIUI is not officially supported for the aforementioned reason. Some people have had success with debloating the stock bloatware. 86 | - Magisk v20.1+ required 87 | - **Recommended to flash through magisk manager** 88 | - TWRP installs are not supported! 89 | - SELinux enforcing/permissive 90 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Only the current stable and beta is supported. Always report against the latest beta! 6 | 7 | | Version | Supported | 8 | | ------- | ------------------ | 9 | | < 8.x | :negative_squared_cross_mark: | 10 | | 8.x | :warning: | 11 | | Beta | :white_check_mark: | 12 | 13 | ## Reporting a Vulnerability 14 | 15 | If you ever do find a vulnerability, please open an issue and imclude every possible detail or it _will not_ be considered. We do not forsee any major security issues, but feel free to report wht you find! 16 | 17 | Please only report against latest beta, as stable may not have the latest fixes. 18 | 19 | **DO NOT** report issues with upstream projects here, instead report to the upstream! 20 | -------------------------------------------------------------------------------- /common/addon/Volume-Key-Selector/install.sh: -------------------------------------------------------------------------------- 1 | # External Tools 2 | chmod -R 0755 $MODPATH/common/addon/Volume-Key-Selector/tools 3 | 4 | chooseport_legacy() { 5 | # Keycheck binary by someone755 @Github, idea for code below by Zappo @xda-developers 6 | # Calling it first time detects previous input. Calling it second time will do what we want 7 | [ "$1" ] && local delay=$1 || local delay=3 8 | local error=false 9 | while true; do 10 | timeout 0 $MODPATH/common/addon/Volume-Key-Selector/tools/$ARCH32/keycheck 11 | timeout $delay $MODPATH/common/addon/Volume-Key-Selector/tools/$ARCH32/keycheck 12 | local sel=$? 13 | if [ $sel -eq 42 ]; then 14 | return 0 15 | elif [ $sel -eq 41 ]; then 16 | return 1 17 | elif $error; then 18 | abort "Volume key not detected!" 19 | else 20 | error=true 21 | echo "Volume key not detected. Try again" 22 | fi 23 | done 24 | } 25 | 26 | chooseport() { 27 | # Original idea by chainfire and ianmacd @xda-developers 28 | [ "$1" ] && local delay=$1 || local delay=3 29 | local error=false 30 | while true; do 31 | local count=0 32 | while true; do 33 | timeout $delay /system/bin/getevent -lqc 1 2>&1 > $TMPDIR/events & 34 | sleep 0.25; count=$((count + 1)) 35 | if (`grep -q 'KEY_VOLUMEUP *DOWN' $TMPDIR/events`); then 36 | return 0 37 | elif (`grep -q 'KEY_VOLUMEDOWN *DOWN' $TMPDIR/events`); then 38 | return 1 39 | fi 40 | [ $count -gt 6 ] && break 41 | done 42 | if $error; then 43 | # abort "Volume key not detected!" 44 | echo "Volume key not detected. Trying legacy method" 45 | export chooseport=chooseport_legacy VKSEL=chooseport_legacy 46 | chooseport_legacy $delay 47 | return $? 48 | else 49 | error=true 50 | echo "Volume key not detected. Try again" 51 | fi 52 | done 53 | } 54 | 55 | # Keep old variable from previous versions of this 56 | VKSEL=chooseport 57 | -------------------------------------------------------------------------------- /common/addon/Volume-Key-Selector/tools/arm/keycheck: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/androidacy-user/WebviewSwitcher/135f462813a390af3bfedf9e89d2e42ea5a9ba34/common/addon/Volume-Key-Selector/tools/arm/keycheck -------------------------------------------------------------------------------- /common/addon/Volume-Key-Selector/tools/x86/keycheck: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/androidacy-user/WebviewSwitcher/135f462813a390af3bfedf9e89d2e42ea5a9ba34/common/addon/Volume-Key-Selector/tools/x86/keycheck -------------------------------------------------------------------------------- /common/functions.sh: -------------------------------------------------------------------------------- 1 | # shellcheck shell=ash 2 | # shellcheck disable=SC2061,SC3010,SC2166,SC2044,SC2046,SC2086,SC1090,SC2034,SC2155,SC1091 3 | #Extract files 4 | echo " __ __ _ _ " 5 | echo " \ \ / /___ | |__ __ __(_) ___ __ __" 6 | echo " \ \ /\ / // _ \| '_ \\ \ / /| | / _ \\ \ /\ / /" 7 | echo " \ V V /| __/| |_) |\ V / | || __/ \ V V / " 8 | echo " \_/\_/ \___||_.__/ \_/ |_| \___| \_/\_/ " 9 | echo " __ __ " 10 | echo " | \/ | __ _ _ __ __ _ __ _ ___ _ __ " 11 | echo " | |\/| | / _\` || '_ \ / _\` | / _\` | / _ \| '__|" 12 | echo " | | | || (_| || | | || (_| || (_| || __/| | " 13 | echo " |_| |_| \__,_||_| |_| \__,_| \__, | \___||_| " 14 | echo " |___/ " 15 | unzip -o "$ZIPFILE" -x 'META-INF/*' 'common/functions.sh' -d $MODPATH >&2 16 | [ -f "$MODPATH/common/addon.tar.xz" ] && tar -xf $MODPATH/common/addon.tar.xz -C $MODPATH/common 2>/dev/null 17 | it_failed() { 18 | ui_print " " 19 | ui_print "⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠" 20 | ui_print " " 21 | ui_print " Uh-oh, the installer encountered an issue!" 22 | ui_print " It's probably one of these reasons:" 23 | ui_print " 1) Installer is corrupt" 24 | ui_print " 2) You didn't follow instructions" 25 | ui_print " 3) You have an unstable internet connection" 26 | ui_print " 4) Your ROM is broken" 27 | ui_print " 5) There's a *tiny* chance we screwed up" 28 | ui_print " Please fix any issues and retry." 29 | ui_print " If you feel this is a bug or need assistance, head to our telegram" 30 | ui_print " All files besides logs are assumed to be corrupt, and have been removed." 31 | rm -fr "$EXT_DATA"/apks "$EXT_DATA"/version.txt 32 | ui_print " " 33 | ui_print "⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠" 34 | ui_print " " 35 | $INTERNET && curl -s -d "$P&i=2" "$U"/ping >/dev/null 36 | exit 1 37 | } 38 | set_tls() { 39 | mkdir "$TMPDIR"/path 40 | unzip "$MODPATH"/common/tools/tools.zip -d "$TMPDIR"/path >/dev/null 41 | } 42 | set_tls 43 | alias aapt='$TMPDIR/path/$ARCH/aapt' 44 | alias sign='$TMPDIR/path/zipsigner' 45 | chmod 755 "$TMPDIR/path/$ARCH/aapt" 46 | chmod 755 "$TMPDIR/path/zipsigner" 47 | dl() { 48 | if ! wget -qc "${U}/${3}?${P}${1}" -O "$2"; then 49 | ui_print "⚠ Download failed! Bailing out!" 50 | it_failed 51 | fi 52 | } 53 | get_v() { 54 | dl "&s=$DIR" '-' version 55 | } 56 | abort() { 57 | ui_print "$1" 58 | rm -fr $MODPATH 2>/dev/null 59 | $BOOTMODE || recovery_cleanup 60 | rm -fr $TMPDIR 2>/dev/null 61 | it_failed 62 | } 63 | detect_ext_data() { 64 | if touch /sdcard/.rw && rm /sdcard/.rw; then 65 | export EXT_DATA="/sdcard/WebviewManager" 66 | elif touch /storage/emulated/0/.rw && rm /storage/emulated/0/.rw; then 67 | export EXT_DATA="/storage/emulated/0/WebviewManager" 68 | elif touch /data/media/0/.rw && rm /data/media/0/.rw; then 69 | export EXT_DATA="/data/media/0/WebviewManager" 70 | else 71 | EXT_DATA='/storage/emulated/0/WebviewManager' 72 | ui_print "⚠ Possible internal storage access issues! Please make sure data is mounted and decrypted." 73 | ui_print "⚠ Trying to proceed anyway..." 74 | fi 75 | if test ! -d "$EXT_DATA"; then 76 | mkdir "$EXT_DATA" 77 | fi 78 | if ! mktouch "$EXT_DATA"/.rw && rm -fr "$EXT_DATA"/.rw; then 79 | if ! rm -fr "$EXT_DATA" && mktouch "$EXT_DATA"/.rw && rm -fr "$EXT_DATA"/.rw; then 80 | ui_print "⚠ Cannot access internal storage!" 81 | it_failed 82 | fi 83 | fi 84 | } 85 | detect_ext_data 86 | mkdir "$MODPATH"/logs/ 87 | mkdir -p "$EXT_DATA"/apks/ 88 | mkdir -p "$EXT_DATA"/logs/ 89 | chmod 750 -R "$EXT_DATA" 90 | A=$(resetprop ro.system.build.version.release | sed 's#\ #%20#g' || resetprop ro.build.version.release | sed 's#\ #%20#g') && D=$(resetprop ro.product.model | sed 's#\ #%20#g' || resetprop ro.product.device | sed 's#\ #%20#g' | sed 's#\ #%20#g' || resetprop ro.product.vendor.device | sed 's#\ #%20#g' | sed 's#\ #%20#g' || resetprop ro.product.system.model | sed 's#\ #%20#g' | sed 's#\ #%20#g' || resetprop ro.product.vendor.model | sed 's#\ #%20#g' | sed 's#\ #%20#g' || resetprop ro.product.name | sed 's#\ #%20#g') && L=$(resetprop persist.sys.locale | sed 's#\ #%20#g' || resetprop ro.product.locale | sed 's#\ #%20#g') && M="wvm" && P="m=$M&av=$A&a=$ARCH&d=$D&ss=%20&l=$L" && U="https://api.androidacy.com" 91 | test_connection() { 92 | (wget -qc "$U/ping?$P" -O /dev/null -o /dev/null) && return 0 || return 1 93 | } 94 | test_connection && INTERNET=true 95 | mount_apex() { 96 | $BOOTMODE || [ ! -d /system/apex ] && return 97 | local APEX DEST 98 | setup_mntpoint /apex 99 | for APEX in /system/apex/*; do 100 | DEST=/apex/$(basename $APEX .apex) 101 | [ "$DEST" = /apex/com.android.runtime.release ] && DEST=/apex/com.android.runtime 102 | mkdir -p $DEST 2>/dev/null 103 | if [ -f $APEX ]; then 104 | # APEX APKs, extract and loop mount 105 | unzip -qo $APEX apex_payload.img -d /apex 106 | loop_setup apex_payload.img 107 | if [ -n "$LOOPDEV" ]; then 108 | mount -t ext4 -o ro,noatime $LOOPDEV $DEST 109 | fi 110 | rm -f apex_payload.img 111 | elif [ -d $APEX ]; then 112 | # APEX folders, bind mount directory 113 | mount -o bind $APEX $DEST 114 | fi 115 | done 116 | export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime 117 | export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata 118 | local APEXRJPATH=/apex/com.android.runtime/javalib 119 | local SYSFRAME=/system/framework 120 | export BOOTCLASSPATH="$APEXRJPATH/core-oj.jar:$APEXRJPATH/core-libart.jar:$APEXRJPATH/okhttp.jar:$APEXRJPATH/bouncycastle.jar:$APEXRJPATH/apache-xml.jar:$SYSFRAME/framework.jar:$SYSFRAME/ext.jar:$SYSFRAME/telephony-common.jar:$SYSFRAME/voip-common.jar:$SYSFRAME/ims-common.jar:$SYSFRAME/android.test.base.jar:$SYSFRAME/telephony-ext.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar" 121 | } 122 | 123 | umount_apex() { 124 | [ -d /apex ] || return 125 | local DEST SRC 126 | for DEST in /apex/*; do 127 | [ "$DEST" = '/apex/*' ] && break 128 | SRC=$(grep $DEST /proc/mounts | awk '{ print $1 }') 129 | umount -l $DEST 130 | losetup -d $SRC 2>/dev/null 131 | done 132 | rm -fr /apex 133 | unset ANDROID_RUNTIME_ROOT 134 | unset ANDROID_TZDATA_ROOT 135 | unset BOOTCLASSPATH 136 | } 137 | 138 | cleanup() { 139 | rm -fr $MODPATH/common 2>/dev/null 140 | ui_print " " 141 | ui_print "**************************************" 142 | ui_print "* AMMT by Androidacy *" 143 | ui_print "* Based on the original MMT-ex *" 144 | ui_print "**************************************" 145 | ui_print " " 146 | $SELINUX && setenforce 1 147 | } 148 | 149 | device_check() { 150 | local opt=$(getopt -o dm -- "$@") type=device 151 | eval set -- "$opt" 152 | while true; do 153 | case "$1" in 154 | -d) 155 | local type=device 156 | shift 157 | ;; 158 | -m) 159 | local type=manufacturer 160 | shift 161 | ;; 162 | --) 163 | shift 164 | break 165 | ;; 166 | *) abort "Invalid device_check argument $1! Aborting!" ;; 167 | esac 168 | done 169 | local prop=$(echo "$1" | tr '[:upper:]' '[:lower:]') 170 | for i in /system /vendor /odm /product; do 171 | if [ -f $i/build.prop ]; then 172 | for j in "ro.product.$type" "ro.build.$type" "ro.product.vendor.$type" "ro.vendor.product.$type"; do 173 | [ "$(sed -n "s/^$j=//p" $i/build.prop 2>/dev/null | head -n 1 | tr '[:upper:]' '[:lower:]')" = "$prop" ] && return 0 174 | done 175 | fi 176 | done 177 | return 1 178 | } 179 | 180 | cp_ch() { 181 | local opt=$(getopt -o nr -- "$@") BAK=true UBAK=true FOL=false 182 | eval set -- "$opt" 183 | while true; do 184 | case "$1" in 185 | -n) 186 | UBAK=false 187 | shift 188 | ;; 189 | -r) 190 | FOL=true 191 | shift 192 | ;; 193 | --) 194 | shift 195 | break 196 | ;; 197 | *) abort "Invalid cp_ch argument $1! Aborting!" ;; 198 | esac 199 | done 200 | local SRC="$1" DEST="$2" OFILES="$1" 201 | $FOL && local OFILES=$(find $SRC -type f 2>/dev/null) 202 | [ -z $3 ] && PERM=0644 || PERM=$3 203 | case "$DEST" in 204 | $TMPDIR/* | $MODULEROOT/* | $NVBASE/modules/$MODID/*) BAK=false ;; 205 | esac 206 | for OFILE in ${OFILES}; do 207 | if $FOL; then 208 | if [ "$(basename $SRC)" = "$(basename $DEST)" ]; then 209 | local FILE=$(echo $OFILE | sed "s|$SRC|$DEST|") 210 | else 211 | local FILE=$(echo $OFILE | sed "s|$SRC|$DEST/$(basename $SRC)|") 212 | fi 213 | else 214 | if [[ -d "$DEST" ]]; then 215 | local FILE="$DEST/$(basename $SRC)" 216 | else 217 | local FILE="$DEST" 218 | fi 219 | fi 220 | if $BAK && $UBAK; then 221 | # shellcheck disable=SC2143 222 | [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >>$INFO 223 | [ -f "$FILE" -a ! -f "$FILE~" ] && { 224 | mv -f $FILE $FILE~ 225 | echo "$FILE~" >>$INFO 226 | } 227 | elif $BAK; then 228 | # shellcheck disable=SC2143 229 | [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >>$INFO 230 | fi 231 | install -D -m $PERM "$OFILE" "$FILE" 232 | done 233 | } 234 | 235 | install_script() { 236 | case "$1" in 237 | -l) 238 | shift 239 | local INPATH=$NVBASE/service.d 240 | ;; 241 | -p) 242 | shift 243 | local INPATH=$NVBASE/post-fs-data.d 244 | ;; 245 | *) local INPATH=$NVBASE/service.d ;; 246 | esac 247 | # shellcheck disable=SC2143 248 | [ "$(grep "#!/system/bin/sh" $1)" ] || sed -i "1i #!/system/bin/sh" $1 249 | local i 250 | for i in "MODPATH" "LIBDIR" "MODID" "INFO" "MODDIR"; do 251 | case $i in 252 | "MODPATH") sed -i "1a $i=$NVBASE/modules/$MODID" $1 ;; 253 | "MODDIR") sed -i "1a $i=\${0%/*}" $1 ;; 254 | *) sed -i "1a $i=$(eval echo \$$i)" $1 ;; 255 | esac 256 | done 257 | [ "$1" = "$MODPATH/uninstall.sh" ] && return 0 258 | case $(basename $1) in 259 | post-fs-data.sh | service.sh) ;; 260 | *) cp_ch -n $1 $INPATH/$(basename $1) 0755 ;; 261 | esac 262 | } 263 | 264 | prop_process() { 265 | sed -i -e "/^#/d" -e "/^ *$/d" $1 266 | [ -f $MODPATH/system.prop ] || mktouch $MODPATH/system.prop 267 | while read -r LINE; do 268 | echo "$LINE" >>$MODPATH/system.prop 269 | done <$1 270 | } 271 | 272 | # Check for min/max api version 273 | [ -z $MINAPI ] || { [ $API -lt $MINAPI ] && abort "! Your system API of $API is less than the minimum api of $MINAPI! Aborting!"; } 274 | [ -z $MAXAPI ] || { [ $API -gt $MAXAPI ] && abort "! Your system API of $API is greater than the maximum api of $MAXAPI! Aborting!"; } 275 | 276 | # Set variables 277 | [ $API -lt 26 ] && DYNLIB=false 278 | [ -z $DYNLIB ] && DYNLIB=false 279 | [ -z $DEBUG ] && DEBUG=false 280 | [ -e "$PERSISTDIR" ] && PERSISTMOD=$PERSISTDIR/magisk/$MODID 281 | INFO=$NVBASE/modules/.$MODID-files 282 | ORIGDIR="$MAGISKTMP/mirror" 283 | if $DYNLIB; then 284 | LIBPATCH="\/vendor" 285 | LIBDIR=/system/vendor 286 | else 287 | LIBPATCH="\/system" 288 | LIBDIR=/system 289 | fi 290 | 291 | # Debug 292 | ui_print "ⓘ Logging verbosely to ${EXT_DATA}/logs" 293 | set -x 294 | exec 2>"$EXT_DATA"/logs/install.log 295 | 296 | # Run addons 297 | if [ "$(ls -A $MODPATH/common/addon/*/install.sh 2>/dev/null)" ]; then 298 | ui_print " " 299 | ui_print "ⓘ Running Addons -" 300 | for i in "$MODPATH"/common/addon/*/install.sh; do 301 | ui_print "ⓘ Running $(echo $i | sed -r "s|$MODPATH/common/addon/(.*)/install.sh|\1|")..." 302 | . $i 303 | done 304 | fi 305 | 306 | # Remove files outside of module directory 307 | ui_print "ⓘ Removing old files" 308 | 309 | if [ -f $INFO ]; then 310 | while read -r LINE; do 311 | if [ "$(echo -n $LINE | tail -c 1)" = "~" ]; then 312 | continue 313 | elif [ -f "$LINE~" ]; then 314 | mv -f $LINE~ $LINE 315 | else 316 | rm -f $LINE 317 | while true; do 318 | LINE=$(dirname $LINE) 319 | if [[ "$(ls -A $LINE 2>/dev/null)" ]]; then 320 | break 1 321 | else 322 | rm -fr $LINE 323 | fi 324 | done 325 | fi 326 | done <$INFO 327 | rm -f $INFO 328 | fi 329 | 330 | ### Install 331 | ui_print "ⓘ Installing" 332 | 333 | [ -f "$MODPATH/common/install.sh" ] && . $MODPATH/common/install.sh 334 | 335 | # Remove comments from files and place them, add blank line to end if not already present 336 | for i in $(find $MODPATH -type f -name "*.sh" -o -name "*.prop" -o -name "*.rule"); do 337 | if [[ -f $i ]]; then 338 | { 339 | sed -i -e "/^#/d" -e "/^ *$/d" $i 340 | [ "$(tail -1 $i)" ] && echo "" >>$i 341 | } 342 | else 343 | continue 344 | fi 345 | case $i in 346 | "$MODPATH/service.sh") install_script -l $i ;; 347 | "$MODPATH/post-fs-data.sh") install_script -p $i ;; 348 | "$MODPATH/uninstall.sh") if [ -s $INFO ] || [ "$(head -n1 $MODPATH/uninstall.sh)" != "# Don't modify anything after this" ]; then 349 | install_script $MODPATH/uninstall.sh 350 | else 351 | rm -f $INFO $MODPATH/uninstall.sh 352 | fi ;; 353 | esac 354 | done 355 | 356 | $IS64BIT || for i in $(find $MODPATH/system -type d -name "lib64"); do rm -fr $i 2>/dev/null; done 357 | [ -d "/system/priv-app" ] || mv -f $MODPATH/system/priv-app $MODPATH/system/app 2>/dev/null 358 | [ -d "/system/xbin" ] || mv -f $MODPATH/system/xbin $MODPATH/system/bin 2>/dev/null 359 | if $DYNLIB; then 360 | for FILE in $(find $MODPATH/system/lib* -type f 2>/dev/null | sed "s|$MODPATH/system/||"); do 361 | [ -s $MODPATH/system/$FILE ] || continue 362 | case $FILE in 363 | lib*/modules/*) continue ;; 364 | esac 365 | mkdir -p "$(dirname $MODPATH/system/vendor/$FILE)" 366 | mv -f $MODPATH/system/$FILE $MODPATH/system/vendor/$FILE 367 | [ "$(ls -A $(dirname $MODPATH/system/$FILE))" ] || rm -fr $(dirname $MODPATH/system/$FILE) 368 | done 369 | # Delete empty lib folders (busybox find doesn't have this capability) 370 | toybox find $MODPATH/system/* -type d -empty -delete >/dev/null 2>&1 371 | fi 372 | 373 | # Set permissions 374 | ui_print " " 375 | ui_print "ⓘ Setting Permissions" 376 | set_perm_recursive $MODPATH 0 0 0755 0644 377 | if [ -d $MODPATH/system/vendor ]; then 378 | set_perm_recursive $MODPATH/system/vendor 0 0 0755 0644 u:object_r:vendor_file:s0 379 | [ -d $MODPATH/system/vendor/app ] && set_perm_recursive $MODPATH/system/vendor/app 0 0 0755 0644 u:object_r:vendor_app_file:s0 380 | [ -d $MODPATH/system/vendor/etc ] && set_perm_recursive $MODPATH/system/vendor/etc 0 0 0755 0644 u:object_r:vendor_configs_file:s0 381 | [ -d $MODPATH/system/vendor/overlay ] && set_perm_recursive $MODPATH/system/vendor/overlay 0 0 0755 0644 u:object_r:vendor_overlay_file:s0 382 | for FILE in $(find $MODPATH/system/vendor -type f -name -- *".apk"); do 383 | [ -f $FILE ] && chcon u:object_r:vendor_app_file:s0 $FILE 384 | done 385 | fi 386 | set_permissions 387 | 388 | # Complete install 389 | cleanup 390 | -------------------------------------------------------------------------------- /common/install.sh: -------------------------------------------------------------------------------- 1 | # shellcheck shell=dash 2 | # shellcheck disable=SC1091,SC1090,SC2139,SC3010 3 | TRY_COUNT=1 4 | VF=0 5 | OLD_WEBVIEW=0 6 | OLD_BROWSER=0 7 | VERIFY=true 8 | ui_print "ⓘ Your device is a $(echo "$D" | sed 's#%20#\ #g') with android $A, sdk$API, with an $ARCH cpu" 9 | VERSIONFILE="$EXT_DATA/version.txt" 10 | VEN=/system/vendor 11 | [ -L /system/vendor ] && VEN=/vendor 12 | if [ -f $VEN/build.prop ]; then 13 | export BUILDS="/system/build.prop $VEN/build.prop" 14 | else 15 | BUILDS="/system/build.prop" 16 | fi 17 | check_config() { 18 | if [[ "$CV" -ne 6 ]]; then 19 | ui_print "⚠ Wrong config version! Using defaults" 20 | cp "$MODPATH"/config.txt "$EXT_DATA" 21 | . "$EXT_DATA"/config.txt 22 | fi 23 | overrid_conf() { 24 | cp "$MODPATH"/config.txt "$EXT_DATA" 25 | vol_sel 26 | } 27 | if [[ $FORCE_CONFIG -ne 0 ]] && [[ $FORCE_CONFIG -ne 1 ]]; then 28 | ui_print "⚠ Invalid config value for FORCE_CONFIG!" 29 | overrid_conf 30 | elif [[ $OFFLINE -ne 0 ]] && [[ $OFFLINE -ne 1 ]]; then 31 | ui_print "⚠ Invalid config value for OFFLINE!" 32 | overrid_conf 33 | elif [[ $INSTALL -ne 0 ]] && [[ $INSTALL -ne 1 ]] && [[ $INSTALL -ne 2 ]]; then 34 | ui_print "⚠ Invalid config value for INSTALL!" 35 | overrid_conf 36 | elif [[ $WEBVIEW -ne 0 ]] && [[ $WEBVIEW -ne 1 ]] && [[ $WEBVIEW -ne 2 ]]; then 37 | ui_print "⚠ Invalid config value for WEBIEW!" 38 | overrid_conf 39 | elif [[ $BROWSER -ne 0 ]] && [[ $BROWSER -ne 1 ]] && [[ $BROWSER -ne 2 ]] && [[ $BROWSER -ne 3 ]]; then 40 | ui_print "⚠ Invalid config value for BROWSER!" 41 | overrid_conf 42 | fi 43 | } 44 | vol_sel() { 45 | ui_print "ⓘ Starting config mode...." 46 | ui_print "ⓘ To use config.txt, set FORCE_CONFIG=1 in config.txt and edit as necessary." 47 | ui_print "ⓘ Volume up to accept the current choice, and down to move to next option" 48 | sleep 2 49 | ui_print "-> Do you wnat to install only webview?" 50 | unset INSTALL 51 | if chooseport; then 52 | INSTALL=0 53 | fi 54 | if [[ -z $INSTALL ]]; then 55 | ui_print "-> How about only browser?" 56 | if chooseport; then 57 | INSTALL=1 58 | fi 59 | fi 60 | if [[ -z $INSTALL ]]; then 61 | ui_print "-> How about both browser and webview?" 62 | if chooseport; then 63 | INSTALL=2 64 | fi 65 | fi 66 | if [[ -z $INSTALL ]]; then 67 | ui_print "-> No valid choice, Using just webview" 68 | INSTALL=0 69 | fi 70 | sel_web() { 71 | unset WEBVIEW 72 | ui_print "-> Please choose your webview." 73 | ui_print " 1. Bromite" 74 | if chooseport; then 75 | WEBVIEW=0 76 | fi 77 | if [[ -z $WEBVIEW ]]; then 78 | ui_print " 2. Chromium" 79 | if chooseport; then 80 | WEBVIEW=1 81 | fi 82 | fi 83 | if [[ -z $WEBVIEW ]]; then 84 | ui_print " 3. Ungoogled Chromium" 85 | if chooseport; then 86 | WEBVIEW=2 87 | fi 88 | fi 89 | if [[ -z $WEBVIEW ]]; then 90 | ui_print "-> No valid choice, using bromite" 91 | WEBVIEW=0 92 | fi 93 | } 94 | sel_browser() { 95 | unset BROWSER 96 | ui_print "-> Please choose your browser." 97 | ui_print " 1. Bromite" 98 | if chooseport; then 99 | WEBVIEW=0 100 | fi 101 | if [[ -z $BROWSER ]]; then 102 | ui_print " 2. Chromium" 103 | if chooseport; then 104 | BROWSER=1 105 | fi 106 | fi 107 | if [[ -z $BROWSER ]]; then 108 | ui_print " 3. Ungoogled Chromium" 109 | if chooseport; then 110 | BROWSER=2 111 | fi 112 | fi 113 | if [[ -z $BROWSER ]]; then 114 | ui_print " 4. Ungoogled Chromium (extensions support version)?" 115 | if chooseport; then 116 | BROWSER=3 117 | fi 118 | fi 119 | if [[ -z $BROWSER ]]; then 120 | ui_print "-> No valid choice, using bromite" 121 | BROWSER=0 122 | fi 123 | } 124 | if [[ "$INSTALL" -eq 0 ]]; then 125 | sel_web 126 | fi 127 | if [[ "$INSTALL" -eq 2 ]]; then 128 | sel_web 129 | sel_browser 130 | fi 131 | if [[ "$INSTALL" -eq 1 ]]; then 132 | sel_browser 133 | fi 134 | ui_print "ⓘ Config complete! Proceeding." 135 | } 136 | set_config() { 137 | ui_print "ⓘ Setting configs..." 138 | if [[ ! -f "$EXT_DATA"/config.txt ]]; then 139 | cp "$MODPATH"/config.txt "$EXT_DATA" 140 | vol_sel 141 | else 142 | FORCE_CONFIG=0 143 | . "$EXT_DATA"/config.txt 144 | if [[ "$FORCE_CONFIG" -eq 1 ]]; then 145 | check_config 146 | else 147 | cp "$MODPATH"/config.txt "$EXT_DATA" 148 | vol_sel 149 | fi 150 | fi 151 | } 152 | do_ungoogled_webview() { 153 | NAME="Ungoogled-Chromium" 154 | DIR='ugc-w' 155 | W_VER=$(get_v) 156 | } 157 | do_ungoogled_browser() { 158 | NAME="Ungoogled-Chromium" 159 | DIR='ugc-b' 160 | B_VER=$(get_v) 161 | if [[ $BROWSER -eq 3 ]]; then 162 | DIR='ugc-e' 163 | B_VER=$(get_v) 164 | fi 165 | } 166 | do_vanilla_webview() { 167 | NAME="Chromium" 168 | DIR=chrm 169 | W_VER=$(get_v) 170 | } 171 | do_vanilla_browser() { 172 | NAME="Chromium" 173 | DIR=chrm 174 | B_VER=$(get_v) 175 | } 176 | do_bromite_webview() { 177 | NAME="Bromite" 178 | DIR=brm 179 | W_VER=$(get_v) 180 | } 181 | do_bromite_browser() { 182 | NAME="Bromite" 183 | DIR=brm 184 | B_VER=$(get_v) 185 | } 186 | old_version() { 187 | ui_print "ⓘ Checking whether this is a new install...." 188 | if [[ ! -f $EXT_DATA/version.txt ]]; then 189 | echo "OLD_BROWSER=0" >"$VERSIONFILE" 190 | echo "OLD_WEBVIEW=0" >>"$VERSIONFILE" 191 | . "$EXT_DATA"/version.txt 192 | else 193 | if ! . "$EXT_DATA"/version.txt; then 194 | echo "OLD_BROWSER=0" >"$VERSIONFILE" 195 | echo "OLD_WEBVIEW=0" >>"$VERSIONFILE" 196 | . "$EXT_DATA"/version.txt 197 | fi 198 | fi 199 | } 200 | download_webview() { 201 | cd "$TMPDIR" || return 202 | if [[ $WEBVIEW -eq 0 ]]; then 203 | do_bromite_webview 204 | elif [[ $WEBVIEW -eq 1 ]]; then 205 | do_vanilla_webview 206 | else 207 | do_ungoogled_webview 208 | fi 209 | if [[ "$VF" -eq 1 ]]; then 210 | ui_print "ⓘ Redownloading ${NAME} webview, attempt number ${TRY_COUNT}, please be patient..." 211 | dl "&s=$DIR&w=webview&ft=apk" "${EXT_DATA}/apks/${NAME}Webview.apk" "download" 212 | sed -i "/OLD_WEBVIEW/d" "$VERSIONFILE" 213 | echo "OLD_WEBVIEW=$(echo "$W_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 214 | else 215 | old_version 216 | fi 217 | if [[ -f $EXT_DATA/apks/"$NAME"Webview.apk ]]; then 218 | if [[ $OLD_WEBVIEW -lt "$(echo "$W_VER" | sed 's/[^0-9]*//g' | tr -d '.')" ]]; then 219 | ui_print "ⓘ Downloading update for ${NAME} webview, please be patient..." 220 | dl "&s=$DIR&w=webview&ft=apk" "${EXT_DATA}/apks/${NAME}Webview.apk" "download" 221 | sed -i "/OLD_WEBVIEW/d" "$VERSIONFILE" 222 | echo "OLD_WEBVIEW=$(echo "$W_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 223 | else 224 | ui_print "☑ Not a version upgrade! Using existing ${NAME} webview apk" 225 | fi 226 | else 227 | ui_print "ⓘ No existing apk found for ${NAME} webview!" 228 | ui_print "ⓘ Downloading ${NAME} webview, please be patient..." 229 | dl "&s=$DIR&w=webview&ft=apk" "${EXT_DATA}/apks/${NAME}Webview.apk" "download" 230 | sed -i "/OLD_WEBVIEW/d" "$VERSIONFILE" 231 | echo "OLD_WEBVIEW=$(echo "$W_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 232 | fi 233 | verify_w 234 | } 235 | download_browser() { 236 | cd "$TMPDIR" || return 237 | if [[ $BROWSER -eq 0 ]]; then 238 | do_bromite_browser 239 | elif [[ $BROWSER -eq 1 ]]; then 240 | do_vanilla_browser 241 | else 242 | do_ungoogled_browser 243 | fi 244 | if [[ "$VF" -eq 1 ]]; then 245 | ui_print "ⓘ Redownloading ${NAME} browser, please be patient..." 246 | dl "&s=$DIR&w=browser&ft=apk" "${EXT_DATA}/apks/${NAME}Browser.apk" "download" 247 | sed -i "/OLD_BROWSER/d" "$VERSIONFILE" 248 | echo "OLD_BROWSER=$(echo "$B_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 249 | else 250 | old_version 251 | fi 252 | if [[ -f $EXT_DATA/apks/"$NAME"Browser.apk ]]; then 253 | if [[ $OLD_BROWSER -lt "$(echo "$B_VER" | sed 's/[^0-9]*//g' | tr -d '.')" ]]; then 254 | ui_print "ⓘ Downloading update for ${NAME} browser, please be patient..." 255 | dl "&s=$DIR&w=browser&ft=apk" "${EXT_DATA}/apks/${NAME}Browser.apk" "download" 256 | sed -i "/OLD_BROWSER/d" "$VERSIONFILE" 257 | echo "OLD_BROWSER=$(echo "$B_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 258 | else 259 | ui_print "☑ Not a version upgrade! Using existing ${NAME} browser apk" 260 | fi 261 | else 262 | ui_print "ⓘ No existing apk found for ${NAME} browser!" 263 | ui_print "ⓘ Downloading ${NAME} browser, please be patient..." 264 | dl "&s=$DIR&w=browser&ft=apk" "${EXT_DATA}/apks/${NAME}Browser.apk" "download" 265 | sed -i "/OLD_BROWSER/d" "$VERSIONFILE" 266 | echo "OLD_BROWSER=$(echo "$B_VER" | sed 's/[^0-9]*//g')" >>"$VERSIONFILE" 267 | fi 268 | verify_b 269 | } 270 | verify_w() { 271 | ui_print "ⓘ Verifying ${NAME} webview files..." 272 | if $VERIFY; then 273 | cd "$EXT_DATA"/apks || return 274 | O_S=$(md5sum "$NAME"Webview.apk | sed "s/\ $NAME.*//" | tr -d '[:space:]') 275 | T_S=$(dl "&s=$DIR&w=webview&ft=apk" '-' verify | tr -d '[:space:]') 276 | if [ "$T_S" != "$O_S" ]; then 277 | ui_print "⚠ Verification failed, retrying download" 278 | rm -f "$EXT_DATA"/apks/*Webview.apk 279 | TRY_COUNT=$((TRY_COUNT + 1)) 280 | VF=1 281 | if [[ ${TRY_COUNT} -gt 3 ]]; then 282 | it_failed 283 | else 284 | cd "$TMPDIR" || return 285 | download_webview 286 | fi 287 | else 288 | ui_print "☑ Verified successfully. Proceeding..." 289 | VF=0 290 | rm -fr -- *"$ARCH"*.apk 291 | extract_webview 292 | fi 293 | else 294 | ui_print "⚠ ${NAME} cannot be verified, as they don't publish sha256sums." 295 | fi 296 | cd "$TMPDIR" || return 297 | } 298 | verify_b() { 299 | ui_print "ⓘ Verifying ${NAME} browser files..." 300 | if $VERIFY; then 301 | cd "$EXT_DATA"/apks || return 302 | O_S=$(md5sum "$NAME"Browser.apk | sed "s/\ $NAME.*//" | tr -d '[:space:]') 303 | T_S=$(dl "&s=$DIR&w=browser&ft=apk" '-' verify | tr -d '[:space:]') 304 | if [ "$T_S" != "$O_S" ]; then 305 | ui_print "⚠ Verification failed, retrying download" 306 | rm -f "$EXT_DATA"/apks/*Browser.apk 307 | TRY_COUNT=$((TRY_COUNT + 1)) 308 | VF=1 309 | if [[ ${TRY_COUNT} -gt 3 ]]; then 310 | it_failed 311 | else 312 | cd "$TMPDIR" || return 313 | download_browser 314 | fi 315 | else 316 | ui_print "☑ Verified successfully. Proceeding..." 317 | VF=0 318 | rm -fr -- *"$ARCH"*.apk 319 | extract_browser 320 | fi 321 | else 322 | ui_print "⚠ ${NAME} cannot be verified, as they don't publish sha256sums." 323 | extract_browser 324 | fi 325 | cd "$TMPDIR" || return 326 | } 327 | create_overlay() { 328 | cd "$TMPDIR" || return 329 | ui_print "ⓘ Fixing system webview whitelist" 330 | if [[ "${API}" -ge "29" ]]; then 331 | aapt p -f -v -M "$MODPATH"/common/overlay10/AndroidManifest.xml -I /system/framework/framework-res.apk -S "$MODPATH"/common/overlay10/res -F "$MODPATH"/unsigned.apk >"$MODPATH"/logs/aapt.log 332 | else 333 | aapt p -f -v -M "$MODPATH"/common/overlay9/AndroidManifest.xml -I /system/framework/framework-res.apk -S "$MODPATH"/common/overlay9/res -F "$MODPATH"/unsigned.apk >"$MODPATH"/logs/aapt.log 334 | fi 335 | if [[ -f "$MODPATH"/unsigned.apk ]]; then 336 | sign "$MODPATH"/unsigned.apk "$MODPATH"/signed.apk 337 | cp -rf "$MODPATH"/signed.apk "$MODPATH"/common/WebviewOverlay.apk 338 | rm -rf "$MODPATH"/signed.apk "$MODPATH"/unsigned.apk 339 | else 340 | ui_print "⚠ Overlay creation has failed! Poorly developed ROMs have this issue" 341 | ui_print "⚠ Compatibility is unlikely, please report this to your ROM developer." 342 | ui_print "⚠ Some ROMs need a patch to fix this." 343 | fi 344 | cp -f "$MODPATH"/logs/aapt.log "$EXT_DATA"/logs 345 | if [ -d /system_ext/overlay ]; then 346 | OLP=/system/system_ext/overlay 347 | elif [ -d /product/overlay ]; then 348 | OLP=/system/product/overlay 349 | elif [ -d /vendor/overlay ]; then 350 | OLP=/system/vendor/overlay 351 | elif [ -d /system/overlay ]; then 352 | OLP=/system/overlay 353 | fi 354 | mkdir -p "$MODPATH""$OLP" 355 | cp_ch "$MODPATH"/common/WebviewOverlay.apk "$MODPATH""$OLP" 356 | echo "$OLP" >"$MODPATH"/overlay.txt 357 | } 358 | set_path() { 359 | ui_print "ⓘ Detecting and debloating conflicting packages" 360 | paths=$(cmd package dump com.android.webview | grep codePath) 361 | A=${paths##*=} 362 | unset paths 363 | K=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i webview | grep -iv lib | grep -iv stub | grep -iv google) 364 | L=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i webview | grep -iv lib | grep -i stub | grep -iv google) 365 | paths=$(cmd package dump com.google.android.webview | grep codePath) 366 | B=${paths##*=} 367 | unset paths 368 | I=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i google | grep -i webview | grep -iv lib | grep -iv stub | grep -iv overlay) 369 | H=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i google | grep -i webview | grep -iv lib | grep -i stub | grep -iv overlay) 370 | G=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i google | grep -i webview | grep -iv lib | grep -iv stub | grep -i overlay) 371 | paths=$(cmd package dump com.android.chrome | grep codePath) 372 | C=${paths##*=} 373 | J=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i chrome | grep -iv lib | grep -iv stub) 374 | F=$(find /system /vendor /product /system_ext -type d 2>/dev/null | grep -i chrome | grep -iv lib | grep -i stub) 375 | unset paths 376 | paths=$(cmd package dump com.android.browser | grep codePath) 377 | D=${paths##*=} 378 | unset paths 379 | paths=$(cmd package dump org.lineageos.jelly | grep codePath) 380 | E=${paths##*=} 381 | } 382 | extract_webview() { 383 | WPATH="/system/app/${NAME}Webview" 384 | ui_print "ⓘ Installing ${NAME} Webview" 385 | for i in "$A" "$H" "$I" "$B" "$G" "$K" "$L"; do 386 | if [[ -n "$i" ]]; then 387 | mktouch "$MODPATH""$i"/.replace 388 | fi 389 | done 390 | if [[ "${API}" -lt "29" ]]; then 391 | for i in "$J" "$F" "$C"; do 392 | if [[ -n "$i" ]]; then 393 | mktouch "$MODPATH""$i"/.replace 394 | fi 395 | done 396 | fi 397 | mktouch "$MODPATH"$WPATH/.replace 398 | cp_ch "$EXT_DATA"/apks/"$NAME"Webview.apk "$MODPATH"$WPATH/webview.apk || cp_ch "$EXT_DATA"/apks/webview.apk "$MODPATH"$WPATH/webview.apk 399 | cp "$MODPATH"$WPATH/webview.apk "$TMPDIR"/webview.zip 400 | mkdir -p "$TMPDIR"/webview "$MODPATH"$WPATH/lib/arm64 "$MODPATH"$WPATH/lib/arm 401 | unzip -d "$TMPDIR"/webview "$TMPDIR"/webview.zip >/dev/null 402 | cp -rf "$TMPDIR"/webview/lib/arm64-v8a/* "$MODPATH"$WPATH/lib/arm64 403 | cp -rf "$TMPDIR"/webview/lib/armeabi-v7a/* "$MODPATH"$WPATH/lib/arm 404 | rm -rf "$TMPDIR"/webview "$TMPDIR"/webview.zip 405 | create_overlay 406 | } 407 | extract_browser() { 408 | BPATH="/system/app/${NAME}Browser" 409 | ui_print "ⓘ Installing ${NAME} Browser" 410 | for i in "$J" "$F" "$C" "$E" "$D"; do 411 | if [[ -n "$i" ]]; then 412 | mktouch "$MODPATH""$i"/.replace 413 | fi 414 | done 415 | mktouch "$MODPATH""$BPATH"/.replace 416 | cp_ch "$EXT_DATA"/apks/"$NAME"Browser.apk "$MODPATH"$BPATH/browser.apk || cp_ch "$EXT_DATA"/apks/browser.apk "$MODPATH"$BPATH/browser.apk 417 | cp_ch "$MODPATH"$BPATH/browser.apk "$TMPDIR"/browser.zip 418 | mkdir -p "$TMPDIR"/browser "$MODPATH"$BPATH/lib/arm64 "$MODPATH"$BPATH/lib/arm 419 | unzip -d "$TMPDIR"/browser "$TMPDIR"/browser.zip >/dev/null 420 | cp -rf "$TMPDIR"/browser/lib/arm64-v8a/* "$MODPATH"$BPATH/lib/arm64 421 | cp -rf "$TMPDIR"/browser/lib/armeabi-v7a/* "$MODPATH"$BPATH/lib/arm 422 | rm -rf "$TMPDIR"/browser "$TMPDIR"/browser.zip 423 | } 424 | online_install() { 425 | ui_print "☑ Awesome, you have internet" 426 | set_path 427 | if [[ $INSTALL -eq 0 ]]; then 428 | download_webview 429 | elif [[ $INSTALL -eq 1 ]]; then 430 | download_browser 431 | elif [[ $INSTALL -eq 2 ]]; then 432 | download_webview 433 | download_browser 434 | fi 435 | } 436 | offline_install() { 437 | set_path 438 | for file in "$EXT_DATA"/apks/*browser.apk; do 439 | if [ -e "$file" ]; then 440 | ui_print "ⓘ Browser apk found! Using it" 441 | OFFLN_BRS=true 442 | extract_browser 443 | break 444 | else 445 | ui_print "⚠ No browser apk found!" 446 | break 447 | fi 448 | done 449 | for file in "$EXT_DATA"/apks/*webview.apk; do 450 | if [ -e "$file" ]; then 451 | ui_print "ⓘ Webview apk found! Using it" 452 | OFFLN_WV=true 453 | extract_webview 454 | break 455 | else 456 | ui_print "⚠ No webview apk found!" 457 | break 458 | fi 459 | done 460 | if [[ -z $OFFLN_BRS ]] && [[ -z $OFFLN_WV ]]; then 461 | ui_print "⚠ Required files for offline install not found!" 462 | it_failed 463 | fi 464 | } 465 | do_install() { 466 | set_config 467 | if ! "$BOOTMODE"; then 468 | ui_print "ⓘ Detected recovery install! Aborting!" 469 | it_failed 1 470 | elif [[ $FORCE_CONFIG -eq 1 ]]; then 471 | if [[ $OFFLINE -eq 1 ]]; then 472 | ui_print "⚠ Offline install selected! Proceeding..." 473 | offline_install 474 | fi 475 | else 476 | if ! $INTERNET; then 477 | ui_print "⚠ Uh-oh, we can't contact the API." 478 | ui_print "⚠ Make sure api.androidacy.com isn't blocked, that you have internet. and re-run the installer." 479 | ui_print "⚠ Falling back to offline mode for now." 480 | offline_install 481 | else 482 | if [[ ${TRY_COUNT} -gt 3 ]]; then 483 | it_failed 484 | else 485 | online_install 486 | fi 487 | fi 488 | fi 489 | do_cleanup 490 | } 491 | clean_dalvik() { 492 | ui_print "⚠ Dalvik cache will be cleared next boot" 493 | ui_print "⚠ Expect longer boot time" 494 | } 495 | do_cleanup() { 496 | ui_print "ⓘ Cleaning up..." 497 | { 498 | echo "Here's some useful links:" 499 | echo " " 500 | echo "Website: https://www.androidacy.com" 501 | echo "Donate: https://www.androidacy.com/donate/" 502 | echo "Support and contact: https://www.anroidacy.com/contact/" 503 | } >"$EXT_DATA"/README.txt 504 | rm -f "$MODPATH"/system/app/placeholder 505 | rm -f "$MODPATH"/*.md 506 | ui_print "ⓘ Backing up important stuffs to module directory" 507 | mkdir -p "$MODPATH"/backup/ 508 | cp /data/system/overlays.xml "$MODPATH"/backup/ 509 | if [[ -d "$MODPATH"/product ]]; then 510 | if [[ -d "$MODPATH"/system/product ]]; then 511 | cp -rf "$MODPATH"/product/* "$MODPATH"/system/product/ 512 | rm -fr "$MODPATH"/product/ 513 | else 514 | mv "$MODPATH"/product/ "$MODPATH"/system/ 515 | fi 516 | fi 517 | if [[ -d "$MODPATH"/system_ext ]]; then 518 | if [[ -d "$MODPATH"/system/systen_ext ]]; then 519 | cp -rf "$MODPATH"/system_ext/ "$MODPATH"/system/ 520 | rm -fr "$MODPATH"/system_ext/ 521 | else 522 | mv "$MODPATH"/system_ext/ "$MODPATH"/system/ 523 | fi 524 | fi 525 | rm -fr "$MODPATH"/config.txt 526 | clean_dalvik 527 | } 528 | if [[ ${TRY_COUNT} -ge "3" ]]; then 529 | it_failed 530 | else 531 | do_install 532 | fi 533 | ui_print ' ' 534 | ui_print "ⓘ Some stock apps have been systemlessly debloated during install" 535 | sleep 0.15 536 | ui_print "ⓘ Anything debloated is known to cause conflicts" 537 | sleep 0.15 538 | ui_print "ⓘ Such as Chrome, Google WebView, etc" 539 | sleep 0.15 540 | ui_print "ⓘ It is recommended not to reinstall them" 541 | sleep 0.15 542 | ui_print " " 543 | sleep 0.15 544 | ui_print " Webview Manager | By Androidacy" 545 | ui_print ' ' 546 | $INTERNET && curl -s -d "$P&i=1" "$U"/ping >/dev/null 547 | ui_print "☑ Donate at https://www.androidacy.com/donate/" 548 | sleep 0.15 549 | ui_print "☑ Website, how to get support and blog is at https://www.androidacy.com" 550 | sleep 0.15 551 | ui_print "☑ Install apparently succeeded, please reboot ASAP" 552 | sleep 0.15 553 | ui_print " " 554 | -------------------------------------------------------------------------------- /common/overlay10/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /common/overlay10/res/xml/config_webview_packages.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /common/overlay9/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /common/overlay9/res/xml/config_webview_packages.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 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 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /common/tools/tools.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/androidacy-user/WebviewSwitcher/135f462813a390af3bfedf9e89d2e42ea5a9ba34/common/tools/tools.zip -------------------------------------------------------------------------------- /config.txt: -------------------------------------------------------------------------------- 1 | # Config file for Webview Switcher 2 | # If invalid values are found, or this file is missing, then the module falls back to the default in parenthesis 3 | 4 | CV="6" # DO NOT CHANGE THIS 5 | 6 | # Skips setup during installs and uses the values in this file 7 | FORCE_CONFIG=0 8 | 9 | # Should we do a completely offline install? 10 | # To use an apk, place in /sdcard/WebviewManager/apks with the appropriate name, eg webview.apk is for webview and browser.apk for browser 11 | # NOT RECOMMENDED TO CHANGE THIS. Default is 0 for automatic detection 12 | OFFLINE=0 13 | 14 | # What should we install? Some config options below require a certain choice here! 15 | # 0 = Just the webview (default) 16 | # 1 = Just the browser 17 | # 2 = Browser and webview 18 | INSTALL=0 19 | 20 | # Choice of browser (default: 0) 21 | # 0 = Bromite (default) 22 | # 1 = Chromium 23 | # 2 = Ungoogled-Chromium 24 | # 3 = Ungoogled-Chromium with extensions support 25 | BROWSER=0 26 | 27 | # Choice of Webview (default: 0) 28 | # 0 = Bromite (default) 29 | # 1 = Chromium 30 | # 2 = Ungoogled-Chromium 31 | WEBVIEW=0 32 | 33 | 34 | -------------------------------------------------------------------------------- /customize.sh: -------------------------------------------------------------------------------- 1 | ########################################################################################## 2 | # 3 | # MMT Extended Config Script 4 | # 5 | ########################################################################################## 6 | # shellcheck shell=dash 7 | # shellcheck disable=SC2034 8 | # shellcheck disable=SC1090 9 | ########################################################################################## 10 | # Config Flags 11 | ########################################################################################## 12 | # Uncomment and change 'MINAPI' and 'MAXAPI' to the minimum and maximum android version for your mod 13 | # Uncomment DYNLIB if you want libs installed to vendor for oreo+ and system for anything older 14 | # Uncomment DEBUG if you want full debug logs (saved to /sdcard) 15 | #MINAPI=21 16 | #MAXAPI=25 17 | #DYNLIB=true 18 | DEBUG=true 19 | 20 | ########################################################################################## 21 | # Replace list 22 | ########################################################################################## 23 | 24 | # List all directories you want to directly replace in the system 25 | # Check the documentations for more info why you would need this 26 | 27 | # Construct your list in the following format 28 | # This is an example 29 | 30 | # Construct your own list here 31 | REPLACE=" 32 | " 33 | 34 | ########################################################################################## 35 | # Permissions 36 | ########################################################################################## 37 | 38 | set_permissions() { 39 | : # Remove this if adding to this function 40 | 41 | # Note that all files/folders in magisk module directory have the $MODPATH prefix - keep this prefix on all of your files/folders 42 | # Some examples: 43 | 44 | # For directories (includes files in them): 45 | # set_perm_recursive (default: u:object_r:system_file:s0) 46 | 47 | # set_perm_recursive $MODPATH/system/lib 0 0 0755 0644 48 | # set_perm_recursive $MODPATH/system/vendor/lib/soundfx 0 0 0755 0644 49 | 50 | # For files (not in directories taken care of above) 51 | # set_perm (default: u:object_r:system_file:s0) 52 | 53 | # set_perm $MODPATH/system/lib/libart.so 0 0 0644 54 | # set_perm /data/local/tmp/file.txt 0 0 644 55 | } 56 | 57 | ########################################################################################## 58 | # MMT Extended Logic - Don't modify anything after this 59 | ########################################################################################## 60 | 61 | SKIPUNZIP=1 62 | unzip -qjo "$ZIPFILE" 'common/*' -d "$TMPDIR" >&2 63 | . "$TMPDIR"/functions.sh 64 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=bromitewebview 2 | name=Webview Manager 3 | version=9.2.3 4 | versionCode=4075 5 | author=Androidacy 6 | description=Change System WebView and default browser systemless-ly. Block ads and fingerprinting, increase privacy, and more. Website: https://www.androidacy.com/?utm_source=mrepo; Group: https://t.me/androidacy_discussions; Announcements: https://t.me/androidacy 7 | -------------------------------------------------------------------------------- /post-fs-data.sh: -------------------------------------------------------------------------------- 1 | #!/data/adb/magisk/busybox ash 2 | # shellcheck shell=dash 3 | # shellcheck disable=SC2034 4 | ASH_STANDALONE=1 5 | SH=$(readlink -f "$0") 6 | MODDIR=$(dirname "$SH") 7 | exxit() { 8 | set +euxo pipefail 9 | [ "$1" -ne 0 ] && echo "$2" 10 | exit "$1" 11 | } 12 | exec 3>&2 2>"$MODDIR"/logs/postfsdata-verbose.log 13 | set -x 2 14 | set -euo pipefail 15 | trap 'exxit $?' EXIT 16 | OVERLAY=false 17 | # shellcheck disable=SC1090,SC1091 18 | . "${MODDIR}"/status.txt 19 | FINDLOG="$MODDIR"/logs/find.log 20 | PROPSLOG="$MODDIR"/logs/props.log 21 | touch "$FINDLOG" 22 | OL="org.androidacy.WebviewOverlay" 23 | LIST="/data/system/overlays.xml" 24 | DR="$(cat "$MODDIR"/overlay.txt)" 25 | API="$(getprop ro.build.version.sdk)" 26 | touch "$PROPSLOG" 27 | echo "Firing up logging NOW " 28 | echo "---------- Device info: -----------" >"$PROPSLOG" 29 | getprop | grep -iv serial | grep -iv 'net[.]' >>"$PROPSLOG" 30 | echo "------- End Device info ----------" >>"$PROPSLOG" 31 | if test "$API" -lt "27"; then 32 | STATE="3" 33 | else 34 | STATE="6" 35 | fi 36 | if ! $OVERLAY; then 37 | echo "Clearing caches..." 38 | rm -rf /data/resource-cache/* /data/dalvik-cache/* /cache/dalvik-cache/* /data/*/com*android.webview* /data/*/*/com*android.webview* /data/system/package_cache/* 39 | sed -i "/com*webview/d" /data/system/packages.list 40 | sed -i "/com*webview/d" /data/system/packages.xml 41 | sed -i "/com.linuxandria.WebviewOverlay/d" "$LIST" 42 | sed -i "/com.linuxandria.android.webviewoverlay/d" "$LIST" 43 | echo "Forcing the system to register our overlay..." 44 | sed -i "/item packageName=\"${OL}\"/d" /data/system/overlays.xml 45 | sed -i "s|| |" $LIST 46 | sed -i "/OVERLAY/d" "${MODDIR}"/status.txt 47 | echo "OVERLAY=true" >>"${MODDIR}"/status.txt 48 | fi 49 | -------------------------------------------------------------------------------- /service.sh: -------------------------------------------------------------------------------- 1 | #!/data/adb/magisk/busybox ash 2 | # shellcheck shell=dash 3 | # shellcheck disable=SC2034 4 | ASH_STANDALONE=1 5 | SH=$(readlink -f "$0") 6 | MODDIR=$(dirname "$SH") 7 | exxit() { 8 | set +euxo pipefail 9 | [ "$1" -ne 0 ] && echo "$2" 10 | exit "$1" 11 | } 12 | exec 3>&2 2>"$MODDIR"/logs/service-verbose.log 13 | set -x 2 14 | set -euo pipefail 15 | trap 'exxit $?' EXIT 16 | it_failed() { 17 | ui_print " " 18 | ui_print "⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠" 19 | ui_print " " 20 | ui_print " Uh-oh, the installer encountered an issue!" 21 | ui_print " It's probably one of these reasons:" 22 | ui_print " 1) Installer is corrupt" 23 | ui_print " 2) You didn't follow instructions" 24 | ui_print " 3) You have an unstable internet connection" 25 | ui_print " 4) Your ROM is broken" 26 | ui_print " 5) There's a *tiny* chance we screwed up" 27 | ui_print " Please fix any issues and retry." 28 | ui_print " If you feel this is a bug or need assistance, head to our telegram" 29 | mv "${EXT_DATA}"/logs "${TMPDIR}" 30 | rm -rf "${EXT_DATA:?}"/* 31 | mv "${TMPDIR}"/logs "${EXT_DATA}"/ 32 | ui_print " " 33 | ui_print "⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠" 34 | ui_print " " 35 | exit 1 36 | } 37 | INSTALL=false 38 | # shellcheck disable=SC1090,SC1091 39 | . "${MODDIR}"/status.txt 40 | FINDLOG=$MODDIR/logs/find.log 41 | VERBOSELOG=$MODDIR/logs/service-verbose.log 42 | touch "$VERBOSELOG" 43 | echo "Started at $(date)" 44 | while test ! -d /storage/emulated/0/Android; do 45 | sleep 1 46 | done 47 | detect_ext_data() { 48 | if touch /sdcard/.rw && rm /sdcard/.rw; then 49 | export EXT_DATA="/sdcard/WebviewManager" 50 | elif touch /storage/emulated/0/.rw && rm /storage/emulated/0/.rw; then 51 | export EXT_DATA="/storage/emulated/0/WebviewManager" 52 | elif touch /data/media/0/.rw && rm /data/media/0/.rw; then 53 | export EXT_DATA="/data/media/0/WebviewManager" 54 | else 55 | EXT_DATA='/storage/emulated/0/WebviewManager' 56 | fi 57 | } 58 | detect_ext_data 59 | if ! $INSTALL; then 60 | if find "${MODDIR}" | grep -i 'webview[.]apk'; then 61 | pm install -r -g "$(find "${MODDIR}" | grep -i 'webview[.]apk')" 2>&3 62 | fi 63 | if find "${MODDIR}" | grep -i 'browser[.]apk'; then 64 | pm install -r -g "$(find "${MODDIR}" | grep -i 'browser[.]apk')" 2>&3 65 | fi 66 | echo "Installed webview as user app.." 67 | if pm list packages -a | grep -q com.android.chrome 2>&3; then 68 | pm uninstall com.android.chrome 2>&3 69 | fi 70 | if pm list packages -a | grep -q com.google.android.webview 2>&3; then 71 | pm uninstall com.android.chrome 2>&3 72 | fi 73 | echo "Disabled chrome and google webview. You may re-enable but please be aware that may cause issues" 74 | sed -i "/INSTALL/d" "${MODDIR}"/status.txt 75 | echo "INSTALL=true" >>"${MODDIR}"/status.txt 76 | else 77 | echo "Skipping install, as the needed files are not present. This is most likely because they've already been installed" 78 | fi 79 | touch "$FINDLOG" 80 | { 81 | echo -n "SDCARD DIR contains:" 82 | find "$EXT_DATA" 83 | echo -n "Module DIR contains:" 84 | find "$MODDIR" 85 | } >"$FINDLOG" 86 | tail -n +1 "$EXT_DATA"/logs/install.log "$MODDIR"/logs/aapt.log "$MODDIR"/logs/find.log "$MODDIR"/logs/props.log "$MODDIR"/logs/postfsdata-verbose.log "$MODDIR"/logs/service-verbose.log >"$MODDIR"/logs/full-"$(date +%F-%T)".log 87 | cp -rf "$MODDIR"/logs/full-"$(date +%F-%T)".log "$EXT_DATA"/logs 88 | find "$EXT_DATA"/logs -mtime +5 -exec rm {} \; -------------------------------------------------------------------------------- /status.txt: -------------------------------------------------------------------------------- 1 | # DO NOT EDIT THIS FILE, SERIOUSLY 2 | # Automatically updated by the installer -------------------------------------------------------------------------------- /system/placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/androidacy-user/WebviewSwitcher/135f462813a390af3bfedf9e89d2e42ea5a9ba34/system/placeholder -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | OL="org.androidacy.WebviewOverlay" 3 | LIST="/data/system/overlays.xml" 4 | rm -rf /data/resource-cache/* 5 | rm -rf /data/dalvik-cache/* 6 | rm -rf /cache/dalvik-cache/* 7 | rm -rf /data/*/com.android.webview* 8 | rm -rf /data/system/package_cache/* 9 | sed -i "/item packageName=\"${OL}\"/d" $LIST 10 | echo "# Webview Switcher Cleanup Script 11 | while test \"$(getprop sys.boot_completed)\" != \"1\" && test ! -d /storage/emulated/0/Android ; 12 | do sleep 2; 13 | done 14 | rm -rf /storage/emulated/0/WebviewManager 15 | rm -rf /data/adb/service.d/ws-cleanup.sh 16 | exit 0" >/data/adb/service.d/ws-cleanup.sh 17 | chmod 755 /data/adb/service.d/ws-cleanup.sh 18 | sleep 1 19 | reboot 20 | --------------------------------------------------------------------------------