Modify Waydroid #3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Modify Waydroid | |
on: | |
push: | |
paths-ignore: | |
- 'README.md' | |
pull_request: | |
paths-ignore: | |
- 'README.md' | |
workflow_dispatch: | |
inputs: | |
arch: | |
description: "Build arch" | |
required: true | |
default: "x64" | |
type: choice | |
options: | |
- x64 | |
and_ver: | |
description: "Android Version" | |
required: true | |
default: "11" | |
type: choice | |
options: | |
- 11 | |
magisk_apk: | |
description: "Magisk version" | |
required: true | |
default: "26.1" | |
type: choice | |
options: | |
- 24.1 | |
- 24.2 | |
- 24.3 | |
- 25.2 | |
- 26.1 | |
- canary | |
- delta | |
gapps_variant: | |
description: "Variants of gapps" | |
required: true | |
default: "pico" | |
type: choice | |
options: | |
- none | |
- super | |
- stock | |
- full | |
- mini | |
- micro | |
- nano | |
- pico | |
- tvstock | |
- tvmini | |
root_sol: | |
description: "Root solution" | |
required: true | |
default: "magisk" | |
type: choice | |
options: | |
- magisk | |
- none | |
jobs: | |
matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- name: Generate build matrix | |
id: set-matrix | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
let matrix = {}; | |
let arch = "${{ github.event.inputs.arch }}" | |
switch ( arch ) { | |
case "x64": | |
matrix.arch = ["x64"]; | |
break; | |
case "arm64": | |
matrix.arch = ["arm64"]; | |
break; | |
default: | |
matrix.arch = ["x64"]; | |
break; | |
} | |
let release_type = "${{ github.event.inputs.release_type }}" | |
switch ( release_type ) { | |
default: | |
matrix.release_type = ["WIS"]; | |
break; | |
} | |
let magisk_apk = "${{ github.event.inputs.magisk_apk }}" | |
switch ( magisk_apk ) { | |
case "25.2": | |
matrix.magisk_apk = ["25.2"]; | |
break; | |
case "canary": | |
matrix.magisk_apk = ["canary"]; | |
break; | |
case "delta": | |
matrix.magisk_apk = ["delta"]; | |
break; | |
default: | |
matrix.magisk_apk = ["25.2"]; | |
break; | |
} | |
let gapps_variant = "${{ github.event.inputs.gapps_variant }}" | |
switch ( gapps_variant ) { | |
default: | |
matrix.gapps_variant = ["pico"]; | |
break; | |
} | |
let root_sol = "${{ github.event.inputs.root_sol }}" | |
switch ( root_sol ) { | |
default: | |
matrix.root_sol = ["magisk"]; | |
break; | |
} | |
core.setOutput("matrix",JSON.stringify(matrix)); | |
build: | |
runs-on: ubuntu-20.04 | |
needs: matrix | |
strategy: | |
matrix: ${{fromJson(needs.matrix.outputs.matrix)}} | |
steps: | |
- name: Dependencies | |
run: | | |
pip3 install beautifulsoup4 lxml | |
sudo apt-get update && sudo apt-get install setools lzip qemu-utils wine winetricks patchelf attr | |
wget -qO- "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/archive/$GITHUB_REF.tar.gz" | sudo tar --wildcards -zxvf- -C ~ --strip-component=2 '*/wine/*' '*/linker/*' | |
winetricks msxml6 | |
- name: Download WSA | |
shell: python | |
run: | | |
import requests | |
from bs4 import BeautifulSoup | |
import re | |
import zipfile | |
import os | |
import urllib.request | |
arch = "${{ matrix.arch }}" | |
#release_type_map = {"retail": "Retail", "release preview": "RP", "insider slow": "WIS", "insider fast": "WIF"} | |
#release_type_map = "WIS" | |
#release_type = release_type_map["${{ matrix.release_type }}"] if "${{ matrix.release_type }}" != "" else "Retail" | |
release_type = "WIS" | |
res = requests.post("https://store.rg-adguard.net/api/GetFiles", f"type=CategoryId&url=858014f3-3934-4abe-8078-4aa193e74ca8&ring={release_type}&lang=en-US", headers={ | |
"content-type": "application/x-www-form-urlencoded" | |
}, verify=False) # source site has expired cert | |
html = BeautifulSoup(res.content, "lxml") | |
a = html.find("a", string=re.compile(f"Microsoft\.UI\.Xaml\..*_{arch}_.*\.appx")) | |
link = a["href"] | |
print(f"downloading link: {link}", flush=True) | |
out_file = "xaml.appx" | |
if not os.path.isfile(out_file): | |
urllib.request.urlretrieve(link, out_file) | |
a = html.find("a", string=re.compile(f"Microsoft\.VCLibs\..*_{arch}_.*\.appx")) | |
link = a["href"] | |
print(f"downloading link: {link}", flush=True) | |
out_file = "vclibs.appx" | |
if not os.path.isfile(out_file): | |
urllib.request.urlretrieve(link, out_file) | |
a = html.find("a", string=re.compile("MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle")) | |
link = a["href"] | |
print(f"downloading link: {link}", flush=True) | |
out_file = "wsa.zip" | |
if not os.path.isfile(out_file): | |
urllib.request.urlretrieve(link, out_file) | |
zip_name = "" | |
with zipfile.ZipFile(out_file) as zip: | |
for f in zip.filelist: | |
if arch in f.filename.lower(): | |
zip_name = f.filename | |
if not os.path.isfile(zip_name): | |
print(f"unzipping to {zip_name}", flush=True) | |
zip.extract(f) | |
ver_no = zip_name.split("_") | |
ver = ver_no[1] | |
with open(os.environ['GITHUB_ENV'], 'a') as g: | |
g.write(f'WSA_VER={ver}\n') | |
rel = ver_no[3].split(".") | |
rell = str(rel[0]) | |
with open(os.environ['GITHUB_ENV'], 'a') as g: | |
g.write(f'WSA_REL={rell}\n') | |
if 'language' in f.filename.lower() or 'scale' in f.filename.lower(): | |
name = f.filename.split("-", 1)[1].split(".")[0] | |
zip.extract(f) | |
with zipfile.ZipFile(f.filename) as l: | |
for g in l.filelist: | |
if g.filename == 'resources.pri': | |
g.filename = f'{name}.pri' | |
l.extract(g, 'pri') | |
print(f"extract resource pack {g.filename}") | |
elif g.filename == 'AppxManifest.xml': | |
g.filename = f'{name}.xml' | |
l.extract(g, 'xml') | |
with zipfile.ZipFile(zip_name) as zip: | |
if not os.path.isdir(arch): | |
print(f"unzipping from {zip_name}", flush=True) | |
zip.extractall(arch) | |
print("done", flush=True) | |
- name: Download Magisk | |
shell: python | |
run: | | |
import urllib.request | |
import zipfile | |
import os | |
import json | |
import requests | |
magisk_apk = """${{ github.event.inputs.magisk_apk }}""" | |
if not magisk_apk: | |
magisk_apk = "26.1" | |
if magisk_apk == "24.1": | |
magisk_apk = "https://github.com/topjohnwu/Magisk/releases/download/v24.1/Magisk-v24.1.apk" | |
if magisk_apk == "24.2": | |
magisk_apk = "https://github.com/topjohnwu/Magisk/releases/download/v24.2/Magisk-v24.2.apk" | |
if magisk_apk == "24.3": | |
magisk_apk = "https://github.com/topjohnwu/Magisk/releases/download/v24.3/Magisk-v24.3.apk" | |
if magisk_apk == "25.2": | |
magisk_apk = "https://github.com/topjohnwu/Magisk/releases/download/v25.2/Magisk-v25.2.apk" | |
if magisk_apk == "26.1": | |
magisk_apk = "https://github.com/topjohnwu/Magisk/releases/download/v26.1/Magisk-v26.1.apk" | |
if magisk_apk == "canary": | |
magisk_apk = "https://raw.githubusercontent.com/topjohnwu/magisk-files/canary/app-debug.apk" | |
if magisk_apk == "delta": | |
magisk_apk = "https://huskydg.github.io/magisk-files/app-release.apk" | |
if magisk_apk == "stable" or magisk_apk == "beta": | |
magisk_apk = json.loads(requests.get(f"https://github.com/topjohnwu/magisk-files/raw/master/{magisk_apk}.json").content)['magisk']['link'] | |
out_file = "magisk.zip" | |
arch = "${{ matrix.arch }}" | |
abi_map={"x64" : ["x86_64", "x86"], "arm64" : ["arm64-v8a", "armeabi-v7a"]} | |
if not os.path.isfile(out_file): | |
urllib.request.urlretrieve(magisk_apk, out_file) | |
def extract_as(zip, name, as_name, dir): | |
info = zip.getinfo(name) | |
info.filename = as_name | |
zip.extract(info, dir) | |
# changes to standalone_policy since v24.3 | |
# extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskpolicy", "magisk") | |
# extract_as(zip, f"lib/{ abi_map['x64'][0] }/libmagiskinit.so", "magiskpolicy", ".") | |
with zipfile.ZipFile(out_file) as zip: | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagisk64.so", "magisk64", "magisk") | |
extract_as(zip, f"lib/{ abi_map[arch][1] }/libmagisk32.so", "magisk32", "magisk") | |
standalone_policy = False | |
try: | |
zip.getinfo(f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so") | |
standalone_policy = True | |
except: | |
pass | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskinit", "magisk") | |
if standalone_policy: | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so", "magiskpolicy", "magisk") | |
else: | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskpolicy", "magisk") | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskboot.so", "magiskboot", "magisk") | |
extract_as(zip, f"lib/{ abi_map[arch][0] }/libbusybox.so", "busybox", "magisk") | |
if standalone_policy: | |
extract_as(zip, f"lib/{ abi_map['x64'][0] }/libmagiskpolicy.so", "magiskpolicy", ".") | |
else: | |
extract_as(zip, f"lib/{ abi_map['x64'][0] }/libmagiskinit.so", "magiskpolicy", ".") | |
extract_as(zip, f"assets/boot_patch.sh", "boot_patch.sh", "magisk") | |
extract_as(zip, f"assets/util_functions.sh", "util_functions.sh", "magisk") | |
- name: Download OpenGApps | |
if: ${{ matrix.gapps_variant != 'none' && matrix.gapps_variant != '' }} | |
shell: python | |
run: | | |
import requests | |
import zipfile | |
import os | |
import urllib.request | |
import json | |
import re | |
arch = "${{ matrix.arch }}" | |
variant = "${{ matrix.gapps_variant }}" | |
abi_map = {"x64" : "x86_64", "arm64": "arm64"} | |
try: | |
res = requests.get(f"https://api.opengapps.org/list") | |
j = json.loads(res.content) | |
link = {i["name"]: i for i in j["archs"][abi_map[arch]]["apis"]["11.0"]["variants"]}[variant]["zip"] | |
except Exception: | |
print("Failed to fetch from opengapps api, fallbacking to sourceforge rss...") | |
res = requests.get(f'https://sourceforge.net/projects/opengapps/rss?path=/{abi_map[arch]}&limit=100') | |
link = re.search(f'https://.*{abi_map[arch]}/.*{variant}.*\.zip/download', res.text).group().replace('.zip/download', '.zip').replace('sourceforge.net/projects/opengapps/files', 'downloads.sourceforge.net/project/opengapps') | |
print(f"downloading link: {link}", flush=True) | |
out_file = "gapps.zip" | |
if not os.path.isfile(out_file): | |
urllib.request.urlretrieve(link, out_file) | |
print("done", flush=True) | |
- name: Replace system and vendor | |
run: | | |
rm -rf ${{ matrix.arch }}/{system,vendor}.img | |
#wget -q https://sourceforge.net/projects/blissos-dev/files/waydroid/lineage/lineage-18.1/Lineage-OS-18.1-waydroid_x86_64-202111291420-foss-sd-hd-ex_ax86-vaapi_gles-aep.zip/download -O los.zip | |
wget -q https://sourceforge.net/projects/waydroid/files/images/system/lineage/waydroid_x86_64/lineage-18.1-20230422-GAPPS-waydroid_x86_64-system.zip/download -O system.zip | |
wget -q https://sourceforge.net/projects/waydroid/files/images/vendor/waydroid_x86_64/lineage-18.1-20230422-MAINLINE-waydroid_x86_64-vendor.zip/download -O vendor.zip | |
7z x system.zip -o${{ matrix.arch }}/ | |
7z x vendor.zip -o${{ matrix.arch }}/ | |
- name: Extract GApps and expand images | |
if: ${{ matrix.gapps_variant != 'none' && matrix.gapps_variant != '' }} | |
run: | | |
mkdir gapps | |
unzip -p gapps.zip {Core,GApps}/'*.lz' | tar --lzip -C gapps -xvf - -i --strip-components=2 --exclude='setupwizardtablet-x86_64' --exclude='packageinstallergoogle-all' --exclude='speech-common' --exclude='markup-lib-arm' --exclude='markup-lib-arm64' --exclude='markup-all' --exclude='setupwizarddefault-x86_64' --exclude='pixellauncher-all' --exclude='pixellauncher-common' | |
e2fsck -yf ${{ matrix.arch }}/system.img | |
resize2fs ${{ matrix.arch }}/system.img $(( $(du -sB512 gapps | cut -f1) + $(du -sB512 ${{ matrix.arch }}/system.img | cut -f1) ))s | |
- name: Expand vendor | |
run: | | |
e2fsck -yf ${{ matrix.arch }}/vendor.img | |
resize2fs ${{ matrix.arch }}/vendor.img 512M | |
- name: Mount images | |
run: | | |
sudo mkdir system | |
sudo mkdir userdata | |
sudo mount -o loop ${{ matrix.arch }}/system.img system | |
sudo mount -o loop ${{ matrix.arch }}/vendor.img system/vendor | |
sudo mv system/product system/product_ln | |
sudo mkdir system/product | |
sudo mount --bind $(pwd)/system/system/product $(pwd)/system/product | |
ls system/product | |
sudo mv system/system_ext system/system_ext_ln | |
sudo mkdir system/system_ext | |
sudo mount --bind $(pwd)/system/system/system_ext $(pwd)/system/system_ext | |
ls system/system_ext | |
qemu-img convert -O raw ${{ matrix.arch }}/userdata.vhdx userdata.img | |
sudo mount -o loop userdata.img userdata | |
- name: Integrate Magisk | |
if: ${{ github.event.inputs.root_sol == 'magisk' || github.event.inputs.root_sol == '' }} | |
run: | | |
mkdir linker | |
mkdir linker/x86_64 | |
wget -q https://raw.githubusercontent.com/pagkly/MagiskOnWaydroid/main/linker/x86_64/libc.so -O linker/x86_64/libc.so | |
wget -q https://raw.githubusercontent.com/pagkly/MagiskOnWaydroid/main/linker/x86_64/libdl.so -O linker/x86_64/libdl.so | |
wget -q https://raw.githubusercontent.com/pagkly/MagiskOnWaydroid/main/linker/x86_64/libm.so -O linker/x86_64/libm.so | |
wget -q https://raw.githubusercontent.com/pagkly/MagiskOnWaydroid/main/linker/x86_64/linker64 -O linker/x86_64/linker64 | |
sudo chmod +x "linker/x86_64/linker64" || abort | |
sudo patchelf --set-interpreter "linker/x86_64/linker64" "magisk/magiskpolicy" || abort | |
chmod +x "magisk/magiskpolicy" || abort | |
sudo cp "magisk/magisk"* "system/debug_ramdisk/" | |
sudo cp magisk.zip "system/debug_ramdisk/stub.apk" || abort | |
sudo tee -a "system/debug_ramdisk/loadpolicy.sh" <<EOF >/dev/null || abort | |
#!/system/bin/sh | |
MAGISKTMP=/debug_ramdisk | |
export MAGISKTMP | |
mkdir -p /data/adb/magisk | |
cp \$MAGISKTMP/* /data/adb/magisk/ | |
sync | |
chmod -R 755 /data/adb/magisk | |
restorecon -R /data/adb/magisk | |
MAKEDEV=1 \$MAGISKTMP/magisk --preinit-device 2>&1 | |
RULESCMD="" | |
for r in \$MAGISKTMP/.magisk/preinit/*/sepolicy.rule; do | |
[ -f "\$r" ] || continue | |
RULESCMD="\$RULESCMD --apply \$r" | |
done | |
\$MAGISKTMP/magiskpolicy --live \$RULESCMD 2>&1 | |
EOF | |
sudo find "system/debug_ramdisk" -type f -exec chmod 0711 {} \; | |
sudo find "system/debug_ramdisk" -type f -exec chown root:root {} \; | |
sudo find "system/debug_ramdisk" -type f -exec setfattr -n security.selinux -v "u:object_r:magisk_file:s0" {} \; || abort | |
echo "/debug_ramdisk(/.*)? u:object_r:magisk_file:s0" | sudo tee -a "system/vendor/etc/selinux/vendor_file_contexts" | |
echo '/data/adb/magisk(/.*)? u:object_r:magisk_file:s0' | sudo tee -a "system/vendor/etc/selinux/vendor_file_contexts" | |
#ls -R . | |
sudo LD_LIBRARY_PATH="linker/x86_64" "magisk/magiskpolicy" --load "system/vendor/etc/selinux/precompiled_sepolicy" --save "system/vendor/etc/selinux/precompiled_sepolicy" --magisk || abort | |
sudo tee -a "system/system/etc/init/hw/init.rc" <<EOF >/dev/null | |
on post-fs-data | |
mkdir /dev/debug_ramdisk_mirror | |
mount none /debug_ramdisk /dev/debug_ramdisk_mirror bind | |
mount none none /dev/debug_ramdisk_mirror private | |
mount tmpfs magisk /debug_ramdisk mode=0755 | |
copy /dev/debug_ramdisk_mirror/magisk64 /debug_ramdisk/magisk64 | |
chmod 0755 /debug_ramdisk/magisk64 | |
symlink ./magisk64 /debug_ramdisk/magisk | |
symlink ./magisk64 /debug_ramdisk/su | |
symlink ./magisk64 /debug_ramdisk/resetprop | |
start adbd | |
copy /dev/debug_ramdisk_mirror/magisk32 /debug_ramdisk/magisk32 | |
chmod 0755 /debug_ramdisk/magisk32 | |
copy /dev/debug_ramdisk_mirror/magiskinit /debug_ramdisk/magiskinit | |
chmod 0750 /debug_ramdisk/magiskinit | |
copy /dev/debug_ramdisk_mirror/magiskpolicy /debug_ramdisk/magiskpolicy | |
chmod 0755 /debug_ramdisk/magiskpolicy | |
mkdir /debug_ramdisk/.magisk | |
mkdir /debug_ramdisk/.magisk/mirror 0 | |
mkdir /debug_ramdisk/.magisk/block 0 | |
mkdir /debug_ramdisk/.magisk/worker 0 | |
copy /dev/debug_ramdisk_mirror/stub.apk /debug_ramdisk/stub.apk | |
chmod 0644 /debug_ramdisk/stub.apk | |
copy /dev/debug_ramdisk_mirror/loadpolicy.sh /debug_ramdisk/loadpolicy.sh | |
chmod 0755 /debug_ramdisk/loadpolicy.sh | |
umount /dev/debug_ramdisk_mirror | |
rmdir /dev/debug_ramdisk_mirror | |
exec u:r:magisk:s0 0 0 -- /system/bin/sh /debug_ramdisk/loadpolicy.sh | |
exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --post-fs-data | |
on property:vold.decrypt=trigger_restart_framework | |
exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --service | |
on nonencrypted | |
exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --service | |
on property:sys.boot_completed=1 | |
exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --boot-complete | |
on property:init.svc.zygote=stopped | |
exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --zygote-restart | |
EOF | |
for i in "system/system/etc/init/hw"/*; do | |
if [[ "$i" =~ init.zygote.+\.rc ]]; then | |
echo "Inject zygote restart $i" | |
sudo awk -i inplace '{if($0 ~ /service zygote /){print $0;print " exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --zygote-restart";a="";next}} 1' "$i" | |
sudo setfattr -n security.selinux -v "u:object_r:system_file:s0" "$i" || abort | |
fi | |
done | |
echo -e "Integrate Magisk done\n" | |
- name: Remove FOSS Apps | |
run: | | |
sudo rm -rf system/system/app/com.google.android.gsf | |
sudo rm -rf system/system/app/com.aurora.adroid | |
sudo rm -rf system/system/app/com.aurora.store | |
sudo rm -rf system/system/app/com.etesync.syncadapter | |
sudo rm -rf system/system/app/is.xyz.mpv | |
sudo rm -rf system/system/app/me.jfenn.alarmio | |
sudo rm -rf system/system/app/org.microg.gms.droidguard | |
sudo rm -rf system/system/app/org.microg.nlp.backend.ichnaea | |
sudo rm -rf system/system/app/org.microg.nlp.backend.nominatim | |
sudo rm -rf system/system/app/org.schabi.newpipe | |
sudo rm -rf system/system/app/ws.xsoh.etar | |
sudo rm -rf system/system/priv-app/AuroraServices_v1.1.1 | |
sudo rm -rf system/system/priv-app/com.google.android.gms | |
sudo rm -rf system/system/priv-app/com.android.vending | |
sudo rm -rf system/system/product/app/Etar | |
sudo rm -rf system/system/product/priv-app/Contacts | |
sudo rm -rf system/system/product/app/ExactCalculator | |
sudo rm -rf system/system/product/priv-app/Eleven | |
sudo rm -rf system/system/app/com.simplemobiletools.gallery.pro | |
sudo rm -rf system/system/app/NotePad | |
sudo rm -rf system/system/app/org.bromite.bromite | |
sudo rm -rf system/system/app/com.google.android.webview | |
sudo rm -rf system/system/app/com.android.webview | |
#sudo mv system/system/xbin/su system/system/xbin/suold | |
sudo ls system/system/xbin | |
wget -qO- "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/archive/$GITHUB_REF.tar.gz" | sudo tar --wildcards -zxvf- --strip-component=2 '*/${{ matrix.arch }}/system/*' | |
sudo find system/system/priv-app -type d -exec chmod 0755 {} \; | |
sudo find system/system/priv-app -type f -exec chmod 0644 {} \; | |
sudo find system/system/priv-app -exec chcon --reference=system/system/priv-app {} \; | |
- name: Fix GApps prop | |
if: ${{ matrix.gapps_variant != 'none' && matrix.gapps_variant != '' }} | |
shell: sudo python {0} | |
run: | | |
from __future__ import annotations | |
from io import TextIOWrapper | |
from os import system | |
from typing import OrderedDict | |
class Prop(OrderedDict): | |
def __init__(self, file: TextIOWrapper) -> None: | |
super().__init__() | |
for i, line in enumerate(file.read().splitlines(False)): | |
if '=' in line: | |
k, v = line.split('=', 2) | |
self[k] = v | |
else: | |
self[f".{i}"] = line | |
def __str__(self) -> str: | |
return '\n'.join([v if k.startswith('.') else f"{k}={v}" for k, v in self.items()]) | |
def __iadd__(self, other: str) -> Prop: | |
self[f".{len(self)}"] = other | |
return self | |
new_props = { | |
("product", "brand"): "google", | |
("product", "manufacturer"): "Google", | |
("build", "product"): "redfin", | |
("product", "name"): "redfin", | |
("product", "device"): "redfin", | |
("product", "model"): "Pixel 5", | |
("build", "flavor"): "redfin-user" | |
} | |
def description(sec: str, p: Prop) -> str: | |
return f"{p[f'ro.{sec}.build.flavor']} {p[f'ro.{sec}.build.version.release_or_codename']} {p[f'ro.{sec}.build.id']} {p[f'ro.{sec}.build.version.incremental']} {p[f'ro.{sec}.build.tags']}" | |
def fingerprint(sec: str, p: Prop) -> str: | |
return f"""{p[f"ro.product.{sec}.brand"]}/{p[f"ro.product.{sec}.name"]}/{p[f"ro.product.{sec}.device"]}:{p[f"ro.{sec}.build.version.release"]}/{p[f"ro.{sec}.build.id"]}/{p[f"ro.{sec}.build.version.incremental"]}:{p[f"ro.{sec}.build.type"]}/{p[f"ro.{sec}.build.tags"]}""" | |
def fix_prop(sec, prop): | |
print(f"fixing {prop}", flush=True) | |
with open(prop, 'r') as f: | |
p = Prop(f) | |
p += "# extra prop added by MagiskOnWSA" | |
for k, v in new_props.items(): | |
p[f"ro.{k[0]}.{k[1]}"] = v | |
if k[0] == "build": | |
p[f"ro.{sec}.{k[0]}.{k[1]}"] = v | |
elif k[0] == "product": | |
p[f"ro.{k[0]}.{sec}.{k[1]}"] = v | |
p["ro.build.description"] = description(sec, p) | |
p[f"ro.build.fingerprint"] = fingerprint(sec, p) | |
p[f"ro.{sec}.build.description"] = description(sec, p) | |
p[f"ro.{sec}.build.fingerprint"] = fingerprint(sec, p) | |
p[f"ro.bootimage.build.fingerprint"] = fingerprint(sec, p) | |
with open(prop, 'w') as f: | |
f.write(str(p)) | |
for sec, prop in {"system": "system/system/build.prop", "product": "system/product/build.prop", "system_ext": "system/system_ext/build.prop", "vendor": "system/vendor/build.prop", "odm": "system/vendor/odm/etc/build.prop"}.items(): | |
fix_prop(sec, prop) | |
- name: Umount images | |
run: | | |
sudo umount system/vendor | |
sudo umount -l system/product | |
sudo rm -rf system/product | |
sudo mv system/product_ln system/product | |
sudo umount -l system/system_ext | |
sudo rm -rf system/system_ext | |
sudo mv system/system_ext_ln system/system_ext | |
sudo umount system | |
sudo umount userdata | |
qemu-img convert -o subformat=dynamic -f raw -O vhdx userdata.img ${{ matrix.arch }}/userdata.vhdx | |
- name: Shrink images | |
run: | | |
e2fsck -yf ${{ matrix.arch }}/system.img | |
resize2fs -M ${{ matrix.arch }}/system.img | |
e2fsck -yf ${{ matrix.arch }}/vendor.img | |
resize2fs -M ${{ matrix.arch }}/vendor.img | |
- name: Remove signature and add scripts | |
run: | | |
rm -rf ${{ matrix.arch }}/product.img | |
rm -rf ${{ matrix.arch }}/system_ext.img | |
rm -rf ${{ matrix.arch }}/userdata.img | |
rm -rf WsaPackage_*_ARM64_Release-Nightly.msix | |
rm -rf WsaPackage_*_language*.msix | |
rm -rf ${{ matrix.arch }}/\[Content_Types\].xml ${{ matrix.arch }}/AppxBlockMap.xml ${{ matrix.arch }}/AppxSignature.p7x ${{ matrix.arch }}/AppxMetadata | |
cp vclibs.appx xaml.appx ${{ matrix.arch }} | |
tee ${{ matrix.arch }}/Install.ps1 <<EOF | |
# Automated Install script by Mioki | |
# http://github.com/okibcn | |
function Test-Administrator { | |
[OutputType([bool])] | |
param() | |
process { | |
[Security.Principal.WindowsPrincipal]\$user = [Security.Principal.WindowsIdentity]::GetCurrent(); | |
return \$user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator); | |
} | |
} | |
function Finish { | |
Clear-Host | |
Start-Process "wsa://com.topjohnwu.magisk" | |
Start-Process "wsa://com.android.vending" | |
} | |
if (-not (Test-Administrator)) { | |
\$proc = Start-Process -PassThru -WindowStyle Hidden -Verb RunAs powershell.exe -Args "-executionpolicy bypass -command Set-Location '\$PSScriptRoot'; &'\$PSCommandPath' EVAL" | |
\$proc.WaitForExit() | |
if (\$proc.ExitCode -ne 0) { | |
Clear-Host | |
Write-Warning "Failed to launch start as Administrator\`r\`nPress any key to exit" | |
\$null = \$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); | |
} | |
exit | |
} | |
elseif ((\$args.Count -eq 1) -and (\$args[0] -eq "EVAL")) { | |
Start-Process powershell.exe -Args "-executionpolicy bypass -command Set-Location '\$PSScriptRoot'; &'\$PSCommandPath'" | |
exit | |
} | |
if (((Test-Path -Path $(ls -Q ./${{ matrix.arch }} | paste -sd "," -)) -eq \$false).Count) { | |
Write-Error "Some files are missing in the zip. Please try to download it again from the browser downloader, or try to run the workflow again. Press any key to exist" | |
\$null = \$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') | |
exit 1 | |
} | |
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1" | |
\$VMP = Get-WindowsOptionalFeature -Online -FeatureName 'VirtualMachinePlatform' | |
if (\$VMP.State -ne "Enabled") { | |
Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName 'VirtualMachinePlatform' | |
Clear-Host | |
Write-Warning "Need restart to enable virtual machine platform\`r\`nPress y to restart or press any key to exit" | |
\$key = \$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') | |
If ("y" -eq \$key.Character) { | |
Restart-Computer -Confirm | |
} | |
Else { | |
exit 1 | |
} | |
} | |
Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Path vclibs.appx | |
Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Path xaml.appx | |
\$Installed = \$null | |
\$Installed = Get-AppxPackage -Name 'MicrosoftCorporationII.WindowsSubsystemForAndroid' | |
If ((\$null -ne \$Installed) -and (-not (\$Installed.IsDevelopmentMode))) { | |
Clear-Host | |
Write-Warning "There is already one installed WSA. Please uninstall it first.\`r\`nPress y to uninstall existing WSA or press any key to exit" | |
\$key = \$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') | |
If ("y" -eq \$key.Character) { | |
Remove-AppxPackage -Package \$Installed.PackageFullName | |
} | |
Else { | |
exit 1 | |
} | |
} | |
Clear-Host | |
Write-Host "Installing MagiskOnWSA..." | |
Stop-Process -Name "wsaclient" -ErrorAction "silentlycontinue" | |
Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Register .\AppxManifest.xml | |
if (\$?) { | |
Finish | |
} | |
Elseif (\$null -ne \$Installed) { | |
Clear-Host | |
Write-Host "Failed to update, try to uninstall existing installation while preserving userdata..." | |
Remove-AppxPackage -PreserveApplicationData -Package \$Installed.PackageFullName | |
Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Register .\AppxManifest.xml | |
if (\$?) { | |
Finish | |
} | |
} | |
Write-Host "All Done\`r\`nPress any key to exit" | |
\$null = \$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') | |
EOF | |
shopt -s extglob | |
sudo rm -rf -- ${{ matrix.arch }}/!(system.img|vendor.img) | |
- name: Generate artifact name | |
run: | | |
variant="${{ matrix.gapps_variant }}" | |
root="${{ github.event.inputs.root_sol }}" | |
if [[ "$root" = "none" ]]; then | |
name1="" | |
elif [[ "$root" = "" ]]; then | |
name1="-magisk" | |
else | |
name1="-${root}" | |
fi | |
if [[ "$variant" = "none" || "$variant" = "" ]]; then | |
name2="-NoGApps" | |
else | |
name2="-${variant}" | |
fi | |
echo "artifact_name=WD${name1}${name2}_${{ matrix.arch }}" >> $GITHUB_ENV | |
- name: Upload Waydroid | |
uses: actions/upload-artifact@v2 | |
with: | |
name: ${{ env.artifact_name }} | |
path: "./${{ matrix.arch }}/*" |