├── local_manifest
├── prebuilt
│ └── prebuilt.xml
└── opengapps
│ └── opengapps.xml
├── src
├── gpgkeys
│ ├── E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg
│ ├── 47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg
│ ├── 9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg
│ └── 9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg
├── patches
│ └── android_frameworks_base-O.patch
└── docker_entrypoint.sh
├── Dockerfile
└── README.md
/local_manifest/prebuilt/prebuilt.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/local_manifest/opengapps/opengapps.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/gpgkeys/E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg:
--------------------------------------------------------------------------------
1 | -----BEGIN PGP PUBLIC KEY BLOCK-----
2 | Version: GnuPG v2
3 |
4 | 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
50 | zw==
51 | =/ELK
52 | -----END PGP PUBLIC KEY BLOCK-----
53 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:17.10
2 | MAINTAINER Stefan Bossbaly
3 |
4 | ########################################################
5 | # Volumes
6 | ########################################################
7 | ENV SRC_DIR /srv/src
8 | ENV CHROMIUM_DIR /srv/chromium
9 | ENV CCACHE_DIR /srv/ccache
10 | ENV TMP_DIR /srv/tmp
11 | ENV KEYS_DIR /srv/keys
12 | ENV LMANIFEST_DIR /srv/local_manifests
13 | ENV LOGS_DIR /srv/logs
14 | ENV ZIP_DIR /srv/zips
15 |
16 | # By default we want to use CCACHE, you can disable this
17 | # WARNING: disabling this may slow down a lot your builds!
18 | ENV USE_CCACHE 1
19 |
20 | # ccache maximum size. It should be a number followed by an optional suffix: k,
21 | # M, G, T (decimal), Ki, Mi, Gi or Ti (binary). The default suffix is G. Use 0
22 | # for no limit.
23 | ENV CCACHE_SIZE 50G
24 |
25 | # Sign the builds with the keys in $KEYS_DIR
26 | ENV SIGN_BUILDS false
27 |
28 | # When SIGN_BUILDS = true but no keys have been provided, generate a new set with this subject
29 | ENV KEYS_SUBJECT '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
30 |
31 | ########################################################
32 | # User Id
33 | ########################################################
34 | ENV USER "root"
35 | ENV USER_NAME "CopperheadOs Buildbot"
36 | ENV USER_MAIL "copperheados-buildbot@docker.host"
37 |
38 | # Apply the MicroG's signature spoofing patch
39 | # Valid values are "no", "yes" (for the original MicroG's patch) and
40 | # "restricted" (to grant the permission only to the system privileged apps).
41 | #
42 | # The original ("yes") patch allows user apps to gain the ability to spoof
43 | # themselves as other apps, which can be a major security threat. Using the
44 | # restricted patch and embedding the apps that requires it as system privileged
45 | # apps is a much secure option. See the README.md ("Custom mode") for an
46 | # example.
47 | ENV SIGNATURE_SPOOFING "no"
48 |
49 | # Installs the PICO variant of OpenGAPPS
50 | # Valid values are "no", "yes"
51 | ENV OPEN_GAPPS "no"
52 |
53 | ########################################################
54 | # Build Variables
55 | ########################################################
56 | ENV DEVICE "walleye"
57 | ENV BUILD_TAG "OPM2.171019.029.B1.2018.05.15.17"
58 | ENV BUILD_ID "OPM2.171019.029.B1"
59 | ENV CHROMIUM_RELEASE_NAME "66.0.3359.158"
60 | ENV CHROMIUM_RELEASE_CODE "335915852"
61 | ENV NUM_OF_THREADS 8
62 |
63 | ########################################################
64 | # Create Volume entry points
65 | ########################################################
66 | VOLUME $SRC_DIR
67 | VOLUME $CHROMIUM_DIR
68 | VOLUME $CCACHE_DIR
69 | VOLUME $TMP_DIR
70 | VOLUME $KEYS_DIR
71 | VOLUME $LMANIFEST_DIR
72 | VOLUME $LOGS_DIR
73 | VOLUME $ZIP_DIR
74 |
75 | ########################################################
76 | # Copy required files
77 | ########################################################
78 | COPY src/ /root/
79 |
80 | ########################################################
81 | # Create missing directories
82 | ########################################################
83 | RUN mkdir -p $SRC_DIR
84 | RUN mkdir -p $CHROMIUM_DIR
85 | RUN mkdir -p $CCACHE_DIR
86 | RUN mkdir -p $TMP_DIR
87 | RUN mkdir -p $KEYS_DIR
88 | RUN mkdir -p $LMANIFEST_DIR
89 | RUN mkdir -p $LOGS_DIR
90 | RUN mkdir -p $ZIP_DIR
91 |
92 | ########################################################
93 | # Install Dependencies
94 | ########################################################
95 | RUN apt-get -qq update
96 | RUN apt-get -qqy upgrade
97 | RUN apt-get install -y bc bison build-essential ccache cron curl flex \
98 | g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev \
99 | lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev \
100 | libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lsof lzop \
101 | maven openjdk-8-jdk pngcrush procps python rsync schedtool \
102 | squashfs-tools wget xdelta3 xsltproc yasm zip zlib1g-dev cgpt bsdmainutils lzip
103 |
104 | ########################################################
105 | # Add PGP Keys
106 | ########################################################
107 | RUN gpg --import "/root/gpgkeys/9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg"
108 | RUN gpg --import "/root/gpgkeys/9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg"
109 | RUN gpg --import "/root/gpgkeys/47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg"
110 | RUN gpg --import "/root/gpgkeys/E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg"
111 |
112 | ########################################################
113 | # Install Google Tools
114 | ########################################################
115 | RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/local/sbin
116 |
117 | ########################################################
118 | # Set the work directory
119 | ########################################################
120 | WORKDIR $SRC_DIR
121 |
122 | ENTRYPOINT ["/root/docker_entrypoint.sh"]
123 |
--------------------------------------------------------------------------------
/src/gpgkeys/47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg:
--------------------------------------------------------------------------------
1 | -----BEGIN PGP PUBLIC KEY BLOCK-----
2 | Version: GnuPG v1
3 |
4 | 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
86 | xDvqpA==
87 | =V7B8
88 | -----END PGP PUBLIC KEY BLOCK-----
89 |
--------------------------------------------------------------------------------
/src/patches/android_frameworks_base-O.patch:
--------------------------------------------------------------------------------
1 | commit 4e9d677b35b9656c22c922c9abca4107ab95c9b4
2 | Author: Bernhard Rosenkränzer
3 | Date: Tue Aug 29 00:34:27 2017 +0200
4 |
5 | Add permission to allow an APK to fake a signature.
6 |
7 | This is needed by GmsCore (https://microg.org/) to pretend
8 | the existence of the official Play Services to applications calling
9 | Google APIs.
10 |
11 | Forward-ported from https://github.com/microg/android_packages_apps_GmsCore/blob/master/patches/android_frameworks_base-N.patch
12 |
13 | Change-Id: I603fd09200432f7e1bf997072188cdfa6da1594f
14 | Signed-off-by: Bernhard Rosenkränzer
15 |
16 | diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
17 | index 794d4f8b78b..b3189077256 100644
18 | --- a/core/res/AndroidManifest.xml
19 | +++ b/core/res/AndroidManifest.xml
20 | @@ -2075,6 +2075,13 @@
21 | android:description="@string/permdesc_getPackageSize"
22 | android:protectionLevel="normal" />
23 |
24 | +
26 | +
30 | +
31 |
34 | diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
35 | index 3613acf44aa..d1636c862c5 100644
36 | --- a/core/res/res/values/config.xml
37 | +++ b/core/res/res/values/config.xml
38 | @@ -1385,6 +1385,8 @@
39 |
40 |
41 | - com.android.location.fused
42 | +
43 | + - com.google.android.gms
44 |
45 |
46 |
47 | diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
48 | index 3eebe7eb68d..7405386cd49 100644
49 | --- a/core/res/res/values/strings.xml
50 | +++ b/core/res/res/values/strings.xml
51 | @@ -764,6 +764,10 @@
52 |
53 |
54 |
55 | +
56 | + Spoof package signature
57 | +
58 | + Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Legitimate uses include an emulator pretending to be what it emulates. Grant this permission with caution only!
59 |
60 | disable or modify status bar
61 |
62 | diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
63 | index f36b762c5e9..048a057d39c 100644
64 | --- a/services/core/java/com/android/server/pm/PackageManagerService.java
65 | +++ b/services/core/java/com/android/server/pm/PackageManagerService.java
66 | @@ -3571,8 +3571,9 @@ public class PackageManagerService extends IPackageManager.Stub
67 | flags |= MATCH_ANY_USER;
68 | }
69 |
70 | - PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags,
71 | - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
72 | + PackageInfo packageInfo = mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags,
73 | + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId),
74 | + permissions);
75 |
76 | if (packageInfo == null) {
77 | return null;
78 | @@ -3584,6 +3585,24 @@ public class PackageManagerService extends IPackageManager.Stub
79 | return packageInfo;
80 | }
81 |
82 | + private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi,
83 | + Set permissions) {
84 | + try {
85 | + if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE")
86 | + && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1
87 | + && p.mAppMetaData != null) {
88 | + String sig = p.mAppMetaData.getString("fake-signature");
89 | + if (sig != null) {
90 | + pi.signatures = new Signature[] {new Signature(sig)};
91 | + }
92 | + }
93 | + } catch (Throwable t) {
94 | + // We should never die because of any failures, this is system code!
95 | + Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t);
96 | + }
97 | + return pi;
98 | + }
99 | +
100 | @Override
101 | public void checkPackageStartable(String packageName, int userId) {
102 | final int callingUid = Binder.getCallingUid();
103 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CopperheadOS-Docker
2 | Docker container for building CopperheadOS. Still very much a work in progress
3 |
4 | ## Enviroment Variables
5 |
6 | ### `USE_CCACHE`
7 | Enable or disable using `ccache`. Can significantly speed up later builds for both
8 | the CopperheadOS and chromium build processes. All cache files are saved to `CCACHE_DIR`.
9 | Defaults to the value of 1.
10 |
11 | ### `CCACHE_SIZE`
12 | If `USE_CCACHE` is true this variable determines the size of the ccache.
13 | This value should be a number followed by an optional suffix: "k", "M", "G", "T".
14 | The default suffix is G. Use 0 for no limit. Defaults to the value of "50G".
15 |
16 | ### `SIGNATURE_SPOOFING`
17 | If set, privileged apps will be allowed to spoof their signature. This is needed
18 | for packages like Microg or FakeStore to spoof being Google Play Services or the
19 | Google Play Store. Please note that there is a security risk to setting this to
20 | "yes". Defaults to "no".
21 |
22 | ### `OPEN_GAPPS`
23 | If set, the `PICO` [package](https://github.com/opengapps/opengapps/wiki/Package-Comparison) will be included in the system image.
24 | Defaults to "no".
25 |
26 | ### `DEVICE`
27 | The codename of the device the build will be for. Currently supported is all the
28 | Google Pixel devices (sailfish, marlin, walleye, taimen). Defaults to "walleye".
29 |
30 | ### `BUILD_TAG`
31 | The release version of [CopperheadOS](https://github.com/CopperheadOS/android-prepare-vendor/releases).
32 | Defaults to "OPM2.171019.029.B1.2018.05.15.17".
33 |
34 | ### `BUILD_ID`
35 | The Build ID of the build. Defaults to "OPM2.171019.029.B1".
36 |
37 | ### `CHROMIUM_RELEASE_NAME`
38 | The Chromium release name that is going to be built and included in the CopperheadOS
39 | build. Defaults to "66.0.3359.158".
40 |
41 | ### `CHROMIUM_RELEASE_CODE`
42 | The Chromium release code that is going to be built and included in the CopperheadOS
43 | build. Defaults to "335915852".
44 |
45 | ### `NUM_OF_THREADS`
46 | The number of threads/processes that will be used during the various stages of
47 | the build. Defaults to 8.
48 |
49 | ## Volumes
50 |
51 | ### `/srv/src`
52 | Location of where all the repositories will be downloaded and built.
53 |
54 | ### `/srv/chromium`
55 | Location of where the chromium repositories will be downloaded and built.
56 | The chromium prebuilt package is no longer provided and we will now have
57 | to build it from source.
58 |
59 | ### `/srv/ccache`
60 | Location of where the ccache files are saved for both the CopperheadOS build
61 | and the chromium build.
62 |
63 | ### `/srv/keys`
64 | Location of where the release keys are located. If the directory is empty the
65 | script will generate keys for you based on the `DEVICE` provided to the container.
66 |
67 | ### `/srv/tmp`
68 | Location of the temporary directory.
69 |
70 | ### `/srv/local_manifests`
71 | Location of any custom manifests that will be included when syncing repos.
72 |
73 | ### `/srv/logs`
74 | Location of where the stdout and stderr logs will be saved to.
75 |
76 | ### `/srv/zips`
77 | Location of where the output `*.zips` and `*.xz` files will be copied to after the
78 | build process is complete. Will include the target files and packages derived from
79 | the target files (OTA, Flash Archive).
80 |
81 | ## Example Commands
82 |
83 | ### Basic CopperheadOS
84 | If you want just plain CoppperheadOS just provide the enviroment variables.
85 |
86 | ```
87 | $ sudo docker run \
88 | -v /media/hdd/copperheados/src:/srv/src \
89 | -v /media/hdd/copperheados/chromium:/srv/chromium \
90 | -v /media/hdd/copperheados/ccache:/srv/ccache \
91 | -v /media/hdd/copperheados/keys:/srv/keys \
92 | -v /media/hdd/copperheados/tmp:/srv/tmp \
93 | -v /media/hdd/copperheados/logs:/srv/logs \
94 | -v /media/hdd/copperheados/zips:/srv/zips \
95 | -e USE_CCACHE=1 \
96 | -e CCACHE_SIZE="70G" \
97 | -e SIGNATURE_SPOOFING="no" \
98 | -e DEVICE="walleye" \
99 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \
100 | -e BUILD_ID="OPM2.171019.029.B1" \
101 | -e NUM_OF_THREADS=8 \
102 | bflux/copperheados-docker
103 | ```
104 |
105 | ### CopperheadOS with Microg
106 | [Microg](https://microg.org/) is a FOSS implementation of most of the Google
107 | Play Services Libraries. Most importantly it supports GCM and Account
108 | Authentication. Inorder to support microg `SIGNATURE_SPOOFING` patch must be
109 | applied. In addation `CUSTOM_PACKAGES` should include `GmsCore`, `GsfProxy` and
110 | `FakeStore`. `FakeStore` is needed since most apps that rely on Google Play
111 | Services will get upset if they don't see an app with the `com.android.vending`
112 | package id installed on the system.
113 |
114 | ```
115 | $ sudo docker run \
116 | -v /media/hdd/copperheados/src:/srv/src \
117 | -v /media/hdd/copperheados/chromium:/srv/chromium \
118 | -v /media/hdd/copperheados/ccache:/srv/ccache \
119 | -v /media/hdd/copperheados/keys:/srv/keys \
120 | -v /media/hdd/copperheados/tmp:/srv/tmp \
121 | -v /media/hdd/CopperheadOS-Docker/local_manifest/prebuilt:/srv/local_manifests \
122 | -v /media/hdd/copperheados/logs:/srv/logs \
123 | -v /media/hdd/copperheados/zips:/srv/zips \
124 | -e USE_CCACHE=1 \
125 | -e CCACHE_SIZE="70G" \
126 | -e SIGNATURE_SPOOFING="yes" \
127 | -e DEVICE="walleye" \
128 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \
129 | -e BUILD_ID="OPM2.171019.029.B1" \
130 | -e NUM_OF_THREADS=8 \
131 | -e CUSTOM_PACKAGES="GmsCore GsfProxy MozillaNlpBackend NominatimNlpBackend com.google.android.maps FakeStore" \
132 | bflux/copperheados-docker
133 | ```
134 |
135 | ### CopperheadOS with Google Play Services
136 | If you are a complete newb like I am and aren't ready to give up the Google Play
137 | Store and Google Play Services, then simply mount the `local_manifest/opengapps` folder
138 | as the `/srv/local_manifests` volume and set the `OPEN_GAPPS` variable to `yes`.
139 |
140 | ```
141 | $ sudo docker run \
142 | -v /media/hdd/copperheados/src:/srv/src \
143 | -v /media/hdd/copperheados/chromium:/srv/chromium \
144 | -v /media/hdd/copperheados/ccache:/srv/ccache \
145 | -v /media/hdd/copperheados/keys:/srv/keys \
146 | -v /media/hdd/copperheados/tmp:/srv/tmp \
147 | -v /media/hdd/CopperheadOS-Docker/local_manifest/opengapps:/srv/local_manifests \
148 | -v /media/hdd/copperheados/logs:/srv/logs \
149 | -v /media/hdd/copperheados/zips:/srv/zips \
150 | -e USE_CCACHE=1 \
151 | -e CCACHE_SIZE="70G" \
152 | -e SIGNATURE_SPOOFING="no" \
153 | -e OPEN_GAPPS="yes" \
154 | -e DEVICE="walleye" \
155 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \
156 | -e BUILD_ID="OPM2.171019.029.B1" \
157 | -e NUM_OF_THREADS=8 \
158 | bflux/copperheados-docker
159 | ```
160 |
--------------------------------------------------------------------------------
/src/gpgkeys/9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg:
--------------------------------------------------------------------------------
1 | -----BEGIN PGP PUBLIC KEY BLOCK-----
2 |
3 | mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
4 | lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
5 | 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
6 | u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
7 | wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
8 | /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
9 | jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
10 | MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
11 | b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
12 | aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
13 | cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
14 | gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
15 | 2t09Ed+9Bm4gmEOJARoEEAECAAYFAk8rWocACgkQflcKb7vZf3DSMAfw807lt3kB
16 | ETJEqLcN34CtlUmHBokhR0+oAZBETXQJH+jcRsJkB9HHDWXllI7wbaqdmOjZohpD
17 | LtMhHFGDctO+Og5ruF7t5xBLk/RcsW37xgH1BeIDxabKCgtf9K2J2hHzOzszZAHW
18 | 71J4buSuM65NCBBTWqXBfDPuNEDJbaXahK1PUl0wq8N60VVOgS/3AyPT/fG8BQA8
19 | we6RXa3KJxefmr+Kz9nlwT3K0KJnDP2URt6wV/fcKSvLInQZyOKEo469qBQ8R0CV
20 | mjvUlHKBwdZWfcuVHsWc9J2XtAFl+sjTtzWW5cTxz0znAsTvRgjL58NMdvQ7tDQq
21 | aiAAg/TXvh6JARwEEAECAAYFAk3g17sACgkQBtcaJHhTLpK3wAf/UbnQ4BGr0jM/
22 | T99d2L2QJdvgp0tWdBDgtaygoGHg1KkvOXfoxnHwusOnYY7YEQT78+OEQ8aNJ/cC
23 | nQJOYslIdspu0MGR2dfTUmt3kaSIWyqJMx4B0aegdhI9d0k3q8x3fAjUxxgjX7UC
24 | FfGFmEo22F4IIeok0jKo45nApyebYBVh1frKBWFzXfO+RRT0OKN/be9vvnvetz+w
25 | FWl0RO7LJ9Nc0ppnNXwfVza47GdVo/qALf1US1DYrM2wk6VjHtX228Nmr1LKmf+S
26 | z/tV4FViWGq9WlNj6Uh+QAVIf2IjhQuxCTmiug6X8JQTHYtoehFzv8uV92+fdtnD
27 | C7fiw1kYiYkBHAQQAQIABgUCTgdcKwAKCRAIPxjLYonA7x+MCACvs5sp+1l4NZgi
28 | 8dpBp0Gyov3HOrg1OSmCu+39A2WqPRRzthTa1py/XWNVk5bjt8qRWKGCWmqZLXsX
29 | Qn0dkrywm3xgPUsj33wWG7O3nD0lrxoAWY1uhhKDl/u0MbEZxEqxqjV7eZfqQ70u
30 | FXhOPUgwGMO4d+EMTuZVzEsV5jEsff+bZ442d1pFzkVAQoct36UWUkC93Qp5mfPy
31 | JfdIvmxINywqIuEAdwQjDFQD7Xuwv0Oo7GJM8ezEo0BbBtHh3tK2xC8nTmE9sywR
32 | 0j/w1lDUOj57D+oghbriNFgyrlyP9CJCvkF87ztdcVsRlmBg+FKVWfawCblVscfl
33 | mbvSvreBiQEcBBABAgAGBQJOSkydAAoJEDHLT54Lm9cnEJUIAKqdeU9d7w/uAIUh
34 | EJhKUJt8WrkJqimhq2Eu3Vv5US2N3YiqpbmXAv8znovEoc3UV1oqABLchn0qFH/e
35 | rM6dE5+BNAPs1j+NSvPMXVJWPHqtRwfdfyrklj/sPRRpZ/+y9x+q9Qy8v5XT/nOc
36 | bfEHtC7ndttHmIlCu9hUe3imUpEAkq+YDKTKFfFP1hjBCENgALgeOiKgfVCWZPMe
37 | gcSqe/juPMSTpIlfEEE/iMOpCfggJ/oYgU+WL4C4gGPYxApLS1wwV8VSe2SsMkv1
38 | 1L7Z7IJ99wNcarSCVFakKQM5YAkuUw83rcqnGWwJitPJxP1EA/epuvldsgx1ZUoI
39 | XHgxXfqJARwEEAECAAYFAk8sq9wACgkQuGDzbqssiNYG/wf8DZk3FJqnLjZlcGWx
40 | LlSdbEomKWZonBRcSo6BK2mnjmHqgXpjdQsVWPPNECzU+bpRQ1TYzIF/jg3GJTvu
41 | Rms3BzAQkB2zkVBxOiA29Yfl83yXio+gNqFETrquHJC0SdlT2y68GFcJaZDF0seH
42 | /LcfbtkBSuBlrFQJBGryQXznb6V949q23v3OPOMBPQsQC9Zp6wEuDyWJ5FEH9AVu
43 | JSwn1C0Cze7D22MpCpL4uyjQoVfvWcBECPNL6m0FCJjv4vtDkdIgLU2fYxHaQCWE
44 | FOZKui9ubhFGMnV9P38aSWh/BDEbzt6myIdquqF0UxjcgggEzgYJYiDfLpkWV1GW
45 | aDRd8okBHAQQAQIABgUCUjTN2gAKCRAB2Ha/gb70OTU5B/9gZ17Hyj9hW1cYeC8h
46 | pQHmWMkwISg7jRMv2CAhGHkhV6gA5Ih7fiBYECoiT1tbgPy8Tv0dCRbM0J/66mUH
47 | +ayXe6J8avRRFQ58iAUuMJFi61DdA8RWDKqlTuMLHjXfdFvqoLb7hMRmN+wDEzbF
48 | EXqKuixUCvm6VDrghqqJKyTh5IDI79wXp9AZQeQp64qB4KCdbJaA8tqNa+uHDTwR
49 | i8IcJOjGspfLfJR3aJl2+41mYSt+uXHqzrm4d9IPYSXdDadSiZFjlhrSX6qHNgMx
50 | d4yZ5jDBZpIVtwVEfiphZR42kTHBe/8ZECXki/cUW7kOWs7RZXGbtuQxuiFKEl/I
51 | l9WxiQEcBBABAgAGBQJV1seqAAoJEPI2qVPgglpt0KMH+gPX3eg4k3HsPmqtTJe2
52 | mDMdUWBA/wAKSvumqJLA5iqxmlrRIG1kwhvwUDcb2d1sDOUTfZMZA5y70zM4YQs3
53 | XRF6Eq5ilEBXuBPjhZFGjOxq1+8iISUPL+muE3FbqxEiCqIGer19TOGoYqrIhldD
54 | LB+6lvvcLlNBklab0mCLTTlI2HmvyMa9VB5vK1HYuTS6qPX8lVlgBQUwK7qqIyhQ
55 | yRt722mRUuqEoA7teTL3MjotVwsDN+mfLZKYFK3xrP5tLre3IvY1GcUeS+24SXT0
56 | 9MmKQvTGwFeOt87bQ195YMFbndeFn1V250TQsyBz4mRTcW2oCpe5yIzeESN6DBvE
57 | /VGJAhwEEAECAAYFAkxky7QACgkQUY7XLW8Lox6wFw/+N6N4FiuDwhWLAA9YABdK
58 | rOqIWGXzk8d0jtf3kOBTTz/kxyGTusX5ZjWCuWnwARPqLlTFt5sqNiG2H17bFw05
59 | LBu1574SEHIABEgTDAxgSwjjH1Tf1zlCUE7aLKbajaLTeR88XdRA4cq86lcH5jdd
60 | foChpJb4t4FEFGLQ0qAkdLztdkEzNwu0cokz1j0fhNeb/E8I/cIQgZp/AnMIDZ/+
61 | IU5/xJjlKDiBYi98HnDJj8wKJL5fwDrNCODiUoVwl+X2iyzFWhdGfGSpyauzhnqN
62 | jyIHxNroY7EjVkQSWCp+3Z/SKzGEbc94evvHDrG/4xqSjqS6SSJSYgfOxFIzBiym
63 | z4G0ARe59C5JbPr8wwBxtSE9EwRrznnkixwTEV/jf6pjcq8SS5XmTwBKrrqtW9TB
64 | 5I3TCUcFpJCGgPjphiaQt+JJsg1dPMrzWZ+OOiRE1ofDcFI5ZQpq6GNQjM/gGSHL
65 | obfEQVEhvD158Bibtsics24mnG7Xn6jJobhYYFcjJ9iQ5wp8HZBozgZZxIxFaEal
66 | +CP0ZNe1uYUNI+t5p7CGVg8Pm+5xs2X8YrL+7iM6es5RU4zUbv/ZF8dwoGEFxVAX
67 | K/gDYh/wZeHATVBC5RwN76dD4FoO94PtonoDjeGU1XfK7eMwknbHY398Ji3bdNKz
68 | DQDF6+662M6y3XFfl3/NBmKJAhwEEAECAAYFAk7a3IMACgkQyoq6kVk0inourQ/+
69 | MSInmi98PgASnEsSmYtik6XTUFWU0yv9siQ0w0jlBy6t/y4PA48aqpDYScEJRnIt
70 | p8qeSAdkSPxIUbModarKV36Q1r7Xg2veUiZJV9lm6fTfLqKPL8dNldM1NqDSXhB0
71 | lsIFwsfoto0bUpj3f31wACPueW4ihWvt+fW9AZJuaQvVTIMBuUftdUYYw15mAKHO
72 | rpdSOqvMsQmyeVazPNZlp+ss/F6pDhQ3ZlgExxwPg72cYosvZvHR33FSITa+sLJl
73 | zBYNRNqYGp/xPCcKUYgmCR3Mzuu/5kuFcI2NZMiHEL/+ZdUr1YQt88EWTcS11UAP
74 | qr5I6KfGQEQk5jnf2hD5vYYCAFF99NsmnV0FSq3ZQ8eoaA5TmfldoIJ8w/IcknLI
75 | WeR/pWSYXZCeaXKujYMs6RISlQ6mHWUAsuRD8WKboOIUMVUtj3IC5MR06I//ccGy
76 | Q245I16QRMTKR0jST4F56Bg7dIGcg/TtQWxJ2no20Bl3vL3DAYZ9MQVo2JVnK6By
77 | KzE+dV3pIxh4YWXv+/sdPsT7FBT6MELJ19iIlsc1twGFTpyMxKk7UoyylA2qLvMQ
78 | QMwDOieZahpAERAAFsvz9L3tJ0hUu+qtEt62kaUTVbRuyH2d1OOs1RP3QAjKm/ta
79 | 56iQclGM9Hx9eeeCBX7gnpYT/oRvnhMNRRLRZcLRszKJAhwEEAECAAYFAlBDKssA
80 | CgkQdAczx6Yd6jG3qBAAqCyft16p+cq6sohdv9edPvOBxB21xQ6jpPpxq1TQBH+S
81 | KLgnPYyS8SpiLF08WZt7o+S/1dWkNQPhfpHkIx+M7enotQi37d8/AIfXPQk5TyhG
82 | P7Guozvv+cy/YAB8tDFdPSHiPQEUNfB61YB72I1QbdG+f6gX40lwDkS8xExje2h6
83 | Y+hJJNsFa0IJE0nQVl4DMGInvPgBG/b9FlOcR0v1qySwyhYFi6eb8vbl56DUGUXu
84 | R0kj6MsVBj6xoyNYMrdW77ex2IM7c8jV4FksjhFmZUhToQ6gLjAm24qETez50HRn
85 | QTbyXK6/aPhJ+oltEsdXHNQC0YIBTc+/utJtPSd3nhL5M2Gyvrg3IqiHIyvLCKdT
86 | 9rR76LWBC8o3LeMiWv94NiD6+KBh5jiLyV7DrwuU3l82ETvbSNHRBRBQ4hIEnfQC
87 | L/gNIwwAzL+2B3QE3gAQQBnUi/0mR3Q6NsSTwjDZlLlDb/oGNFzPrbxwnoHHBQLe
88 | TENFClLD/zL6DlsaboFnWENnXgUCoLt3YhLxpSUOeqYspZha6Z40TsOW1FHE4c88
89 | 1X8wz9HxCRI437/visxknRzlzUjYBdh2ybx0Kh79DbZMvdctz3ruXyPqWSjkR4V7
90 | TmvRHqxPOGJSq9dI8zzWRdEzLhIbD2iNbwgdU7WLCcgiY4lYk/tbN8sF/127OS25
91 | Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAlQN4mWRhfzDOk/Ros
92 | db0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806UphisyEmmHv6U8gUb/
93 | xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbkC2b1TvVk9PryzmE4
94 | BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMXLWBGWE0znfRrnczI
95 | 5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+OgTg7Cow+8PRaTkJ
96 | EW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/MpK+KMs/s3r6nJrnY
97 | LTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7sKZ8laHRARonte394
98 | hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phbN8bTyOJo856qg4oO
99 | EzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjAvUXRwm/fFKgpsOys
100 | xC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwoG1S8fXgE0Lq3cdDM
101 | /GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQhN0DlsIw8hqJc0WI
102 | SQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0lEXzeoxcdoafxqf6g
103 | ZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
104 | =BjoK
105 | -----END PGP PUBLIC KEY BLOCK-----
106 |
107 |
--------------------------------------------------------------------------------
/src/docker_entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | # Setup global variables
5 | BIG_BROTHER=""
6 | if [[ $DEVICE = "walleye" ]]; then
7 | BIG_BROTHER="muskie"
8 | elif [[ $DEVICE = "sailfish" ]]; then
9 | BIG_BROTHER="marlin"
10 | fi
11 |
12 | NOW=$(date +'%Y-%m-%d-%H:%M:%S')
13 | STDOUT_LOG="${LOGS_DIR}/stdout_${NOW}.log"
14 | STDERR_LOG="${LOGS_DIR}/stderr_${NOW}.log"
15 |
16 | # We only support the pixel devices
17 | if [[ $DEVICE != "sailfish" ]] && [[ $DEVICE != "marlin" ]] && [[ $DEVICE != "walleye" ]] && [[ $DEVICE != "taimen" ]]; then
18 | echo ">> [$(date)] Currently this container only supports building for pixel devices" | tee -a "$STDERR_LOG"
19 | exit 1
20 | fi
21 |
22 | # Initialize Git user information
23 | git config --global user.name $USER_NAME
24 | git config --global user.email $USER_MAIL
25 | git config --global color.ui false
26 |
27 | # (Re)Initialize repo
28 | cd "$SRC_DIR"
29 | repo init -u https://github.com/CopperheadOS/platform_manifest.git -b refs/tags/${BUILD_TAG} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
30 |
31 | # Copy over the local_manifests
32 | mkdir -p "$SRC_DIR/.repo/local_manifests"
33 | rsync -a --delete --include '*.xml' --exclude '*' "$LMANIFEST_DIR/" "$SRC_DIR/.repo/local_manifests/"
34 |
35 | # Clean out any changes
36 | echo ">> [$(date)] Reseting repos" | tee -a "$STDOUT_LOG"
37 | repo forall -c 'git reset --hard ; git clean -fd' > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
38 |
39 | # Sync work dir
40 | repo sync --force-sync -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
41 |
42 | # Verify signatures for all repo tags
43 | echo ">> [$(date)] Verifying tag signatures for all repositories" | tee -a "$STDOUT_LOG"
44 | repo forall -c 'git verify-tag --raw $(git describe)' || { echo ">> [$(date)] Tags could not be verified" | tee -a "$STDERR_LOG"; exit 1; }
45 |
46 | # Ensure we have the correct keys
47 | if [[ $DEVICE = "walleye" ]] || [[ $DEVICE = "taimen" ]]; then
48 | keys=(releasekey platform shared media)
49 | else
50 | keys=(releasekey platform shared media verity)
51 | fi
52 |
53 | # Check to make sure we have the correct keys
54 | if [[ -z "$(ls -A $KEYS_DIR)" ]]; then
55 | echo ">> [$(date)] Generating new keys" | tee -a "$STDOUT_LOG"
56 | for c in "${keys[@]}"; do
57 | echo ">> [$(date)] Generating $c..." | tee -a "$STDOUT_LOG"
58 | "$SRC_DIR/development/tools/make_key" "$KEYS_DIR/$c" "$KEYS_SUBJECT" <<< '' &> /dev/null || true
59 | done
60 | else
61 | echo ">> [$(date)] Ensuring all keys are in $KEYS_DIR" | tee -a "$STDOUT_LOG"
62 | for c in "${keys[@]}"; do
63 | for e in pk8 x509.pem; do
64 | if [[ ! -f $KEYS_DIR/$c.$e ]]; then
65 | echo ">> [$(date)] $KEYS_DIR/$c.$e is missing" | tee -a "$STDERR_LOG"
66 | exit 1
67 | fi
68 | done
69 | done
70 | echo ">> [$(date)] Keys verified" | tee -a "$STDOUT_LOG"
71 | fi
72 |
73 | # Generate avb.pem and avb_pkmd.bin for walleye and taimen
74 | if [[ $DEVICE = "walleye" ]] || [[ $DEVICE = "taimen" ]]; then
75 | if [[ ! -f $KEYS_DIR/avb.pem ]]; then
76 | echo ">> [$(date)] Generating avb.pem..." | tee -a "$STDOUT_LOG"
77 | openssl genrsa -out "$KEYS_DIR/avb.pem" 2048
78 | fi
79 |
80 | if [[ ! -f $KEYS_DIR/avb_pkmd.bin ]]; then
81 | "$SRC_DIR/external/avb/avbtool" extract_public_key --key "$KEYS_DIR/avb.pem" --output "$KEYS_DIR/avb_pkmd.bin"
82 | fi
83 | elif [[ $DEVICE = "sailfish" ]] || [[ $DEVICE = "marlin" ]]; then
84 | make -j${NUM_OF_THREADS} generate_verity_key
85 | "$SRC_DIR/out/host/linux-x86/bin/generate_verity_key" -convert "$KEYS_DIR/verity.x509.pem" "$KEYS_DIR/verity_key"
86 | openssl x509 -outform der -in "$KEYS_DIR/verity.x509.pem" -out "$SRC_DIR/kernel/google/marlin/verity_user.der.x509"
87 | fi
88 |
89 | # Initialize CCache if it will be used
90 | if [[ $USE_CCACHE = 1 ]]; then
91 | "$SRC_DIR/prebuilts/misc/linux-x86/ccache/ccache" -M $CCACHE_SIZE > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
92 | fi
93 |
94 | # Do the inital fetch and setup of the chromium build
95 | if [[ -z "$(ls -A $CHROMIUM_DIR)" ]]; then
96 | echo ">> [$(date)] Doing inital fetch of the chromium project" | tee -a "$STDOUT_LOG"
97 | cd "$CHROMIUM_DIR"
98 | fetch --nohooks android --target_os_only=true > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
99 | "$CHROMIUM_DIR/src/build/linux/sysroot_scripts/install-sysroot.py" --arch=i386 > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
100 | "$CHROMIUM_DIR/src/build/linux/sysroot_scripts/install-sysroot.py" --arch=amd64 > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
101 | fi
102 |
103 | # Sync the chromium build with the latest
104 | echo ">> [$(date)] Reverting and syncing the chromium project" | tee -a "$STDOUT_LOG"
105 | cd "$CHROMIUM_DIR/src"
106 | yes | gclient revert --jobs ${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
107 | yes | gclient sync --with_branch_heads -r ${CHROMIUM_RELEASE_NAME} --jobs ${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
108 |
109 | # Clone or pull latest of the chromium patches
110 | if [[ ! -d $CHROMIUM_DIR/chromium_patches ]]; then
111 | cd "$CHROMIUM_DIR"
112 | git clone https://github.com/CopperheadOS/chromium_patches.git > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
113 | else
114 | cd "$CHROMIUM_DIR/chromium_patches"
115 | git reset --hard > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
116 | git clean -fd > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
117 | git pull > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
118 | fi
119 |
120 | # Apply the patches
121 | echo ">> [$(date)] Applying chromium patches" | tee -a "$STDOUT_LOG"
122 | cd "$CHROMIUM_DIR/src"
123 | git am "$CHROMIUM_DIR"/chromium_patches/*.patch > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
124 |
125 | # Generate build args and build chromium apk
126 | echo ">> [$(date)] Building Chromium" | tee -a "$STDOUT_LOG"
127 | cd "$CHROMIUM_DIR/src"
128 | if [[ $USE_CCACHE = 1 ]]; then
129 | cc_wrapper_arg='cc_wrapper = "/srv/src/prebuilts/misc/linux-x86/ccache/ccache"'
130 | else
131 | cc_wrapper_arg=""
132 | fi
133 | gn gen --args='target_os="android" target_cpu = "arm64" is_debug = false is_official_build = true is_component_build = false symbol_level = 0 ffmpeg_branding = "Chrome" proprietary_codecs = true android_channel = "stable" android_default_version_name = "'${CHROMIUM_RELEASE_NAME}'" android_default_version_code = "'${CHROMIUM_RELEASE_CODE}'" '"${cc_wrapper_arg}" out/Default
134 | ninja -C out/Default/ monochrome_public_apk > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
135 |
136 | # Copy the apk over to the prebuilts and archive directory
137 | cp -f "$CHROMIUM_DIR/src/out/Default/apks/MonochromePublic.apk" "$SRC_DIR/external/chromium/prebuilt/arm64/MonochromePublic.apk"
138 | cp -f "$CHROMIUM_DIR/src/out/Default/apks/MonochromePublic.apk" "$ZIP_DIR/MonochromePublic_${CHROMIUM_RELEASE_NAME}.apk"
139 |
140 | # Select device
141 | cd "$SRC_DIR"
142 | source script/copperhead.sh > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
143 | choosecombo release aosp_${DEVICE} user > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
144 |
145 | # Download and move the vendor specific folder
146 | echo ">> [$(date)] Downloading vendor specific files" | tee -a "$STDOUT_LOG"
147 | cd "$SRC_DIR"
148 | "$SRC_DIR/vendor/android-prepare-vendor/execute-all.sh" -d ${DEVICE} -b ${BUILD_ID} -o "$SRC_DIR/vendor/android-prepare-vendor" > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
149 | mkdir -p "$SRC_DIR/vendor/google_devices"
150 | rm -rf "$SRC_DIR/vendor/google_devices/${DEVICE}"
151 | mv "$SRC_DIR/vendor/android-prepare-vendor/${DEVICE}/$(echo $BUILD_ID | tr '[:upper:]' '[:lower:]')/vendor/google_devices/${DEVICE}" "$SRC_DIR/vendor/google_devices"
152 |
153 | # The smaller variant of the pixels have to move their bigger brother's folder as well
154 | if [[ ! -z $BIG_BROTHER ]]; then
155 | rm -fr "$SRC_DIR/vendor/google_devices/${BIG_BROTHER}"
156 | mv "$SRC_DIR/vendor/android-prepare-vendor/${DEVICE}/$(echo $BUILD_ID | tr '[:upper:]' '[:lower:]')/vendor/google_devices/${BIG_BROTHER}" "$SRC_DIR/vendor/google_devices"
157 | fi
158 |
159 | # TODO find a better way to get rid of the double talkback dep
160 | if [[ -f $SRC_DIR/vendor/opengapps/build/modules/talkback/Android.mk ]]; then
161 | rm -f "$SRC_DIR/vendor/opengapps/build/modules/talkback/Android.mk"
162 | fi
163 |
164 | # OPEN_GAPPS takes priority
165 | if [[ $OPEN_GAPPS = "yes" ]]; then
166 | echo ">> [$(date)] Adding GAPPS into the build" | tee -a "$STDOUT_LOG"
167 | # Special case for walleye (also known as wahoo)
168 | dev_name="$DEVICE"
169 | if [[ $DEVICE = "walleye" ]]; then
170 | dev_name="wahoo"
171 | fi
172 |
173 | # Add GAPPS_VARIANT += pico and call to vendor/opengapps/build/opengapps-packages.mk hook at the end
174 | sed -i "1s;^;GAPPS_VARIANT += pico\n\n;" "$SRC_DIR/device/google/$dev_name/device.mk"
175 | echo '$(call inherit-product, vendor/opengapps/build/opengapps-packages.mk)' >> "$SRC_DIR/device/google/$dev_name/device.mk"
176 |
177 | # PRODUCT_RESTRICT_VENDOR_FILES needs to be false
178 | if [[ ! -z $BIG_BROTHER ]]; then
179 | dev_mk_name=$BIG_BROTHER
180 | else
181 | dev_mk_name=$DEVICE
182 | fi
183 | sed -i 's/PRODUCT_RESTRICT_VENDOR_FILES.*/PRODUCT_RESTRICT_VENDOR_FILES := false/' "$SRC_DIR/device/google/$dev_mk_name/aosp_${DEVICE}.mk"
184 | else
185 | # If needed, apply the microG's signature spoofing patch
186 | if [[ $SIGNATURE_SPOOFING = "yes" ]]; then
187 | echo ">> [$(date)] Applying the restricted signature spoofing patch to frameworks/base" | tee -a "$STDOUT_LOG"
188 | cd "$SRC_DIR/frameworks/base"
189 | sed 's/android:protectionLevel="dangerous"/android:protectionLevel="signature|privileged"/' "/root/patches/android_frameworks_base-O.patch" | patch --quiet -p1
190 | git clean -q -f
191 | fi
192 |
193 | # Add custom packages to be installed
194 | if [[ ! -z $CUSTOM_PACKAGES ]]; then
195 | echo ">> [$(date)] Adding custom packages ($CUSTOM_PACKAGES)" | tee -a "$STDOUT_LOG"
196 | sed -i "1s;^;PRODUCT_PACKAGES += $CUSTOM_PACKAGES\n\n;" "$SRC_DIR/build/target/product/core.mk"
197 | fi
198 | fi
199 |
200 | # Apply FDroid patch
201 | echo ">> [$(date)] Adding releasekey to the FDroid ClientWhitelist" | tee -a "$STDOUT_LOG"
202 | key=$(keytool -list -printcert -file "$KEYS_DIR/releasekey.x509.pem" | grep 'SHA256:' | tr -d ':' | cut -d' ' -f 3)
203 | sed -i -e "s/67760df25e94ae6c955d9e17ca1bc8e195da5d91d5a58023805ab3579463d1b8/${key}/g" "$SRC_DIR/packages/apps/F-Droid/privileged-extension/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java"
204 |
205 | # Build target files
206 | echo ">> [$(date)] Building target files for device" | tee -a "$STDOUT_LOG"
207 | cd "$SRC_DIR"
208 | make target-files-package -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
209 | make brillo_update_payload -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
210 |
211 | # Link key directory
212 | mkdir -p "$SRC_DIR/keys"
213 | ln -sf "$KEYS_DIR" "$SRC_DIR/keys/${DEVICE}"
214 |
215 | # Generate release files from target files
216 | echo ">> [$(date)] Generating release files" | tee -a "$STDOUT_LOG"
217 | script/release.sh ${DEVICE} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2)
218 |
219 | # Move archives files to ZIP_DIR
220 | echo ">> [$(date)] Moving archives to zip directory" | tee -a "$STDOUT_LOG"
221 | cd "$SRC_DIR/out/release-${DEVICE}-${BUILD_NUMBER}"
222 | cp -f *.zip "$ZIP_DIR"
223 | cp -f *.tar.xz "$ZIP_DIR"
224 |
225 | # Build is complete
226 | echo ">> [$(date)] Build is complete. Enjoy!" | tee -a "$STDOUT_LOG"
227 |
--------------------------------------------------------------------------------
/src/gpgkeys/9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg:
--------------------------------------------------------------------------------
1 | -----BEGIN PGP PUBLIC KEY BLOCK-----
2 |
3 | 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
183 | =t/Qn
184 | -----END PGP PUBLIC KEY BLOCK-----
185 |
186 |
--------------------------------------------------------------------------------