【李晶】Android遇上Docker

智如冬

2017/12/31 发布于 技术 分类

2017年,droidcon 第2次来到中国,并将于2017年11月在北京盛大开幕。参会人群包括业界领袖、技术大咖、技术开发者、大众创业者及领域从业者。大会将邀请来自Google、微软、Facebook、Ebay、Intel、Telenav、阿里巴巴、腾讯、小米、乐视、联想等国内外安卓技术与应用领域的大咖,沿袭历年国际大会特色,聚焦行业最前沿技术,碰撞切磋技术火花。

文字内容
1. droidconBeijing Android Meets Docker 李李晶
2. droidconBeijing
3. droidconBeijing
4. droidconBeijing ⻛风靡欧洲超过70个城市
5. droidconBeijing ⼀一个程序员的故事
6. droidconBeijing Pain in the Admin 当配置很多台机器器的时候…
7. droidconBeijing 容器器化 VS 虚拟化
8. droidconBeijing 为什什么选择容器器? 资源隔离 ⽀支持的系统 启动 / 停⽌止时间 ⼤大⼩小 Docker 低 Linux 秒级 MB Vagrant ⾼高 * 分级 GB
9. droidconBeijing 把安卓容器器化… Infer - Facebook出品的静态分析⼯工具, 可⽤用于Java, Obj-C, C… 在容器器⾥里里升级Android SDK AUFS不不⽀支持移动硬链接的操作
10. droidconBeijing 容器器⼊入⻔门 ‣ image vs container ‣ build vs pull ‣ 恭喜你⼊入⻔门了了 ??????
11. droidconBeijing Dockerfile 词典 ‣ FROM - ⽗父镜像 ‣ RUN - 在⼀一个新层⾥里里执⾏行行命令 ‣ ENV - 设置环境变量量 ‣ ADD - 将⽂文件拷⻉贝到镜像 ‣ EXPOSE - 监听指定的⽹网络端⼝口 ‣ CMD - 容器器默认的启动执⾏行行⽅方法
12. droidconBeijing Dockerfile FROM ubuntu:16.04 # support multiarch: i386 architecture # install Java # install essential tools # install Qt RUN dpkg --add-architecture i386 && \ apt-get update -y && \ apt-get install -y libncurses5:i386 libc6:i386 libstdc++6:i386 lib32gcc1 lib32ncurses5 lib32z1 zlib1g:i386 && \ apt-get install -y --no-install-recommends openjdk-8-jdk && \ apt-get install -y git wget zip && \ apt-get install -y qt5-default
13. droidconBeijing Dockerfile # download and install Gradle ENV GRADLE_VERSION 4.2.1 RUN cd /opt && \ wget -q https://services.gradle.org/distributions/gradle-$ {GRADLE_VERSION}-bin.zip && \ unzip gradle*.zip && \ ls -d */ sed 's/\/*$//g' xargs -I{} mv {} gradle && \ rm gradle*.zip # download and install Kotlin compiler ENV KOTLIN_VERSION 1.1.51 RUN cd /opt && \ wget -q https://github.com/JetBrains/kotlin/releases/download/v$ {KOTLIN_VERSION}/kotlin-compiler-${KOTLIN_VERSION}.zip && \ unzip *kotlin*.zip && \ rm *kotlin*.zip
14. droidconBeijing Dockerfile # download and install Android SDK ENV ANDROID_SDK_VERSION 3859397 RUN mkdir -p /opt/android-sdk && cd /opt/android-sdk && \ wget -q https://dl.google.com/android/repository/sdk-tools-linux-$ {ANDROID_SDK_VERSION}.zip && \ unzip *tools*linux*.zip && \ rm *tools*linux*.zip # set the environment variables ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 ENV GRADLE_HOME /opt/gradle ENV KOTLIN_HOME /opt/kotlinc ENV ANDROID_HOME /opt/android-sdk ENV PATH ${PATH}:${GRADLE_HOME}/bin:${KOTLIN_HOME}/bin:${ANDROID_HOME}/tools:$ {ANDROID_HOME}/platform-tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/emulator ENV _JAVA_OPTIONS -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap # WORKAROUND: for issue https://issuetracker.google.com/issues/37137213 ENV LD_LIBRARY_PATH ${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib
15. droidconBeijing Dockerfile # accept the license agreements of the SDK components ADD license_accepter.sh /opt/ RUN /opt/license_accepter.sh $ANDROID_HOME # install and configure SSH server ADD banner.net /etc/ ADD authorized_keys /tmp/ EXPOSE 22 RUN apt-get update -y && \ apt-get install -y openssh-server supervisor locales && \ ... ADD supervisord.conf /etc/supervisor/conf.d/ CMD ["/usr/bin/supervisord"]
16. droidconBeijing Dockerfile 最佳实践 ‣ 单⼀一职责原则 ⽤用 compose 来编排多个服务 ‣ 最⼩小化层数 层 = 过渡层镜像,⽀支持缓存 ‣ ⼤大⼩小很重要, ⽤用好现有资源 在不不同的步骤(层)安装和卸载程序会增加镜像⼤大⼩小 ‣ 可读性
17. droidconBeijing 在容器器中升级 Android SDK 的解决⽅方案 将 Android SDK 卷挂载到容器器上 ‣ 最⼩小化 ‣ 柔性化 ‣ 数据持久化 ‣ 共享
18. droidconBeijing 不不同的解决⽅方案 ‣ 挂载 Android SDK 卷 ‣ ⽤用 BTRFS 储存驱动 ‣ 为每个 Android API 等级创建⼀一个不不同的镜像
19. droidconBeijing NFS ⽹网络⽂文件系统 ✓ 单⼀一地⽅方管理理 ? 性能 ⾠不不能并⾏行行写 / 修改
20. droidconBeijing 基准测试
21. droidconBeijing 性能⽐比较 2 构建类型, 107 单元测试 ( x2 = 214 ), 2 ⾃自动化界⾯面测试 ./gradlew clean check :demo:connectedAndroidTest 本地部署容器器 (缓存的 AndroidSDK) 第三⽅方 CI ⽅方案 (没有优化) 6 分 48.0 秒 > 10 分
22. droidconBeijing 安卓设备 ‣ ARM 模拟器器 ‣ x86 模拟器器 (需要 KVM) ‣ USB (需要特权模式, ⛔macOS) ‣ WIFI ‣ Genymotion 云
23. droidconBeijing ??????性能 2 UI ⾃自动化测试 ARM 模拟器器 @?????? 2 分 4.615 秒 x86 模拟器器 @?????? (运⾏行行于 Linux) 23.497 秒 Genymotion 25.335 秒
24. droidconBeijing Out of Memory 内存溢出
25. droidconBeijing 内存很重要!!! JVM 很傻,很天真,它不不懂容器器 (以前的版本) _JAVA_OPTIONS -XX: +UnlockExperimentalVMOptions -XX: +UseCGroupMemoryLimitForHeap 退出代码 137 = 128 + 9 = SIGKILL = Killed 1 = SIGHUP = Hangup 说明 被内核的 OOM 杀⼿手⼲干掉了了 JVM 结束了了该程序并退出
26. droidconBeijing SSH ‣ 设置环境变量量 /root/.ssh/environment ‣ 授权 /root/.ssh/authorized_keys
27. droidconBeijing Jenkins 环境变量量 ‣ 全局 Global Configure System -> Global properties -> Environment variables ‣ 节点 Node Manage Nodes -> Configure Node -> Node Properties -> Environment variables ‣ 任务 Job Configure Job -> Build -> Build Step -> Execute shell Plugin: Environment Injector -> Inject variables to the build process / as a build step
28. droidconBeijing 还能做得更更好些吗? Gradle 包分发
29. droidconBeijing Gradle 包分发镜像服务器器 ‣ 定义于 gradle/wrapper/gradle-wrapper.properties ‣ 安装到 ~/.gradle/wrapper/dists ‣ SSL 证书 - 需要被 Java keystore 信任 ‣ /etc/hosts
30. droidconBeijing 做到极致了了吗? Gradle 缓存 ‣ 不不要把时间浪费在下载上 ‣ ~/.gradle/caches/
31. droidconBeijing 披露露与机器器有关的问题 ‣ 字符编码问题 expected:<Hall[]chen> but was:<Hall[ö]chen> ‣ 硬编码的时区 expected: 2099-12-31T00:00:00.0000+0200 but was : 2099-12-31T00:00:00.0000+0000 ‣ ⽂文件及路路径 File#listFiles() -> File[] (sort order depends on OS)
32. droidconBeijing 其它移动开发⽅方⾯面的应⽤用 ‣ 集成测试 ‣ ⽣生产 / 测试服务器器 ‣ 不不稳定的⽹网络 ‣ 复杂的设置/部署 ‣ 容器器化 ‣ 轻轻松松搭环境 ‣ Serverless ⽆无服务器器架构 (Kotlin, Swift) ‣ 重复利利⽤用??????代码 ‣ 移动⼯工程师也能写后台 / 前端了了!
33. droidconBeijing 求贤若渴 ?????? 办公室遍布全欧洲:汉堡,柏林林,巴塞罗那… ?????? 帮你搞定签证,安家落户 ✈ ?????? ‣ Android 开发⼯工程师 ‣ iOS 开发⼯工程师 ‣ 后端 / 前端 / ⼤大数据 / * ⼯工程师 https://de.mytaxi.com/jobs
34. 谢谢! ! thyrlian " thyrlian Docker Image https://github.com/ thyrlian/AndroidSDK droidconBeijing