├── .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 | 
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 |
--------------------------------------------------------------------------------