diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index e245cd5..0000000 --- a/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -* -keys diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 2fffe83..0000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -build/* -config/keys/* -config/env/* -config/container/Dockerfile.* -release/* -.* diff --git a/.gitignore b/.gitignore new file mode 120000 index 0000000..776cb65 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +aosp-build/.gitignore \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e19b96f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "aosp-build"] + path = aosp-build + url = https://github.com/hashbang/aosp-build.git diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 89fe3c9..0000000 --- a/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM hashbang/aosp-build@sha256:53ea03cb5e67821159f57685e9a202349a5ef9c42b81567e5f467ff3c2f0c89d - -USER root -RUN \ - apt-get update && \ - apt-get install -y \ - python-six \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -USER build diff --git a/Makefile b/Makefile index af6a276..162b7d7 100644 --- a/Makefile +++ b/Makefile @@ -1,278 +1,20 @@ -## Argument Variables ## +include aosp-build/Makefile -CPUS := $(shell nproc) -MEMORY := 10000 -DISK := 300000 -DEVICE := crosshatch -BACKEND := local -CHANNEL := beta -BUILD := user -FLAVOR := aosp -IMAGE := hashbang/aosp-build:latest -IMAGE_OPTIONS := -NAME := aosp-build-$(FLAVOR)-$(BACKEND) -SHELL := /bin/bash +NAME := hashbangos-$(FLAVOR)-$(BACKEND) --include $(PWD)/config/env/$(BACKEND).env +contain-base-extend = \ + --volume $(PWD)/aosp-build/scripts:/opt/aosp-build/scripts \ + --volume $(PWD)/aosp-build/config:/opt/aosp-build/config \ + --volume $(PWD)/aosp-build/config/manifests:/home/build/config/manifests-aosp -## Default Target ## +.PHONY: HashbangMobile-setup +HashbangMobile-setup: + cd aosp-build/ && ln -sf ../build -.DEFAULT_GOAL := default -.PHONY: default -default: machine image fetch tools keys build release +.PHONY: HashbangMobile-release +HashbangMobile-review: HashbangMobile-setup + make -C aosp-build config ensure-git-status-clean + make -C aosp-build manifest ensure-git-status-clean fetch + make fetch review - -## Primary Targets ## - -.PHONY: fetch -fetch: submodule-update machine image - $(contain) fetch - -.PHONY: keys -keys: - $(contain) keys - -.PHONY: build -build: - $(contain) build - -.PHONY: release -release: - $(contain) release - -.PHONY: publish -publish: - $(contain) publish - -.PHONY: clean -clean: - $(contain) clean - -.PHONY: mrproper -mrproper: storage-delete machine-delete - rm -rf build - - -## Secondary Targets ## - -.PHONY: image -image: - $(docker) build \ - --tag $(IMAGE) \ - --file $(PWD)/config/container/Dockerfile \ - $(IMAGE_OPTIONS) \ - $(PWD) - -config/container/Dockerfile.minimal: config/container/Dockerfile config/container/render_template - ./config/container/render_template "$<" | grep -v '^#\s*$$' > "$@" - -.PHONY: image-minimal -image-minimal: config/container/Dockerfile.minimal - $(docker) build \ - --tag $(IMAGE) \ - --file "$(PWD)/$<" \ - $(IMAGE_OPTIONS) \ - $(PWD) - -.PHONY: tools -tools: - mkdir -p config/keys build/base release build/external - $(contain) tools - -.PHONY: vendor -vendor: - $(contain) build-vendor - -.PHONY: chromium -chromium: - $(contain) build-chromium - -.PHONY: kernel -kernel: - $(contain) build-kernel - - -## Development ## - -.PHONY: latest -latest: config submodule-latest fetch - -.PHONY: manifest -manifest: config - $(contain) bash -c "source <(environment) && manifest" - -.PHONY: config -config: - $(contain) bash -c "source <(environment) && config" - -.PHONY: test-repro -test-repro: - $(contain) test-repro - -.PHONY: test -test: test-repro - -.PHONY: patches -patches: - @$(contain) bash -c "cd base; repo diff --absolute" - -.PHONY: shell -shell: - $(docker) inspect "$(NAME)" \ - && $(docker) exec --interactive --tty "$(NAME)" shell \ - || $(contain) shell - -.PHONY: monitor -monitor: - $(docker) inspect "$(NAME)" \ - && $(docker) exec --interactive --tty "$(NAME)" htop - -.PHONY: install -install: tools - @scripts/flash - - -## Source Management ## - -.PHONY: submodule-update -submodule-update: - git submodule update --init --recursive - -.PHONY: submodule-latest -submodule-latest: - git submodule foreach 'git checkout master && git pull' - -## Storage Bootstrapping ## - -# TODO: detect if plugin is already installed or not -# TODO: Hash lock rexray with sha256 digest to prevent tag clobbering -.PHONY: storage-digitalocean -storage-digitalocean: - $(docker) volume ls | grep $(NAME) \ - ||( $(docker) plugin install \ - --grant-all-permissions \ - rexray/dobs:0.11.4 \ - DOBS_REGION=$(DIGITALOCEAN_REGION) \ - DOBS_TOKEN=$(DIGITALOCEAN_TOKEN) \ - ; $(docker) volume create \ - --driver rexray/dobs:0.11.4 \ - --opt=size=$$(( $(DISK) / 1000 )) \ - --name=$(NAME) \ - ) - -.PHONY: storage-local -storage-local: - $(docker) volume ls | grep $(NAME) \ - || $(docker) volume create \ - --driver local \ - --opt type=none \ - --opt o=bind \ - --opt device=$(PWD)/build \ - $(NAME) - -.PHONY: storage-delete -storage-delete: - $(docker) volume rm -f $(NAME) || : - - -## VM Management ## - -.PHONY: machine-start -machine-start: machine-install machine-create machine-date - $(docker_machine) status $(NAME) \ - || $(docker_machine) start $(NAME) - -.PHONY: machine-sync -machine-sync: - $(docker_machine) scp -r -d config/ $(NAME):$(PWD)/config/ - -.PHONY: machine-shell -machine-shell: - $(docker_machine) ssh $(NAME) - -.PHONY: machine-stop -machine-stop: - $(docker_machine) stop $(NAME) - -.PHONY: machine-delete -machine-delete: - $(docker_machine) rm -f -y $(NAME) - -.PHONY: machine-date -machine-date: - $(docker_machine) ssh $(NAME) \ - "sudo date -s @$(shell date +%s)" - -.PHONY: machine-create -machine-create: machine-install - $(docker_machine) status $(NAME) \ - ||( $(docker_machine) create \ - --driver $(BACKEND) \ - $(docker_machine_create_flags) \ - $(NAME) \ - ) - -.PHONY: machine-install -machine-install: - # wget docker-machine & hash check here - - -## VM Bootstrapping ## - -ifeq ($(BACKEND),local) - -executables = docker -docker = docker -machine: -storage_flags = --volume $(PWD)/build/:/home/build/build/ - -else ifeq ($(BACKEND),virtualbox) - -executables = docker-machine ssh virtualbox -docker = $(docker_machine) ssh $(NAME) -t docker -machine: machine-start storage-local -storage_flags = --volume $(NAME):/home/build/build/ -docker_machine_create_flags = \ - --virtualbox-share-folder="$(PWD):$(PWD)" \ - --virtualbox-disk-size="$(DISK)" \ - --virtualbox-memory="$(MEMORY)" \ - --virtualbox-cpu-count="$(CPUS)" - -else ifeq ($(BACKEND),digitalocean) - -executables = docker-machine ssh -docker = $(docker_machine) ssh $(NAME) -t docker -machine: machine-start storage-digitalocean machine-sync -storage_flags = --volume $(NAME):/home/build/build/ -docker_machine_create_flags = \ - --digitalocean-access-token=$(DIGITALOCEAN_TOKEN) \ - --digitalocean-region=$(DIGITALOCEAN_REGION) \ - --digitalocean-image=$(DIGITALOCEAN_IMAGE) \ - --digitalocean-size=$(DIGITALOCEAN_SIZE) - -endif - -userid = $(shell id -u) -groupid = $(shell id -g) -docker_machine = docker-machine --storage-path "${PWD}/build/machine" -contain := \ - $(docker) run \ - --rm \ - --tty \ - --interactive \ - --name "$(NAME)" \ - --hostname "$(NAME)" \ - --user $(userid):$(groupid) \ - --env DEVICE=$(DEVICE) \ - --security-opt seccomp=unconfined \ - --volume $(PWD)/config:/home/build/config \ - --volume $(PWD)/release:/home/build/release \ - --volume $(PWD)/scripts:/home/build/scripts \ - $(storage_flags) \ - $(IMAGE) - - -## Required Binary Check ## - -check_executables := $(foreach exec,$(executables),\$(if \ - $(shell which $(exec)),some string,$(error "No $(exec) in PATH"))) +HashbangMobile-build: clean fetch build release diff --git a/README.md b/README.md index 656e8d5..01d2b05 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,20 @@ -# #!os # + + +# #!mobile (HashbangMobile) # @@ -33,7 +49,7 @@ Testers, builders, and hosting bandwidth needed. ## Support ## -Please join us on IRC: ircs://irc.hashbang.sh/#!os +Please join us on IRC: ircs://irc.hashbang.sh/#!mobile ## Features ## @@ -117,36 +133,88 @@ Please join us on IRC: ircs://irc.hashbang.sh/#!os Release hosting is sponsored by [JFrog](https://www.jfrog.com/) -## Install, build, flash, update ## +## Install ## + +Refer to [GrapheneOS CLI install] and [aosp-build]. + +[GrapheneOS CLI install]: https://grapheneos.org/install/cli + +## Building ## -Those steps are the same for AOSP and are thus documented by [aosp-build](https://github.com/hashbang/aosp-build). +### Requirements ### + + * 35 GiB of memory or more. Link-Time Optimization (LTO) creates huge peaks + during linking and is mandatory for Control Flow Integrity (CFI). Linking + Vanadium (Chromium) and the Linux kernel with LTO + CFI are the most memory + demanding tasks. + * 350 GiB+ of additional free storage space for a typical build of the entire + OS for a multiarch device. + +### Generate Signing Keys ### + +Each device needs its own set of keys: +``` +make DEVICE=crosshatch keys +``` + +### Build Factory Image ### + +Build flashable images for desired device: +``` +make DEVICE=crosshatch clean build release +``` ## Develop ## -### Release ### -1. Update to latest upstream sources. +### clean ### - You can find the latest releases on - https://source.android.com/setup/start/build-numbers. You will need to update - the `platform.ref` (the `ref` key below the `platform` key) in `config.yml` - and then update the manifest and config files using: +Do basic cleaning without deleting cached artifacts/sources: +``` +make clean +``` - ``` - make manifest - ``` +Clean everything but keys +``` +make mrproper +``` + +### Compare ### + +Build a given device twice from scratch and compare with diffoscope: +``` +make compare +``` + +### Edit ### -2. Build all targets impacted by given change +Create a shell inside the docker environment: +``` +make shell +``` + +### Patch ### + +Output all untracked changes in android sources to a patchfile: +``` +make diff > patches/my-feature.patch +``` + +### Release ### + +1. `make config manifest` see [aosp-build]. + +1. Build all targets impacted by given change ``` - make DEVICE=crosshatch build release + make DEVICE=crosshatch release ``` -3. Commit changes to a PR -4. Author or reviewer manually tests and documents in CHANGELOG -5. Reviewer security audits local/upstream changes and documents in CHANGELOG -6. Maintainer does signed merge of changes to master -7. Maintainer makes signed release tag. (E.g: "9.0.1_r37-hb37") +1. Commit changes to a PR +1. Author or reviewer manually tests and documents in CHANGELOG +1. Reviewer security audits local/upstream changes and documents in CHANGELOG +1. Maintainer does signed merge of changes to master +1. Maintainer makes signed release tag. (E.g: "9.0.1_r37-hb37") ### OTAs ### @@ -164,7 +232,7 @@ the following changes: #### Notes * Release process does not yet include OTA updates or binary hosting. -* Volunteers needed! Join #!os on irc.hashbang.sh/6697 to help. +* Volunteers needed! Join #!mobile on irc.hashbang.sh/6697 to help. ## Questions ## @@ -220,6 +288,8 @@ Lastly, they almost all source binaries from sketchy locations like the infamous "[TheMuppets][tm]" repo which an unknown number of people have push access to. This sort of activity acts as a security SPOF for popular roms. +[tm]: https://github.com/TheMuppets + ### Why should anyone trust this project? Trust, but Verify. While we may be upstanding people today, we might be @@ -232,8 +302,6 @@ maintainers. Maintaining a system that requires zero trust on the maintainers is a core part of our plan to be resistant to Australia-style strongarm backdoor requests. -[tm]: https://github.com/TheMuppets - ## Alternatives ## Giving up Google Play services and stock proprietary applications is a big ask @@ -244,7 +312,7 @@ To address this consider looking at some of the below alternatives for popular applications. Some things won't have alternatives and in those cases you will have to decide -to sideload a specific proprietary APK via Aurora Store or live without that app. +to sideload a specific proprietary APK via Yalp Store or live without that app. You may also find popular travel apps like Kayak, Uber ans Lyft have very usable mobile webapps you can pin to your desktop for a similar experience to a @@ -252,8 +320,8 @@ native app. | App | Alternative(s) | Notes | |:--------:|:---------------------:|:---------------------------------------| -| Chrome | Chromium, OrFox | Chromium is built-in to #!os | -| Play | F-Droid, Aurora Store | F-Droid is built-in to #!oa | +| Chrome | Chromium, OrFox | Chromium is built-in to #!mobile | +| Play | F-Droid, Aurora Store | F-Droid is built-in to #!mobile | | GMail | K9Mail | | | Drive | Nextcloud | | | Music | D-Sub | Will need a Subsonic capable server | @@ -266,3 +334,5 @@ native app. ## Notes ## Use at your own risk. You might be eaten by a grue. + +[aosp-build]: https://github.com/hashbang/aosp-build diff --git a/aosp-build b/aosp-build new file mode 160000 index 0000000..37d3454 --- /dev/null +++ b/aosp-build @@ -0,0 +1 @@ +Subproject commit 37d34542ecb26fc86408cddfa387f34344d64193 diff --git a/config/config.yml b/config/config.yml index 41ff296..62ee281 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,145 +1,110 @@ -version: '10' -name: HashbangOS +version: '11' +name: HashbangMobile type: release variant: user -datetime: 1583772201 +datetime: 1628023022 host: android user: build build_kernel: true platform: + manifest_url: https://github.com/GrapheneOS/platform_manifest.git extra_remotes: - - name: github - fetch: https://github.com - - name: gitlab - fetch: https://gitlab.com + - name: fdroid + fetch: https://gitlab.com/fdroid extra_projects: - - name: fdroid/fdroidclient - groups: device - path: packages/apps/F-Droid - remote: gitlab - revision: refs/tags/1.7 - - name: fdroid/privileged-extension + - name: privileged-extension groups: device path: packages/apps/F-DroidPrivilegedExtension - remote: gitlab + remote: fdroid revision: refs/tags/0.2.11 - - name: hashbang/android-prepare-vendor - groups: device - path: vendor/android-prepare-vendor - remote: github - revision: refs/heads/10.0 - - name: stevesoltys/backup - groups: device - path: packages/apps/Backup - remote: github - revision: refs/heads/develop - - name: GrapheneOS/platform_packages_apps_Updater - groups: device - path: packages/apps/Updater - remote: github - revision: refs/heads/pie - - name: GrapheneOS/platform_external_chromium-webview - groups: pdk - path: external/chromium-webview - remote: github - revision: refs/heads/10 - - name: GrapheneOS/platform_packages_apps_DeskClock - groups: pdk-fs - path: packages/apps/DeskClock - remote: github - revision: refs/heads/10 remove_paths: - - packages/apps/Calendar - - packages/apps/QuickSearchBox - - packages/apps/Browser2 - - platform/prebuilts/qemu-kernel - - platform/developers/samples/android - - platform/developers/demos - device/generic/car + - device/generic/mini-emulator-arm64 + - device/generic/mini-emulator-armv7-a-neon + - device/generic/mini-emulator-x86 + - device/generic/mini-emulator-x86_64 - device/generic/qemu - - device/lenaro/bootloader/arm-trusted-firmware - - device/lenaro/bootloader/edk2 - - device/lenaro/bootloader/OpenPlatformPkg - - device/lenaro/hikey - - device/lenaro/hikey-kernel - - device/lenaro/ - device/google/atv - device/google/contexthub - device/google/crosshatch-kernel - - device/google/wahoo-kernel - - device/google/marlin-kernel - device/google/muskie - - device/generic/mips - - device/google/hikey-kernel - - device/generic/mips64 - - device/generic/mini-emulator-arm64 - - device/generic/mini-emulator-armv7-a-neon - - device/generic/mini-emulator-mips - - device/generic/mini-emulator-mips64 - - device/generic/mini-emulator-x86 - - device/generic/mini-emulator-x86_64 - - device/google/accessory/arduino - - device/google/accessory/demokit + - device/google/wahoo-kernel + - device/lenaro/bootloader/arm-trusted-firmware + - device/linaro/bootloader/OpenPlatformPkg + - device/linaro/bootloader/arm-trusted-firmware + - device/linaro/bootloader/edk2 + - device/linaro/dragonboard + - device/linaro/dragonboard-kernel + - device/linaro/poplar + - device/linaro/poplar-kernel + - platform/developers/demos + - platform/developers/samples/android + - platform/prebuilts/qemu-kernel + - prebuilts/android-emulator remove_groups: - darwin + - beagle_x15 + - mips + - yukawa + + # Needed for m otatools-package: + # - hikey + + - crosshatch + - coral + - taimen + - wahoo + - sunfish patches: - - platform/accept-sdk-licenses.patch - platform/set-packages.patch - - platform/add-chromium.patch - - platform/add-fdroid.patch - - platform/add-updater.patch - - platform/fix-devicenames.patch - - platform/tmp-set-webview.patch - - platform/ignore-allowbackup-false.patch -apps: - chromium: - version: 78.0.3881.2 - src_ref: 0712ce29fd5a1abba8b2a94a84d977251fa7928b - depot_tools_ref: 9185e4495d6d17e1ee27313fffdaaf6ca50060ca devices: bonito: - kernel_name: bluecross - kernel_ref: origin/android-msm-bluecross-4.9-pie-qpr1 - build_id: QQ2A.200305.002 - factory_hash: 418015e0a8841aeaebd98eff8212102c6d9bb8cb7764d34365d72e4be5526d0d - ota_hash: 6b8498f7488ae0ff67809c54a842619ac399801159516b57afb57b4b1f40ab23 - platform_ref: android-10.0.0_r30 + kernel_ref: android-msm-bonito-4.9-android11 + build_id: RQ3A.210805.001.A1 + factory_hash: 4deed5603ff2fcedf9bfe5650cf439b74dd033516d4bb07e02b0125154cb08c7 + ota_hash: 8920cb15c9fb996c22a8d581a2f4f97c0aaf484595d11acd58d015fe27b90d99 + platform_ref: RQ3A.210805.001.A1.2021.08.03.03 + platform_pubkey: daniel.micay.asc sargo: - kernel_name: bluecross - kernel_ref: origin/android-msm-bluecross-4.9-pie-qpr1 - build_id: QQ2A.200305.002 - factory_hash: e03d9a432164579b13e3f015ba501fb785c7a1ac9f76d8cabda2752f498625dd - ota_hash: be77b91cb875061cef95fe8990ce741a500c86a0031a07b84e61a0b037035203 - platform_ref: android-10.0.0_r30 + kernel_ref: android-msm-bonito-4.9-android11 + build_id: RQ3A.210805.001.A1 + factory_hash: 32a5c41f8395857973cad4f6b5a33659b5aee4791f0c9a9f79ce7eb31690624f + ota_hash: ebb9b740bd630191d6193e1a01c4af041e5ddf01325169c197d8bdf194986dda + platform_ref: RQ3A.210805.001.A1.2021.08.03.03 + platform_pubkey: daniel.micay.asc crosshatch: kernel_name: bluecross kernel_ref: origin/android-msm-bluecross-4.9-pie-qpr1 avb_mode: vbmeta_chained - build_id: QQ2A.200305.002 - factory_hash: f08faf04c8d22782546a2db608ff4c6433469c3102b750d8fbfd7ee7f737ebbb - ota_hash: a440277477f646cf6fec9f08e6e224f2a4e345499d5250cfdcd70d8b2d6afab2 - platform_ref: android-10.0.0_r30 + build_id: RQ1A.210205.004 + factory_hash: c9b061a5491bd26e1d8a96326d97651dbf1ad64e5fc0ec4608b64a84c194d285 + ota_hash: 8b7aecf5636758290b42ad577128ce83e106ccfc7053346ca370d6de9a3e12ae + platform_ref: RQ1A.210205.004.2021.02.02.09 + platform_pubkey: daniel.micay.asc blueline: kernel_name: bluecross kernel_ref: origin/android-msm-bluecross-4.9-pie-qpr1 avb_mode: vbmeta_chained - build_id: QQ2A.200305.002 - factory_hash: d781450808addd8c210999bdd2c2fcd91458d07c0b39be185ad114d041247100 - ota_hash: b24267ae4a6ab1000e78cbc6aed451868f7f79a4af6c89de45b497ba86dc6305 - platform_ref: android-10.0.0_r30 + build_id: RQ1A.210205.004 + factory_hash: 3ab98ba8d8e94c16908255a3ed8d75d784a188c0d6aa49f5198cc9d10b887042 + ota_hash: 6715408e433b0040020b38110a7cfbc741efa1c71023880dee6d3e82b94e838a + platform_ref: RQ1A.210205.004.2021.02.02.09 + platform_pubkey: daniel.micay.asc taimen: kernel_name: wahoo kernel_ref: origin/android-msm-wahoo-4.4-pie-qpr2 avb_mode: vbmeta_simple - build_id: QQ2A.200305.002 - factory_hash: 0e3198556031148a94e281768aeec3825f81d2a28be8162716a41ae79c2aea2c - ota_hash: ad1c133174950e54f2d047f6fe7995343f4074930359c41b889a683ec52b5da7 - platform_ref: android-10.0.0_r30 + build_id: RP1A.201005.004.A1 + factory_hash: 2f5c4987a8e1c29bb2843d7f7d36721d52f2eb25a0fe4c74b3590e34a06eb44f + ota_hash: 9de3b96223cf14e8afd69ed9b21b801a15a96990781a7058ac8418ffd78e0dd7 + platform_ref: RQ1A.210205.004.2021.02.02.09 + platform_pubkey: daniel.micay.asc walleye: kernel_name: wahoo kernel_ref: origin/android-msm-wahoo-4.4-pie-qpr2 avb_mode: vbmeta_simple - build_id: QQ2A.200305.002 - factory_hash: e5da4d98ce71af9f6cdb2192fa7f921443769682539b58959f83ccf6f9004b49 - ota_hash: beb950219e29584e7d52aa6bdc286f4387f326cea480fcc68d5c0a7aaa96a019 - platform_ref: android-10.0.0_r30 + build_id: RP1A.201005.004.A1 + factory_hash: 0c23f6cf9e2194a3e72b1288f65c5a7f2f6c020080af49c8a494ee99ab3eb543 + ota_hash: ccd1069bde76fc2ef3414d619ddb5fb840addae955e85d9829df9a7e8d2484a9 + platform_ref: RQ1A.210205.004.2021.02.02.09 + platform_pubkey: daniel.micay.asc diff --git a/config/manifests/bonito/base.xml b/config/manifests/bonito/base.xml index a175a00..2e4def4 100644 --- a/config/manifests/bonito/base.xml +++ b/config/manifests/bonito/base.xml @@ -1,25 +1,742 @@ - - - - - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -28,745 +745,59 @@ - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + \ No newline at end of file diff --git a/config/manifests/bonito/kernel.xml b/config/manifests/bonito/kernel.xml index 8bb257f..eb48f20 100644 --- a/config/manifests/bonito/kernel.xml +++ b/config/manifests/bonito/kernel.xml @@ -1,17 +1,17 @@ - + - - - + + + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/config/manifests/sargo/base.xml b/config/manifests/sargo/base.xml index a175a00..2e4def4 100644 --- a/config/manifests/sargo/base.xml +++ b/config/manifests/sargo/base.xml @@ -1,25 +1,742 @@ - - - - - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -28,745 +745,59 @@ - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + \ No newline at end of file diff --git a/config/manifests/sargo/kernel.xml b/config/manifests/sargo/kernel.xml deleted file mode 100644 index 8bb257f..0000000 --- a/config/manifests/sargo/kernel.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/manifests/sargo/local_manifest.xml b/config/manifests/sargo/local_manifest.xml new file mode 100644 index 0000000..f2ab7c8 --- /dev/null +++ b/config/manifests/sargo/local_manifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/config/openpgp_keys/fdroid.asc b/config/openpgp_keys/fdroid.asc new file mode 120000 index 0000000..86408ab --- /dev/null +++ b/config/openpgp_keys/fdroid.asc @@ -0,0 +1 @@ +hans-christoph.steiner.asc \ No newline at end of file diff --git a/config/openpgp_keys/hans-christoph.steiner.asc b/config/openpgp_keys/hans-christoph.steiner.asc new file mode 100644 index 0000000..42f2eae --- /dev/null +++ b/config/openpgp_keys/hans-christoph.steiner.asc @@ -0,0 +1,290 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFY1RO0BEAC94s679hO9oxi2h1GF0hN7xCXxeIyJp58rA2QxuMJ/NvMhrfBG +VqhkolUb7IqvHy8n7jvTCCAJOHP6ZAtUUwV20ZpUa2Mfp0/6dbGkvXcXwGlU9Shp +BiXnDsKvgRRX5gOO/WeWLe8x8HRcFfcJVXS9pHRw2bxjrbs3zKlf7yBACcSt6ZSg +PsqHuUQSUs4Qo0E0/H14uJiDk32qQ1YicVrE1r2pFe9iZpxBMGTwgZyNUEUYDeVf +TDubL7Jc1MUpgotNTxbJ3jVxt0uHn20lhNXG6ybaYK3MhIHIEp9Nbd4l6+Y81ZgI +Qbs4jAbAPcy+qY3GT2uQfbFb2UK8+hnDotGmejgoYuDZGBaAukiELIKxrsNCvaSg +5DI/yrH6Vx6ZceHpitrer6yOwZescc5SGud3btU4Iktfw7w+5pxmyypUazaltibS +d13o56n/aKrQZw098bhqnh9xTbPVK14t4wTdsJKyZmJv8oKCqppEuhTcq8kur0PW +OM85NSBl0igSfj8/CR8CbzgasMPNQVVwUA0Ody0s8wO13+WVaLq7y6Xpy9t6jSVv +S8KLgmJ/wTJimHb2cctHNBSQEwnJtRyy/o7kKnge6HPzOprjPAlv6okA2XQaLTxy +jW1YCRwNGatNAJ2WnJx3m89WGRONN6qQ3RFX59kbyzR1uL6D3Z6ts7bTmwARAQAB +tCVIYW5zLUNocmlzdG9waCBTdGVpbmVyIDxoYW5zQGVkcy5vcmc+iQI3BBMBCgAh +AhsBBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheABQJWNUcpAAoJEOnijeoAqlVWFs4P +/1wCLFMY2G7twL61nQ7xQAlFDUbS3TeX0GzRXPgNrNeCBHPG9SubP8JEMhdpbKUC +YaWQ277559dbhv0/Gjyfw0X5m4qzAyXPt4biPi6o9H2+PJ+AAEYrNjAjdYPk1JMc +fs87pe9Nhaj56MaolFg8adY31lZQm1+xHmvR5daxbolzlPuurf+pf62uESUGdAwF +cD5rHPQZZ/HF4z2MhvUJK/PNn45kQbOvnSaa81/zvnupMxaLT7Zx1qWIBFlCQKEY +1cCaOgowst+eriVf0oixO70OA1ZsH1gmvnIIk9Qo9eg3nQthmdiUsFIM4ChuiHLZ +6NmYGWxgMiz3N7msxpW4cVIavopEJe2rlRNeE4gPviPidBfvFi1Tv+jUjRGuhXDC +lTjmdmiR03te6EBfrTvbw0VETRQUUQD1ltvCuZXAcUF5Xgbb7ujjNZRikwNro7zZ +sSCqQ0Wi8DAWV8qH0n1wmXV7iH3KwCdjW+tYORNhwj9P8Bp1kOi4V3/5shNVOuAx +RrmSNb2LM2bMkikzDVVJRZBQDpiXbWykK4agyynfwmNGOLh80h7DxgIdyks6AtIe +QeoYsc8A3NQGf8os2Fotg4JwUEpXosXqUM2f1sZQ1xP55gxaPVzj4ZDV/D26/3ni +kVkZ1DT1A43YVWQCVeZ8VZsmGR6ytMI1ZQSmCm7CxtrxiQJ7BBMBCgBlAhsBBQsJ +CAcDBRUKCQgLBRYCAwEAAh4BAheABQJWN2OJQxhodHRwczovL3BncC5taXQuZWR1 +L3Brcy9sb29rdXA/b3A9dmluZGV4JnNlYXJjaD0weEU5RTI4REVBMDBBQTU1NTYA +CgkQ6eKN6gCqVVYZNw//fqsBbq1mErL3/Yd+HCZSmqnZGTN6tcg8ksiE1eYw7OXv +HRpl5ALZ5yn7HnnSXE/t3gMvEI86CQV42Qht9ncYmnOOhju9COQqawkCOqu9Qrgw +fcbSMGBuwf0RfZSqE4INy9mnchKsbg8oOvSdD/DnRG0O+DfjzAV5ffVg6EIIzfTY +SQqgYAVrMs5zMG/d9ZOsyJknSpj4p8hU9glpoLWvkltr5+cYwMZI2hLD/l6Lapf8 +OvF+nfdrfH7ElaF9ixWmZ9zezCx3Dg1nf0bAae+6RNB3omGh/GawXCP5fru4rT3o +OBUmkSi/E4GFTZOqByjcRKD/4GAv0bCvzJJQ4I74RRr2Ite9VbUe4KNbak+zJGez +OTlKD2M2WQry72m54ud/39pyp+C5XHcm0O7gaGGVHDeSQITFU2TjPY33XSTFQLaK +GjHcqF5o9frzLlOa+0lfSZyZaL72bWymSNvlcyxERRreS8O9tuZUhnZ5Ecd1C5bW +Wd6oOLz0boBFNqQnChGcMrQ/6AZIZLwsGnauNqB8VqEOQHL3b9MZ87Mb9PgjCLqd +Jm+fMNMo8PVh4qWTl46ZjQSK0ANXNg9xSq2j1f9kaUVT/hStheCpBxD9faahKHWh +HSKkqih/4qYxCPK/aUcQZ0C/iJMxPDLnHf9maooycOEF0vQ8PpCArCo53N3aUCe0 +JkhhbnMtQ2hyaXN0b3BoIFN0ZWluZXIgPGhhbnNAYXQub3IuYXQ+iQI3BBMBCgAh +AhsBBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheABQJWNUcoAAoJEOnijeoAqlVWPAQQ +ALHrA3gjhboUyRGy5RRDqsqmgivrrsKFNPk1joRIFcCBawt4IRtYnhEneaGUe0Ci +r+aqWGzJ66OPGxQGAaJdmNl2RG1M3X60brEeUzoslDkTr5aaLW91QcRQjV2EIHUj +s5JVKX5x72AoeAlm7DW0bX5pZoDPfAwfHbUJD/dmrju31/q9hXiyB7+ge+sVLn7e +iHTXGQw4j1AlLWW1eNqseMhz7qhsJYbrBQ11bJTS/+ZZ9HPUbA745zVEGOhP6d+3 +7wZv5BCwN4gBhqIdlZ6mlMxPaf+ZhnDLpN+cKta4LGqiMGFgaulGrLLVYVtw7N8T +a2dLKycJORHrZ679QVO1LKtpW2+xlpajluOsxymM7ZdGO/5sXz0tqAYxLCAbDmfK +9boxYvyvnqS/fUoLBEvrENbYOzM08TRRPR7/U64KuPcHQm5JKbd+2psuwvEZKXhE +9aZ+MQA+NeZgsGYSm7W06mAW/pqh1IcICZwSoRM4X9Fp2fRyxQu3mOXXr20YuCLD +D0LrQhThhsvCNMY1bpX7T97lbaNueN8tivJWYXGU+r3Hxsjks76I2lot2KTHYe9s +WfY8kxuUtqF7EHwA67Hc3n03jQNCTzbaM6dOuJH8vmPlsDXgGGy/H+orLoorzXg6 +7LT95f5rD0jSXw99futajMrtxDO5MmyHV20er1RlZHBuiQJ7BBMBCgBlAhsBBQsJ +CAcDBRUKCQgLBRYCAwEAAh4BAheABQJWN2OJQxhodHRwczovL3BncC5taXQuZWR1 +L3Brcy9sb29rdXA/b3A9dmluZGV4JnNlYXJjaD0weEU5RTI4REVBMDBBQTU1NTYA +CgkQ6eKN6gCqVVYImRAAs68NqR7xZrfgbUFPnedvyal4DzPKD40tEcrxJeRHOig6 +B4eMWc5j1guf4zv5yRz9MixLwqfyRCbVl/MToz+ppnd+ciYds7nh5YFdwfmf2CZ/ +IWoCB5C6x3+5fsum8utycnTmn2z+1n6nUjxWjSLxkc9WivKvp92AVNJsXMtxvBN9 +fhNxOJF2pikFR3eSa1fWeW9xbTivxO+IGv6YkbhVfg5ey9hfg1NrUmAyBk6wK2NG +it6QDY2sW+PC4Tlcb1BwJXUFv2GHnOGoP/LdCVMXuNEABqzqnxJ1Ekghi+uiOY1I +eomTl/UCFBnZCGWkuZEqz6IaGtQWjwS86ENu7y1N0+y8MQhQs85Y8cEmy25C51BM +VFuO32FQ4gFaVnsDeNqUDzPpN2KgBzSAUP11fYdob2w5eTvZSJz/Ykdi9hIU2WL0 +OZpufUFbkHFlx/ofw04edWKFpqS+KxG6c/I15ht4fDNtou/A2eRmJ1JAt2h6eIJG +YbV3Scu5hS0Nf/A9rfmuJtm26uzj1Ef57LSUkmtmkob6yzlxmeBm7gyLxhErDsBB +qh7fcycKJRPuVCe3A210+GTT2CqiuoXtpe8/cSjSodiSUgEo2tVL6yS/SP2Hkqqf +/lIU6KWWMZ6vZby7y+gzJcK7uZMwd1NCzICveV3ZXiCo49HOHcGt57zFjn90u1i0 +MkhhbnMtQ2hyaXN0b3BoIFN0ZWluZXIgPGhhbnNAZ3VhcmRpYW5wcm9qZWN0Lmlu +Zm8+iQI6BBMBCgAkAhsBBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAhkBBQJWNUcl +AAoJEOnijeoAqlVWKgAP/0hUOmTJ/RfF+ccm2e3hggN/W8VlwbFaRP4fcwKT754Y +BUT38v4UFhNBkZQTC9ubXBoaMNz40F6p1QzeDI4wBAFXzVvpS/0tx56hphG8og22 +pzTyE/4cx3X4gU8XqPzULvWo4lx2YyMATTRCqE7rEJfX3qE4vYzg1fl8tHIseBFs +IxoLITgfqW1Asx4TUcOGqT0k9/Kp+vg/6STE2cAzB2VVZbWpvT34q9hWsT8dMZsk +1q8mKzYJSxdHssVnN6Bs+BRMujB/7qipcPP8feemCKfVat2X2ysBdph2SBPmlfdR +VwEuQ9y44cJdn7JfGglUsFNfG3oTvBXgc0wCyjzQr+jLGh0uqAOSjooyZ8RcA9/e +oKH/bcZkYjl5qsxYuYIyzPoyqpcmerhiBaxa3lWZixD72RM42MsdYoEU0ZiAdrFh +VR7c7vdd+IF7LmTn5wRwe8Vu9zeePWMdm+vgp2APfXYH3QyJ/CJQ13bI0NFfydCA +2dUgxuCbi6httlRf8xMmUk7+aDH9GncEAw+T0Ggy5ufczu1Nj5s+WwVUpX7UwpUy +ahGKr/jszm45pudiliC3EargBeIfxUlHX9rNEsjvrJIs47BMs6OXLYBZ1GGyF5Oi +EhxmDyg2fpSwqjYODyMMv0UFs0RKlIAwnvHago1pcPKwVsKRkT8SfdrWgJBeLCf5 +iQJ+BBMBCgBoAhsBBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAhkBBQJWN2OFQxho +dHRwczovL3BncC5taXQuZWR1L3Brcy9sb29rdXA/b3A9dmluZGV4JnNlYXJjaD0w +eEU5RTI4REVBMDBBQTU1NTYACgkQ6eKN6gCqVVb8jA//RSrzz3p/g0k+/2bnEpme +kISteG8ZTxviDAfkRdrDrpn/RmnnrMX4nSst1Bn0WgseZKEzxkgQeZs2z81PGonm +pHRAMomXyQlbs//J82Ng4e0ELE85Lktxqka1RP2PHsYA9T6gnvNELScXx6i33sOz +v3ufXf0FJtptnviPSZ/Ap0YXFFplUB+HM4Pe16/LFQYzCPfD7NGlJesMdz6Zlr2g +dUTonrfasoxRPIMf/uSPOo3niX51bb1IrY0J8Lv2N+MNw76V1tRXSUPP4dwsCIRh +jVS5y4ZViAvSz9uUKrDxgGbAEV3NhjAvoleIrQo7566QRlmX2cBZvQJS26r/x2qQ +HlUoTf2wGNmkAN/zGScxclVM3U2UxS/pkMqBEHIvSBZ3GZJostyMGWKJ5ewO8wMd +mfCFWxd6g8HWjo9o0usejqiF/y9SulXMO3qPATJ0oGMmLKShJp7gZvvOBXHb+O8d +kbdOsyrCS2Y9Apz6ZL9ZAFUx9SZrLcRi4hdEWGHaXhzMzEU9alqfSfFXdBKmM9gk +U5wqbR884sEB97ladq07xEa0v+q452k6EyKt/NkpvQjgKIsabJQeF7AIZyCB6Oqs +E0OyKnhEThfARhsf9WNazSDlVWh1ItSbRoL/3x4b5dHRtX+/S6t0cV50U5VuRMFh +hglY3NHG+/alolWhTPFafkbR1FLUUAEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJ +RgABAQAAAQABAAD/2wBDABcQERQRDhcUEhQaGBcbIjklIh8fIkYyNSk5UkhXVVFI +UE5bZoNvW2F8Yk5QcptzfIeLkpSSWG2grJ+OqoOPko3/2wBDARgaGiIeIkMlJUON +XlBejY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2N +jY2NjY3/wAARCAEgAPADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC +AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx +FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT +VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip +qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6 +/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcF +BAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl +8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 +goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU +1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDo6KKWsygoopaA +CiiloAKKKKAFoopGYIuWOB60wHU1nVepxWbda3a2ok3OCVAIUHJNcvqPiG6u2IjP +lR9gOtCVxHYT6pbWzASuBkZBz1qBPEOnMMmcDI7iuClnlmx5jlscDNR5NVygd5J4 +n09GIDs+O6rUD+K7QH5Uc/hXF5OKSjlA7238S6fM+0uUPqw4rSju4ZSAkind0wa8 +wzUkc8sTBkkZSpyCD0o5QPUaWuDs/Et7C48xw69ORW/a+JLad0ViVJ61NgN2ikDA +jIPFLQAUUUtABRRRQAUUUUAFFFFAFelpKWkMKWkpaAClpKWgApaSo550giaRyAAP +WgBZp0hiLucKoya5HVfEslxuitRtTPD96p6xqz3s5AZvKH8J4FZVWkIUsWOWOTSU +UlMQtFFFABRS44zQAOc0wEooooAKUEg5FJRQBt6Xr89sVikbdGcDJ7CulsdYhubr +yQ2SB971Nef1JDPJDJujYqfUVLQz1IEHpS1gaVrMDJHCX+bA3Env9a3gcgH1qQFo +oooAKKKKACiiigCvS0lLSGFLSUtABS0lR3EnlwsfagCpqOpw2UZ8zIPauO1DVZru +Q7WZUP8ADu603Vrp7i6YM3CnAqjn0q0hAck5pMUvPQVKYiq471QWIaSnMpXrSUhB +QKKKYF23hV42Bb8KasMeGZj8oH606127Xz/d65701W/dFGAyD1qSis4AY46U2pZV +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 +Vb1jc6u1Xz1ZrwGS8Q== +=P4Hp +-----END PGP PUBLIC KEY BLOCK----- diff --git a/config/patches/platform/add-updater.patch b/config/patches/platform/add-updater.patch index 0bfeb8e..f9d5b8c 100644 --- a/config/patches/platform/add-updater.patch +++ b/config/patches/platform/add-updater.patch @@ -1,11 +1,31 @@ + project packages/apps/Updater/ diff --git a/packages/apps/Updater/res/values/config.xml b/packages/apps/Updater/res/values/config.xml -index b9fc22f..b36dfeb 100644 +index a32f136..2eaaca0 100644 --- a/packages/apps/Updater/res/values/config.xml +++ b/packages/apps/Updater/res/values/config.xml -@@ -1,4 +1,4 @@ +@@ -1,6 +1,6 @@ - https://releases.grapheneos.org/ + https://releases.mobile.hashbang.sh/ - + stable + 1 + false + +project build/make/ +diff --git a/build/make/target/product/media_system.mk b/build/make/target/product/media_system.mk +index 77b77fef89..6099d88f74 100644 +--- a/build/make/target/product/media_system.mk ++++ b/build/make/target/product/media_system.mk +@@ -37,9 +37,7 @@ PRODUCT_PACKAGES += \ + requestsync \ + StatementService \ + +-ifeq ($(OFFICIAL_BUILD),true) +- PRODUCT_PACKAGES += Updater +-endif ++PRODUCT_PACKAGES += Updater + + PRODUCT_PACKAGES += Seedvault + diff --git a/config/patches/platform/set-packages.patch b/config/patches/platform/set-packages.patch index 12fe3cf..3d28501 100644 --- a/config/patches/platform/set-packages.patch +++ b/config/patches/platform/set-packages.patch @@ -1,31 +1,14 @@ project build/make/ diff --git a/build/make/target/product/handheld_product.mk b/build/make/target/product/handheld_product.mk -index 54dcaf25e..73e1c70aa 100644 +index f504f61874..e997b8be4b 100644 --- a/build/make/target/product/handheld_product.mk +++ b/build/make/target/product/handheld_product.mk -@@ -22,22 +22,23 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/media_product.mk) - - # /product packages - PRODUCT_PACKAGES += \ -- Browser2 \ -- Calendar \ - Camera2 \ +@@ -28,6 +28,7 @@ PRODUCT_PACKAGES += \ Contacts \ DeskClock \ + ExactCalculator \ + F-DroidPrivilegedExtension \ Gallery2 \ LatinIME \ - Launcher3QuickStep \ Music \ - OneTimeInitializer \ - Provision \ -- QuickSearchBox \ - Settings \ - SettingsIntelligence \ - StorageManager \ - SystemUI \ -+ Updater \ - WallpaperCropper \ - frameworks-base-overlays - diff --git a/scripts/build b/scripts/build new file mode 100755 index 0000000..bf30a7e --- /dev/null +++ b/scripts/build @@ -0,0 +1,67 @@ +#!/bin/bash +[ -f /.dockerenv ] || { echo "please run in supplied container"; exit 1; } +set -e; eval "$(environment)" + +device="${DEVICE?}" +base_dir="${BASE_DIR?}" +build_type="${BUILD_TYPE?}" +build_id="${BUILD_ID?}" +build_variant="${BUILD_VARIANT?}" +external_dir="${EXTERNAL_DIR?}" +patch_dir="${PATCH_DIR?}" +build_id="${BUILD_ID?}" +platform_patches="${PLATFORM_PATCHES?}" +public_key_dir="${PUBLIC_KEY_DIR?}" + +function apply_patches(){ + cd "${base_dir}" + local fdroid_org="packages/apps/F-DroidPrivilegedExtension/app/src/main/java/org" + local fdroid_whitelist="${fdroid_org}/fdroid/fdroid/privileged/ClientWhitelist.java" + test -r "${public_key_dir}/platform.x509.pem" || { echo "${public_key_dir}/platform.x509.pem not readable" 1>&2; exit 1; } + local platform_key_hash; platform_key_hash=$( \ + openssl x509 -in "${public_key_dir}/platform.x509.pem" -outform DER \ + | sha256sum | cut -c1-64; \ + ) + echo "Platform Key Hash: ${platform_key_hash}" + if [ -f "${base_dir}/${fdroid_whitelist}" ]; then + echo "patching file ${fdroid_whitelist}" + sed -i \ + "s/[a-f0-9]\\{64\\}/${platform_key_hash}/g" \ + "${base_dir}/${fdroid_whitelist}" + fi + for patch in ${platform_patches//,/ }; do + echo "Applying patch: $patch_dir/${patch}" + patch -p1 --no-backup-if-mismatch < "${patch_dir}/${patch}" + done + cd - +} + +function build_external(){ + local vendor_dist="${external_dir}/vendor/out/${device}/${build_id,,}/vendor" + local vendor_dest="${base_dir}/vendor/" + [ -d "${vendor_dist}" ] || build-vendor + cp -R "${vendor_dist}/." "${vendor_dest}" + build-kernel +} + +function build_platform(){ + cd "$base_dir" + unset BUILD_ID + choosecombo "${build_type}" "${device}" "${build_variant}" + # Not reliable on Android 11?: + # (cd "$base_dir/external/icu/tools" && ./updatecldrdata.py && ./updateicudata.py) + # (cd "$base_dir/external/icu/tools/srcgen" && ./generate_android_icu4j.sh) + clear + if [ "$build_variant" == "user" ]; then + (set -o xtrace; m target-files-package brillo_update_payload otatools-package) + else + (set -o xtrace; m) + fi + cd - +} + +function main(){ + apply_patches + build_external + build_platform +}; main diff --git a/scripts/build-kernel b/scripts/build-kernel new file mode 100755 index 0000000..ea8a8f3 --- /dev/null +++ b/scripts/build-kernel @@ -0,0 +1,36 @@ +#!/bin/bash +[ -f /.dockerenv ] || { echo "please run in supplied container"; exit 1; } +set -e; eval "$(environment)" + +base_dir="${BASE_DIR?}" +device="${DEVICE?}" + +case $device in + sargo|bonito) kernel_repo="crosshatch"; big_brother_device="bonito" ;; + # Pixel 3, Pixel 3 XL, Pixel 3a, Pixel 3a XL: crosshatch + # Pixel 3: blueline + # Pixel 3 XL: crosshatch + # Pixel 3a, Pixel 3a XL: bonito + # Pixel 4, Pixel 4 XL: coral + # Pixel 4a: sunfish + # Pixel 4a 5G, Pixel 5: redbull + # Pixel 4a 5G: redfin + # Pixel 5: bramble +esac + +cd "$base_dir/kernel/google/$kernel_repo" + +if [ -f "done_${device}" ]; then + echo "Kernel for $device was already build. Skipping" + exit 0 +fi + +# Fix submodule support. +mkdir -p "../../../../.repo/project-objects/kernel_google_${kernel_repo}.git/modules" +ln -s "../../../../.repo/project-objects/kernel_google_${kernel_repo}.git/modules" .git 2>/dev/null || : + +git submodule sync +git submodule update --init --recursive +./build.sh "$big_brother_device" + +touch "done_${device}" diff --git a/scripts/flash b/scripts/flash new file mode 100755 index 0000000..46ff38a --- /dev/null +++ b/scripts/flash @@ -0,0 +1,16 @@ +#!/bin/bash +[ -f /.dockerenv ] || { echo "please run in supplied container"; exit 1; } +set -e; eval "$(environment)"; + +cd "$HOME/base" + +device="${DEVICE?}" +build_type="${BUILD_TYPE:-release}" +build_variant="${BUILD_VARIANT:-user}" + +# shellcheck disable=SC1091 +source build/envsetup.sh +choosecombo "${build_type}" "${device}" "${build_variant}" + +fastboot devices +fastboot flashall -w diff --git a/scripts/patch-fdroid-privileged-extension b/scripts/patch-fdroid-privileged-extension new file mode 100755 index 0000000..674954f --- /dev/null +++ b/scripts/patch-fdroid-privileged-extension @@ -0,0 +1,22 @@ +#!/bin/bash +[ -f /.dockerenv ] || { echo "please run in supplied container"; exit 1; } +eval "$(environment)" +set -o nounset -o pipefail -o errexit + +base_dir="${BASE_DIR?}" +key_dir="${KEY_DIR?}" + +cd "${base_dir}" +fdroid_org="packages/apps/F-DroidPrivilegedExtension/app/src/main/java/org" +fdroid_whitelist="${fdroid_org}/fdroid/fdroid/privileged/ClientWhitelist.java" +platform_key_hash=$( \ + openssl x509 -in "${key_dir}/platform.x509.pem" -outform DER \ + | sha256sum | cut -c1-64; \ +) +echo "Platform Key Hash: ${platform_key_hash}" +if [ -f "${base_dir}/${fdroid_whitelist}" ]; then + echo "patching file ${fdroid_whitelist}" + sed -i \ + "s/[a-f0-9]\\{64\\}/${platform_key_hash}/g" \ + "${base_dir}/${fdroid_whitelist}" +fi diff --git a/scripts/release b/scripts/release new file mode 100755 index 0000000..c0985a5 --- /dev/null +++ b/scripts/release @@ -0,0 +1,170 @@ +#!/bin/bash +# shellcheck disable=SC1091,SC1090 +[ -f /.dockerenv ] || { echo "please run in supplied container"; exit 1; } +set -e; eval "$(environment)" + +img_path() { + image=${1?} + path=${2?} + grep -Po \ + "require version-${image}=\\K.+" \ + "${path}/vendor-board-info.txt" \ + | tr '[:upper:]' '[:lower:]' +} + +device="${DEVICE?}" +base_dir="${BASE_DIR?}" +build_number="${BUILD_NUMBER?}" +build_datetime="${BUILD_DATETIME?}" +key_dir="${KEY_DIR?}" +release_dir="${RELEASE_DIR?}" +build_id=${BUILD_ID?} + +prefix="" +target_files="${device}-target_files-${build_number}.zip" +target_out_dir="${base_dir}/out/target/product/${device}" +inter_dir="${target_out_dir}/obj/PACKAGING/target_files_intermediates" +bootloader=$(img_path bootloader "${base_dir}/vendor/google_devices/${device}") +radio=$(img_path baseband "${base_dir}/vendor/google_devices/${device}") + +sudo chown -R "$(id -u)":"$(id -g)" "$HOME/release" + +cd "$base_dir" +mkdir -p "$release_dir" + +echo "Running sign_target_files_apks" +sign_target_files_apks \ + -o \ + -d "$key_dir" \ + --avb_vbmeta_key "${key_dir}/avb.pem" \ + --avb_vbmeta_algorithm SHA256_RSA2048 \ + --avb_system_key "${key_dir}/avb.pem" \ + --avb_system_algorithm SHA256_RSA2048 \ + --extra_apks OsuLogin.apk,ServiceWifiResources.apk="${key_dir}/releasekey" \ + --extra_apks com.android.adbd.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.adbd.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.apex.cts.shim.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.apex.cts.shim.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.appsearch.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.appsearch.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.art.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.art.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.art.debug.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.art.debug.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.cellbroadcast.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.cellbroadcast.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.conscrypt.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.conscrypt.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.extservices.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.extservices.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.i18n.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.i18n.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.ipsec.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.ipsec.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.media.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.media.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.media.swcodec.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.media.swcodec.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.mediaprovider.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.mediaprovider.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.neuralnetworks.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.neuralnetworks.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.os.statsd.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.os.statsd.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.permission.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.permission.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.resolv.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.resolv.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.runtime.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.runtime.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.scheduling.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.scheduling.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.sdkext.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.sdkext.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.tethering.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.tethering.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.tzdata.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.tzdata.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.vndk.current.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.vndk.current.apex="${key_dir}/avb.pem" \ + --extra_apks com.android.wifi.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.android.wifi.apex="${key_dir}/avb.pem" \ + --extra_apks com.google.pixel.camera.hal.apex="${key_dir}/releasekey" \ + --extra_apex_payload_key com.google.pixel.camera.hal.apex="${key_dir}/avb.pem" \ + "${inter_dir}/${prefix}${device}-target_files-${build_number}.zip" \ + "$release_dir/$target_files" + +echo "Running ota_from_target_files" +ota_from_target_files \ + --block \ + -k "${key_dir}/releasekey" \ + "${release_dir}/${target_files}" \ + "${release_dir}/${device}-ota_update-${build_number}.zip" + +echo 'Generating OTA metadata' +generate-metadata \ + "${release_dir}/${device}-ota_update-${build_number}.zip" + +echo "Running img_from_target_files" +img_from_target_files \ + "${release_dir}/${target_files}" \ + "${release_dir}/${device}-img-${build_number}.zip" + +echo "Running generate-factory-images" +cat <<-EOF | bash + cd "$release_dir" + source "${base_dir}/device/common/clear-factory-images-variables.sh" + export BUILD="$build_number" + export DEVICE="$device" + export PRODUCT="$device" + export VERSION="$build_id" + export BOOTLOADER="$bootloader" + export RADIO="$radio" + source "${base_dir}/device/common/generate-factory-images-common.sh" +EOF + +echo "Copy scripts and the avb key into factory zip" +cd "${release_dir}" +factory_zip="$(ls -t "${device}"-"${build_id}"-factory-*.zip | head -1)" +factory_tmp="${device}-${build_id}-factory.zip" +factory_dir="${device}-${build_id}" +unzip "${factory_zip}" +rm "${factory_zip}" +rm "${factory_dir}/flash-all.sh" +rm "${factory_dir}/flash-all.bat" +rm "${factory_dir}/flash-base.sh" + +cat <<-EOF >> "${factory_dir}/flash-all.sh" +if ! [ \$(\$(which fastboot) --version | grep "version" | cut -c18-23 | sed 's/\.//g' ) -ge 2802 ]; then + echo "fastboot too old; please download the latest version at https://developer.android.com/studio/releases/platform-tools.html" + exit 1 +fi + +fastboot flashing unlock +fastboot flash bootloader bootloader-${device}-${bootloader}.img +fastboot reboot-bootloader +sleep 5 +fastboot flash radio radio-${device}-${radio}.img +fastboot reboot-bootloader +sleep 5 +fastboot erase avb_custom_key +fastboot flash avb_custom_key ${device}-avb_pkmd.bin +fastboot reboot-bootloader +sleep 5 +fastboot oem uart disable +fastboot snapshot-update cancel +fastboot -w --skip-reboot update image-${device}-${build_id}.zip +fastboot reboot-bootloader +sleep 5 +fastboot flashing lock +EOF +chmod +x "${factory_dir}/flash-all.sh" + +cp "${key_dir}/avb_pkmd.bin" "${factory_dir}/${device}-avb_pkmd.bin" + +timestamp=$(date -d "@$build_datetime" "+%y%m%d%H%M.%S") +find "${factory_dir}" -exec touch -t "$timestamp" {} + +zip -X -r "${factory_tmp}" "${factory_dir}" +rm -rf "${factory_dir}" +factory_hash="$(sha256sum "${factory_tmp}" | cut -b -8)" +mv "${factory_tmp}" "${device}-${build_id}-factory-${factory_hash}.zip"