Slide 1

Slide 1 text

Building Android and looking into the Android System 5th October, 2022 Kazuki Chigita(@chigichan24) Android “を”ビルドして Android Systemを覗いてみよう

Slide 2

Slide 2 text

Kazuki Chigita (@chigichan24) Android application developer at LINE Corporation DroidKaigi 2020 DroidKaigi 2021 Profile Past talks

Slide 3

Slide 3 text

IceBreak Do you have any experience to build Android System (AOSP)? Building custom Android image as work or private! I know AOSP but no experience to build I heard first time about AOSP

Slide 4

Slide 4 text

IceBreak Do you have any experience to build Android System (AOSP)? Building custom Android image as work or private! I know AOSP but no experience to build I heard first time about AOSP

Slide 5

Slide 5 text

IceBreak Do you have any experience to build Android System (AOSP)? Building custom Android image as work or private! I know AOSP but no experience to build I heard first time about AOSP

Slide 6

Slide 6 text

IceBreak Do you have any experience to build Android System (AOSP)? Building custom Android image as work or private! I know AOSP but no experience to build I heard first time about AOSP

Slide 7

Slide 7 text

The color of navigation bar changes white to black Why will I talk about this topic (background)

Slide 8

Slide 8 text

Why will I talk about this topic (background) In the basic Android app development, often approach as below (in my case) Search in the IDE for suspicious areas. Put a bite on it Modify the code slightly to check the actual behavior Learn the detail implementation background and context…

Slide 9

Slide 9 text

Why will I talk about this topic (background) In the basic Android app development, often approach as below (in my case) Search in the IDE for suspicious areas. Put a bite on it Modify the code slightly to check the actual behavior Learn the detail implementation background and context…

Slide 10

Slide 10 text

Why will I talk about this topic (background) In the basic Android app development, often approach as below (in my case) Search in the IDE for suspicious areas. Put a bite on it Modify the code slightly to check the actual behavior Learn the detail implementation background and context…

Slide 11

Slide 11 text

Why will I talk about this topic (background) In the basic Android app development, often approach as below (in my case) Search in the IDE for suspicious areas. Put a bite on it Modify the code slightly to check the actual behavior Learn the detail implementation background and context… We can approach Android inside system too

Slide 12

Slide 12 text

Table of Contents 1 2 3 What’s AOSP? Build the Android System Deep dive into the Android

Slide 13

Slide 13 text

1. What‘s AOSP?

Slide 14

Slide 14 text

AOSP

Slide 15

Slide 15 text

https://cs.android.com/

Slide 16

Slide 16 text

AOSP

Slide 17

Slide 17 text

More detail… You can get suitable and practical information on these sessions. My Experience creating wearable IoT devices with Android AOSP 16:50-17:15 Online 15:40-16:05 Online Yoshinori Mukai Akira Kimura Day1 Day2 Extreme modification of the Android Framework to enable beamforming using 5-channel microphones

Slide 18

Slide 18 text

2. Build the Android System

Slide 19

Slide 19 text

Step to build Custom Android There’re so many similar/unmanaged documents. We need to compare multiple documents .

Slide 20

Slide 20 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3

Slide 21

Slide 21 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3

Slide 22

Slide 22 text

1. Prepare build environments https://source.android.com/docs/setup/start/requirements As of June 2021, Google is using 72-core machines with 64 GB of RAM internally, which take about 40 minutes for a full build (and just a few minutes for incremental builds, depending on exactly which files were modified). By contrast, a 6-core machine with a similar amount of RAM takes 3 hours. Minimum requirements OS: ubuntu LTS ver / 64bit Storage: 250GiB RAM: 16GiB

Slide 23

Slide 23 text

1. Prepare build environments We cannot build with macOS / windows. Should we buy new high spec ubuntu machines? https://source.android.com/docs/setup/start/requirements OS: ubuntu 20.04 (64bit) Storage: 250GiB CPU: intel 32-core RAM: 128GiB Compose spot VM with this spec on GCP My recommendation

Slide 24

Slide 24 text

1. Prepare build environments We cannot build with macOS / windows. Should we buy new high spec ubuntu machines? https://source.android.com/docs/setup/start/requirements OS: ubuntu 20.04 (64bit) Storage: 250GiB CPU: intel 32-core RAM: 128GiB Compose spot VM with this spec on GCP My recommendation We can build on AWS too but there are some problem on emulation

Slide 25

Slide 25 text

1. Prepare build environments Step1. Prepare VM instance on GCP https://source.android.com/docs/devices/automotive/start/avd/cloud_emulator Nested Visualization allowed disk Spot Instance Needs for AVD working

Slide 26

Slide 26 text

1. Prepare build environments Step1. Prepare VM instance on GCP https://source.android.com/docs/devices/automotive/start/avd/cloud_emulator Nested Visualization allowed disk Spot Instance Needs for AVD working

Slide 27

Slide 27 text

1. Prepare build environments Step1. Prepare VM instance on GCP https://source.android.com/docs/devices/automotive/start/avd/cloud_emulator Nested Visualization allowed disk Spot Instance Needs for AVD working Needs for AVD working We can finish build around 1.5 hour with this pec

Slide 28

Slide 28 text

Spot Instance 1. Prepare build environments Step1. Prepare VM instance on GCP https://source.android.com/docs/devices/automotive/start/avd/cloud_emulator Nested Visualization allowed disk ← Needs for AVD working We can save cost 50-70%

Slide 29

Slide 29 text

1. Prepare build environments Step2. Access via XRDP We can access to instance via GUI with bit setting I recommend to XRDP tunnel through ssh since security reason

Slide 30

Slide 30 text

1. Prepare build environments Step3. Clone AOSP source AOSP source codes are managed by Repo https://gerrit.googlesource.com/git-repo/ https://source.android.com/docs/setup/create/repo https://source.android.com/docs/setup/download/downloading Repo complements Git by simplifying work across multiple repositories.

Slide 31

Slide 31 text

$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++- multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa- dev libxml2-utils xsltproc unzip fontconfig repo $ curl https://storage.googleapis.com/git-repo- downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo $ git config --global user.name John Doe $ git config --global user.email [email protected] $ repo init -u https://android.googlesource.com/platform/manifest $ repo sync -j32

Slide 32

Slide 32 text

$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++- multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa- dev libxml2-utils xsltproc unzip fontconfig repo $ curl https://storage.googleapis.com/git-repo- downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo $ git config --global user.name John Doe $ git config --global user.email [email protected] $ repo init -u https://android.googlesource.com/platform/manifest $ repo sync -j32 Install required libs for building AOSP (2-3 min)

Slide 33

Slide 33 text

$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++- multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa- dev libxml2-utils xsltproc unzip fontconfig repo $ curl https://storage.googleapis.com/git-repo- downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo $ git config --global user.name John Doe $ git config --global user.email [email protected] $ repo init -u https://android.googlesource.com/platform/manifest $ repo sync -j32 Initial setup for repo (few seconds)

Slide 34

Slide 34 text

$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++- multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa- dev libxml2-utils xsltproc unzip fontconfig repo $ curl https://storage.googleapis.com/git-repo- downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo $ git config --global user.name John Doe $ git config --global user.email [email protected] $ repo init -u https://android.googlesource.com/platform/manifest $ repo sync -j32 Clone the AOSP codes (10 min)

Slide 35

Slide 35 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3

Slide 36

Slide 36 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh

Slide 37

Slide 37 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh Set up your environment for building Android devices by running the command

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh Pass the build build target

Slide 40

Slide 40 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh Pass the build build target base source type archite- cture target build variant

Slide 41

Slide 41 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh Pass the build build target base source type archite- cture target build variant Target Product

Slide 42

Slide 42 text

2. Build Build variants

Slide 43

Slide 43 text

$ lunch You're building on Linux Lunch menu .. Here are the common combinations: 1. aosp_arm-eng ... 9. aosp_car_x86-userdebug ... 15. aosp_cf_x86_64_phone-userdebug ... 70. yukawa_sei510-userdebug Which would you like? [aosp_arm-eng] Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng):

Slide 44

Slide 44 text

$ lunch You're building on Linux Lunch menu .. Here are the common combinations: 1. aosp_arm-eng ... 9. aosp_car_x86-userdebug ... 15. aosp_cf_x86_64_phone-userdebug ... 70. yukawa_sei510-userdebug Which would you like? [aosp_arm-eng] Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): We can select Android Auto build image too

Slide 45

Slide 45 text

$ lunch aosp_cf_x86_64_phone-userdebug ============================================ PLATFORM_VERSION_CODENAME=UpsideDownCake PLATFORM_VERSION=UpsideDownCake TARGET_PRODUCT=aosp_cf_x86_64_phone TARGET_BUILD_VARIANT=userdebug TARGET_ARCH=x86_64 TARGET_ARCH_VARIANT=silvermont TARGET_2ND_ARCH=x86 TARGET_2ND_ARCH_VARIANT=silvermont HOST_OS=linux HOST_OS_EXTRA=Linux-5.15.0-1017-gcp-x86_64-Ubuntu-20.04.5-LTS HOST_CROSS_OS=windows BUILD_ID=AOSP.MASTER The platform of current master branch is set as Android 14(U)

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh

Slide 48

Slide 48 text

2. Build Step2. lunch aosp_cf_x86_64_phone-userdebug Step3. m Step1. source build/envsetup.sh https://android.googlesource.com/platform/build/+/refs/heads/master/envsetup.sh It takes 1.5 - 2.0 hour

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3

Slide 51

Slide 51 text

3. Check behavior on emulator 1 2 Goldfish (well-known AVD) Cuttlefish (called as CVD)

Slide 52

Slide 52 text

3. Check behavior on emulator 1 2 Goldfish (well-known AVD) Cuttlefish (called as CVD) My recommendation

Slide 53

Slide 53 text

3. Check behavior on emulator Cuttlefish https://source.android.com/docs/setup/create/cuttlefish Replicate the framework-based behavior of a real device with a focus on high fidelity by maintaining close alignment with the core framework. We can use acloud command support.

Slide 54

Slide 54 text

3. Check behavior on emulator Cuttlefish https://source.android.com/docs/setup/create/cuttlefish Replicate the framework-based behavior of a real device with a focus on high fidelity by maintaining close alignment with the core framework. We can use acloud command support. Almost same with physical device behavior except hardware-specific implementation

Slide 55

Slide 55 text

3. Check behavior on emulator CVD related commands acloud https://android.googlesource.com/platform/tools/acloud/+/refs/heads/master/README.md acloud Simple wrapper command for cvd launch Need to install chrome for launch emulator (It cannot launch with Firefox)

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

Multi-tenancy allows for host machine to launch multiple virtual guest devices with a single launch invocation.

Slide 59

Slide 59 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3

Slide 60

Slide 60 text

Step to build Custom Android Prepare build environment 1 Build AOSP 2 Check behavior on emulator 3 Now we can custamize Android

Slide 61

Slide 61 text

3. Deep dive into the Android

Slide 62

Slide 62 text

The color of navigation bar changes white to black Why will I talk about this topic (background) Reprint slide

Slide 63

Slide 63 text

Search about navigation bar Navigation Bar SystemUI Application Status Bar Power UI Volume UI Battery Meter UI etc… Search Modify Learn

Slide 64

Slide 64 text

Search about navigation bar Navigation Bar SystemUI Application Status Bar Power UI Volume UI Battery Meter UI etc… Search Modify Learn

Slide 65

Slide 65 text

Search about navigation bar Search Modify Learn SystemUI/ ├── src/common/android/systemui/ │ ├── accessibility/ │ ├── ... │ ├── navigationbar/ │ │ ├── buttons/ │ │ ├── gestural/ │ │ ├── NavigationBarHelper.java │ │ ├── NavigationBar.java │ │ ├── ... │ │ └── TaskBarDelegate.java │ ├── ... │ └── wmshell/ ├── res/ └── Android.bp

Slide 66

Slide 66 text

Search about navigation bar SystemUI/ ├── src/common/android/systemui/ │ ├── accessibility/ │ ├── ... │ ├── navigationbar/ │ │ ├── buttons/ │ │ ├── gestural/ │ │ ├── NavigationBarHelper.java │ │ ├── NavigationBar.java │ │ ├── ... │ │ └── TaskBarDelegate.java │ ├── ... │ └── wmshell/ ├── res/ └── Android.bp gestural/ seems related to gesture navigation bar Search Modify Learn

Slide 67

Slide 67 text

Modify navigation bar NavigationHandle.java Search Modify Learn

Slide 68

Slide 68 text

Modify navigation bar NavigationHandle.java replace 2 to 10 makes thick navigation bar? Search Modify Learn

Slide 69

Slide 69 text

Modify navigation bar NavigationHandle.java Search Modify Learn

Slide 70

Slide 70 text

Before After thick navigation bar is appearing navigation bar is translucent

Slide 71

Slide 71 text

Modify navigation bar NavigationHandle.java this is just canvas so we can draw bitmap too Search Modify Learn

Slide 72

Slide 72 text

Modify navigation bar NavigationHandle.java androids.bmp Search Modify Learn

Slide 73

Slide 73 text

kawaii

Slide 74

Slide 74 text

Learn navigation bar bahevior Search Modify Learn

Slide 75

Slide 75 text

Learn navigation bar bahevior The color is generated by intensity Search Modify Learn

Slide 76

Slide 76 text

Learn navigation bar bahevior If the color is difference to current one, update the color Search Modify Learn

Slide 77

Slide 77 text

Learn navigation bar bahevior Search Modify Learn

Slide 78

Slide 78 text

Learn navigation bar bahevior Search Modify Learn

Slide 79

Slide 79 text

Learn navigation bar bahevior This listener receives values of Intensity? Search Modify Learn

Slide 80

Slide 80 text

The color transition is around 1.5-2.0 seconds

Slide 81

Slide 81 text

But how to detect bg change?

Slide 82

Slide 82 text

Learn navigation bar bahevior Change navigation bar when onRegionDarknessChanged called Search Modify Learn

Slide 83

Slide 83 text

Learn navigation bar bahevior !? Search Modify Learn

Slide 84

Slide 84 text

Learn navigation bar bahevior !? Threshold of color change condition is defined here Search Modify Learn

Slide 85

Slide 85 text

Learn navigation bar bahevior Search Modify Learn Notify to navigation bar

Slide 86

Slide 86 text

Learn navigation bar bahevior !? Threshold of color change condition is defined here Search Modify Learn Check diff of current Luma

Slide 87

Slide 87 text

Learn navigation bar bahevior !? Threshold of color change condition is defined here Search Modify Learn Check diff of current Luma How implemented?

Slide 88

Slide 88 text

Learn navigation bar bahevior Search Modify Learn compositionsampling listener.java android_view_Composition SamplingListener.cpp RegionSamplingThread.cpp Bind via JNI

Slide 89

Slide 89 text

Learn navigation bar bahevior Search Modify Learn Calculate luma

Slide 90

Slide 90 text

Learn navigation bar bahevior Search Modify Learn NavigationHandle.java NavigationBar.java LightBarTransitions Controller.java NavigationBar Transitions.java RegionSampling Helper.java

Slide 91

Slide 91 text

Conclusion

Slide 92

Slide 92 text

Conclusion Building AOSP makes us more deeply understanding for the Android System. In the appendix section, I added how resolved pitfall / error. Please refer when you build the AOSP.

Slide 93

Slide 93 text

Thank you If you have any questions / comments, let’s talk on ask the speaker booth.

Slide 94

Slide 94 text

@Licensing The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License. Twemoji. Copyright 2020 Twitter, Inc and other contributors Graphics licensed under CC-BY 4.0: https://creativecommons.org/licenses/by/4.0/

Slide 95

Slide 95 text

Bibliography(1) 1. https://source.android.com/ 2. https://source.android.com/docs/setup/build/downloading 3. https://source.android.com/docs/setup/start 4. https://source.android.com/docs/core/architecture 5. https://source.android.com/docs/setup/start/requirements 6. https://source.android.com/docs/devices/automotive/start/avd/cloud_emulator 7. https://www.youtube.com/watch?v=eaPUdDkE91g 8. https://2net.co.uk/slides/aosp-aaos-meetup/2022-march-cuttlefish.pdf 9. https://cs.android.com/ 10. https://cs.android.com/android/platform/superproject/+/master:frameworks/ba se/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/Navig ationHandle.java;bpv=0;bpt=0 11. https://android-developers.googleblog.com/2017/05/here-comes-treble- modular-base-for.html

Slide 96

Slide 96 text

Bibliography(2) 12. https://android.googlesource.com/platform/tools/acloud/+/refs/heads/master/R EADME.md 13. https://source.android.com/docs/setup/download/downloading 14. https://source.android.com/docs/setup/start/initializing 15. https://source.android.com/docs/setup/build/known-issues 16. https://developer.android.com/studio/run/emulator-acceleration 17. https://source.android.com/docs/setup/create/cuttlefish 18. https://source.android.com/docs/setup/create/cuttlefish-ref-multi-tenancy 19. https://source.android.com/docs/setup/build

Slide 97

Slide 97 text

Appendix Q. How to setup ubuntu-desktop env? A. sudo apt update -y && sudo apt upgrade -y sudo adduser desktop_user sudo gpasswd -a desktop_user sudo sudo apt -y install ubuntu-desktop sudo apt install -y xrdp sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

Slide 98

Slide 98 text

Appendix Q. How to setup xrdp env? A. sudo apt install -y xrdp sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini sudo systemctl restart xrdp sudo systemctl enable xrdp.service sudo systemctl enable xrdp-sesman.service https://qiita.com/osugizmo/items/21578272ae2db05ab001

Slide 99

Slide 99 text

Appendix Q. Can we build on ubuntu on VMWare? A. Yes. But it’s not recommended since we need high spec machine for building AOSP.

Slide 100

Slide 100 text

Appendix Q. Can we build on WSL? A. Yes. I didn’t try in my environment but I found the article that works on WSL2.

Slide 101

Slide 101 text

Appendix Q. Can we build on AWS instance? A. Yes but not recommended. We need to find machine spec that kvm(kernel- based virtual machine) works. It seems only bare metal instance.

Slide 102

Slide 102 text

Appendix Q. Can we build on lower version ubuntu? A. Yes but not recommended. It works fine that only focusing on build. But acloud / Cuttlefish is not work fine on ubuntu 18.04 below(in my case)

Slide 103

Slide 103 text

Appendix Q. repo is not work correctly. A. Please confirm your python version. If your python version is 2.x . It may fail some step.

Slide 104

Slide 104 text

Appendix Q. repo sync is not finish A. Sometimes, it stops 99% by network error. please try below command sysctl -w net.ipv4.tcp_window_scaling=0 https://source.android.com/docs/setup/build/known-issues

Slide 105

Slide 105 text

Appendix Q. I’m not sure kvm works fine. A. You should watch this page. https://developer.android.com/studi o/run/emulator-acceleration#vm- linux

Slide 106

Slide 106 text

Appendix Q. Build is not finish successfully(1) A. Is there enough space? You can check with df -Ph . At least 250GiB needs for build AOSP.

Slide 107

Slide 107 text

Appendix Q. Build is not finish successfully(2) A. Did you finish the pre-install step? We need to some libs for build. If the error message includes about yacc, the install is not finished yet. https://source.android.com/docs/setup/start/initializing

Slide 108

Slide 108 text

Appendix Q. acloud setup is failing A. Please confirm your ubuntu version is 20.04 or later. A. Please check kvm is correctly setup.

Slide 109

Slide 109 text

Appendix Q. acloud instance is not launch A. Please set chrome as default browser. It’s not work on FireFox which is default browser on Ubuntu.