SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Jan 29, 2016
TOYAMA, Yosaku
System Gr.

DeNA Life Science, Inc.
爆速でAndroidアプリを
ビルドするための仕組み
⁃ 氏名: 外山 要作
⁃ 所属: DeNAライフサイエンス システムグループ
⁃ 入社: 2012年5月
• 新規サービスの開発、運用
• Android、iOS
⁃ 好きな言語: Ruby と C#
⁃ 趣味: 競プロ、ショートコーディング
⁃ お酒
自己紹介
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
2
Instant Run など
❌ 爆速でビルドして Android 開発の効率UP
⃝ 爆速でビルドするための仕組みがどうやって成り立っているのか
本日の内容
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
3
⁃ gradle はビルドに時間がかかる
• 上手くやればなんとかできるのでは
• 細々と改良していた
⁃ ところが
• テーマを決めたら → Instant Run !!!
• スライド書いたら → cold swap !!!
経緯
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
4
⁃ 背景
⁃ トライしていた手法
• hot deploy の困難性
• 実現方法
⁃ Instant Run について
• 推測
⁃ まとめ
アジェンダ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
5
ビルド時間を減らすのが大事な理由
⁃ 無駄な時間が減る
⁃ 開発効率の向上
⁃ 小さな単位で結果を確認
背景
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
6
トライしていた手法
7
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
⁃ Java のソースコードを書き換えた結果を手早く確認したい
• ClassLoader をハックできないか
⁃ 上手く行かなかった
• なぜ?
hot deploy の難しさ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
8
DexClassLoader
BaseDexClassLoader#findClass
DexPathList#findClass
DexFile#loadClassBinaryName
DexFile.defineClass
(ここから native)
Dalvik_dalvik_system_DexFile_defineClassNative
dvmDefineClass
findClassNoInit
Android の ClassLoader
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
9
※	
  dalvik	
  VM	
  での話
// ...
clazz = dvmLookupClass(descriptor, loader, true);
if (clazz == NULL) {
// ...
if (!dvmAddClassToHash(clazz)) {
// ...
bool dvmAddClassToHash(ClassObject* clazz)
{
// ...
found = dvmHashTableLookup(
gDvm.loadedClasses,
hash,
clazz,
hashcmpClassByClass,
true
);
// ...
}
どこにキャッシュされるか
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
10
⁃ gDvm はグローバルな変数を保持している
• つまり gDvm.loadedClasses はプロセスとライフサイクルが同じ
アプリのプロセスを再起動すればなんとかなるのでは!
じゃあどうする?
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
11
⁃ コンパイルした class ごとに dex 化
⁃ 起動時に dex からクラスをロード
• cf. Multidex
⁃ 変更された class のみ転送
具体的な方法
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
12
⁃ 転送するファイルの特定方法
• Java のコンパイラの性質
⁃ コンパイラに任せてしまえる
優れている点
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
13
⁃ 通常の gradle そのまま
• クリーン後にビルド+インストール → 26 秒
⁃ cf. daemon=false だと 40 秒
• 変更してビルド + インストール → 4.5 秒
⁃ cf. daemon=false だと 18 秒
⁃ トライしていた手法
• クリーン後にビルド + インストール → 27.5 秒
• 変更してビルド + インストール + 再起動 → 2.5 秒
⁃ Instant Run
• 変更してビルド+インストール → 3 秒 (Activity の再起動なし)
実演
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
14
Instant Run
15
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
⁃ メソッドの実装の変更、クラスの追加削除は hot swap 可能
⁃ それ以外は大体 cold swap
ふむ。
Instant Run の仕様
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
16
⁃ メソッドの実装の変更には対応している
⁃ シグニチャの変更やフィールドの変更に対応していない
⁃ java.lang.reflect.Proxy
• 「動的プロキシのクラスおよびインスタンスを作成するstaticメソッドを提供」
⁃ ふむ。
Proxy っぽい?
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
17
interface Some {
String method_1();
String method_2();
String method_3();
String method_4();
String method_5();
}
このインターフェイスに対して
説明
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
18
class QuadSome implements Some {
public String method_1() {
return String.valueOf(1 * 1);
}
public String method_2() {
return String.valueOf(2 * 2);
}
public String method_3() {
return String.valueOf(3 * 3);
}
public String method_4() {
return String.valueOf(4 * 4);
}
public String method_5() {
return String.valueOf(5 * 5);
}
}
Some instance = new QuadSome();
こういう実装をしたい
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
19
Some instance = (Some) Proxy.newProxyInstance(
Some.class.getClassLoader(),
new Class<?>[]{ Some.class },
(proxy, method, param) -> {
int num = Integer.parseInt(method.getName().substring(7));
return String.valueOf(num * num);
}
);
動的にメソッドの実装ができる。
Proxy を使うことで
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
20
⁃ Proxy は interface に対してでしか使えない
⁃ あるクラスXに対して
• メソッドの実装部分を X_0 として切り出す
• X に対するメソッドの呼び出しは X_0 を参照するようにする
• 変更したメソッドの実装部分を X_1 として切り出す
• X は最新の X_n を参照するようにしておく
もう一工夫
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
class Foo {
public int someField = 123;
public int someMethod() {
return someField + 456;
}
}
模擬コード例
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
22
class Foo_0 {
private Foo proxy;
Foo_0(Foo proxy) {
this.proxy = proxy;
}
public int someMethod() {
return ivar.someField + 456;
}
}
class Foo {
public int someField = 123;
private Class getDelegate() {
// return Foo_0 instance
}
public int someMethod() {
return getDelegate().someMethod();
}
}
こう変換してみる
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
23
public int someMethod() {
return someField + 456;
}
↓↓↓

public int someMethod() {
return someField + 789;
}
メソッドの内容を変更
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
24
class Foo_1 extends Foo {
private Foo proxy;
Foo_1(Foo proxy) {
this.proxy = proxy;
}
public int someMethod() {
return proxy.someField + 789;
}
}
もう一度変換すると
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
25
private Class getDelegate() {
File dex = findLatestDex();
if (dex != loadedDex) {
delegate = loadDex(dex);
loadedDex = dex;
}
return delegate;
}
⁃ Foo_0 と Foo_1 は別クラス扱い
• クラスがキャッシュされる問題を回避できる
委譲先を決める箇所の模擬コード
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
26
※	
  ここまで推測
考え得る hot deploy の実現方法
⁃ Jack and Jill
⁃ デバッグ時は Class Loading の制限を解除
余談
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
27
⁃ トライしていた手法
• 転送するファイルの特定方法がシンプル
• プロセスの再起動が必要
• Instant Runェ…
⁃ Instant Run
• hot swap は Activity の再起動すら不要
• (開発時とリリース時の同一性)
• (オーバーヘッド)
⁃ クラスがキャッシュされる問題さえなければ……
• さらなる改良に期待
まとめ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
28
⁃ Bazel
• http://bazel.io/docs/mobile-install.html
• mobile-install —incremental
⁃ Buck
• https://buckbuild.com/article/exopackage.html
• exopackage
⁃ LayoutCast
• https://github.com/mmin18/LayoutCast
• IntelliJ と eclipse に対応
類似ツール
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
29
Thanks!
30
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

Contenu connexe

Tendances

DeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechconDeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechconDeNA
 
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Recruit Technologies
 
Anyca におけるUIフレームワークと スマホによるドア操作の仕組み
Anyca におけるUIフレームワークとスマホによるドア操作の仕組みAnyca におけるUIフレームワークとスマホによるドア操作の仕組み
Anyca におけるUIフレームワークと スマホによるドア操作の仕組みShuhei Kawasaki
 
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechcon
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechconアバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechcon
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechconDeNA
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術Toru Yamaguchi
 
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みToshiharu Sugiyama
 
DeNAの動画配信サービスを支えるインフラの内部 #denatechcon
DeNAの動画配信サービスを支えるインフラの内部  #denatechconDeNAの動画配信サービスを支えるインフラの内部  #denatechcon
DeNAの動画配信サービスを支えるインフラの内部 #denatechconDeNA
 
セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成Toshiharu Sugiyama
 
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechconサービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechconDeNA
 
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)dena_study
 
マンガボックスのiOS10プッシュ通知導入事例
マンガボックスのiOS10プッシュ通知導入事例マンガボックスのiOS10プッシュ通知導入事例
マンガボックスのiOS10プッシュ通知導入事例Fukaya Akifumi
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechconDeNA
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」虎の穴 開発室
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発虎の穴 開発室
 
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechcon
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechconMobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechcon
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechconDeNA
 
これからの Microservices
これからの Microservicesこれからの Microservices
これからの MicroservicesToru Yamaguchi
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
DeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechconDeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechconDeNA
 
DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方dena_study
 
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016Takahiko Wada
 

Tendances (20)

DeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechconDeNA private cloudのその後 #denatechcon
DeNA private cloudのその後 #denatechcon
 
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
 
Anyca におけるUIフレームワークと スマホによるドア操作の仕組み
Anyca におけるUIフレームワークとスマホによるドア操作の仕組みAnyca におけるUIフレームワークとスマホによるドア操作の仕組み
Anyca におけるUIフレームワークと スマホによるドア操作の仕組み
 
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechcon
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechconアバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechcon
アバター着せ替えアプリ開発におけるフロントエンド技術(Vue.js活用事例) #denatechcon
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術
 
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
 
DeNAの動画配信サービスを支えるインフラの内部 #denatechcon
DeNAの動画配信サービスを支えるインフラの内部  #denatechconDeNAの動画配信サービスを支えるインフラの内部  #denatechcon
DeNAの動画配信サービスを支えるインフラの内部 #denatechcon
 
セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成
 
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechconサービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechcon
 
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
 
マンガボックスのiOS10プッシュ通知導入事例
マンガボックスのiOS10プッシュ通知導入事例マンガボックスのiOS10プッシュ通知導入事例
マンガボックスのiOS10プッシュ通知導入事例
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
 
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechcon
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechconMobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechcon
Mobage/AndAppのSDK開発事例とSDKを作る際に知っておくべきこと #denatechcon
 
これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
DeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechconDeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechcon
 
DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方
 
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016
ボトムアップアプローチでのVRサービス立ち上げ / DeNA TechCon 2016
 

Similaire à 爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon

ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsGo Sueyoshi (a.k.a sue445)
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
iOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるiOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるShunsuke Maeda
 
コードの互換性と進化の両立
コードの互換性と進化の両立コードの互換性と進化の両立
コードの互換性と進化の両立Kohsuke Kawaguchi
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)Drecom Co., Ltd.
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as codeYosuke Hiraishi
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Makoto Haruyama
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceMakoto Haruyama
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版VirtualTech Japan Inc.
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOFVirtualTech Japan Inc.
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすShunsuke Maeda
 
20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会samemoon
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門Toru Miyahara
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)NTT DATA Technology & Innovation
 
Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019MKT-INTHEFOREST
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Akira Kaneda
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み日本Javaユーザーグループ
 

Similaire à 爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon (20)

ドリコムのインフラCI
ドリコムのインフラCIドリコムのインフラCI
ドリコムのインフラCI
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
iOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進めるiOSにおけるコードレビューを一歩先へ進める
iOSにおけるコードレビューを一歩先へ進める
 
コードの互換性と進化の両立
コードの互換性と進化の両立コードの互換性と進化の両立
コードの互換性と進化の両立
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a Service
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らす
 
20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
 

Dernier

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Dernier (8)

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 

爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon

  • 1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Jan 29, 2016 TOYAMA, Yosaku System Gr.
 DeNA Life Science, Inc. 爆速でAndroidアプリを ビルドするための仕組み
  • 2. ⁃ 氏名: 外山 要作 ⁃ 所属: DeNAライフサイエンス システムグループ ⁃ 入社: 2012年5月 • 新規サービスの開発、運用 • Android、iOS ⁃ 好きな言語: Ruby と C# ⁃ 趣味: 競プロ、ショートコーディング ⁃ お酒 自己紹介 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2
  • 3. Instant Run など ❌ 爆速でビルドして Android 開発の効率UP ⃝ 爆速でビルドするための仕組みがどうやって成り立っているのか 本日の内容 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 3
  • 4. ⁃ gradle はビルドに時間がかかる • 上手くやればなんとかできるのでは • 細々と改良していた ⁃ ところが • テーマを決めたら → Instant Run !!! • スライド書いたら → cold swap !!! 経緯 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 4
  • 5. ⁃ 背景 ⁃ トライしていた手法 • hot deploy の困難性 • 実現方法 ⁃ Instant Run について • 推測 ⁃ まとめ アジェンダ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 5
  • 6. ビルド時間を減らすのが大事な理由 ⁃ 無駄な時間が減る ⁃ 開発効率の向上 ⁃ 小さな単位で結果を確認 背景 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 6
  • 7. トライしていた手法 7 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 8. ⁃ Java のソースコードを書き換えた結果を手早く確認したい • ClassLoader をハックできないか ⁃ 上手く行かなかった • なぜ? hot deploy の難しさ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 8
  • 9. DexClassLoader BaseDexClassLoader#findClass DexPathList#findClass DexFile#loadClassBinaryName DexFile.defineClass (ここから native) Dalvik_dalvik_system_DexFile_defineClassNative dvmDefineClass findClassNoInit Android の ClassLoader Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 9 ※  dalvik  VM  での話 // ... clazz = dvmLookupClass(descriptor, loader, true); if (clazz == NULL) { // ... if (!dvmAddClassToHash(clazz)) { // ...
  • 10. bool dvmAddClassToHash(ClassObject* clazz) { // ... found = dvmHashTableLookup( gDvm.loadedClasses, hash, clazz, hashcmpClassByClass, true ); // ... } どこにキャッシュされるか Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 10 ⁃ gDvm はグローバルな変数を保持している • つまり gDvm.loadedClasses はプロセスとライフサイクルが同じ
  • 12. ⁃ コンパイルした class ごとに dex 化 ⁃ 起動時に dex からクラスをロード • cf. Multidex ⁃ 変更された class のみ転送 具体的な方法 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 12
  • 13. ⁃ 転送するファイルの特定方法 • Java のコンパイラの性質 ⁃ コンパイラに任せてしまえる 優れている点 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 13
  • 14. ⁃ 通常の gradle そのまま • クリーン後にビルド+インストール → 26 秒 ⁃ cf. daemon=false だと 40 秒 • 変更してビルド + インストール → 4.5 秒 ⁃ cf. daemon=false だと 18 秒 ⁃ トライしていた手法 • クリーン後にビルド + インストール → 27.5 秒 • 変更してビルド + インストール + 再起動 → 2.5 秒 ⁃ Instant Run • 変更してビルド+インストール → 3 秒 (Activity の再起動なし) 実演 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 14
  • 15. Instant Run 15 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 16. ⁃ メソッドの実装の変更、クラスの追加削除は hot swap 可能 ⁃ それ以外は大体 cold swap ふむ。 Instant Run の仕様 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 16
  • 17. ⁃ メソッドの実装の変更には対応している ⁃ シグニチャの変更やフィールドの変更に対応していない ⁃ java.lang.reflect.Proxy • 「動的プロキシのクラスおよびインスタンスを作成するstaticメソッドを提供」 ⁃ ふむ。 Proxy っぽい? Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 17
  • 18. interface Some { String method_1(); String method_2(); String method_3(); String method_4(); String method_5(); } このインターフェイスに対して 説明 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 18
  • 19. class QuadSome implements Some { public String method_1() { return String.valueOf(1 * 1); } public String method_2() { return String.valueOf(2 * 2); } public String method_3() { return String.valueOf(3 * 3); } public String method_4() { return String.valueOf(4 * 4); } public String method_5() { return String.valueOf(5 * 5); } } Some instance = new QuadSome(); こういう実装をしたい Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 19
  • 20. Some instance = (Some) Proxy.newProxyInstance( Some.class.getClassLoader(), new Class<?>[]{ Some.class }, (proxy, method, param) -> { int num = Integer.parseInt(method.getName().substring(7)); return String.valueOf(num * num); } ); 動的にメソッドの実装ができる。 Proxy を使うことで Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 20
  • 21. ⁃ Proxy は interface に対してでしか使えない ⁃ あるクラスXに対して • メソッドの実装部分を X_0 として切り出す • X に対するメソッドの呼び出しは X_0 を参照するようにする • 変更したメソッドの実装部分を X_1 として切り出す • X は最新の X_n を参照するようにしておく もう一工夫 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 21
  • 22. class Foo { public int someField = 123; public int someMethod() { return someField + 456; } } 模擬コード例 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 22
  • 23. class Foo_0 { private Foo proxy; Foo_0(Foo proxy) { this.proxy = proxy; } public int someMethod() { return ivar.someField + 456; } } class Foo { public int someField = 123; private Class getDelegate() { // return Foo_0 instance } public int someMethod() { return getDelegate().someMethod(); } } こう変換してみる Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 23
  • 24. public int someMethod() { return someField + 456; } ↓↓↓ public int someMethod() { return someField + 789; } メソッドの内容を変更 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 24
  • 25. class Foo_1 extends Foo { private Foo proxy; Foo_1(Foo proxy) { this.proxy = proxy; } public int someMethod() { return proxy.someField + 789; } } もう一度変換すると Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 25
  • 26. private Class getDelegate() { File dex = findLatestDex(); if (dex != loadedDex) { delegate = loadDex(dex); loadedDex = dex; } return delegate; } ⁃ Foo_0 と Foo_1 は別クラス扱い • クラスがキャッシュされる問題を回避できる 委譲先を決める箇所の模擬コード Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 26 ※  ここまで推測
  • 27. 考え得る hot deploy の実現方法 ⁃ Jack and Jill ⁃ デバッグ時は Class Loading の制限を解除 余談 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 27
  • 28. ⁃ トライしていた手法 • 転送するファイルの特定方法がシンプル • プロセスの再起動が必要 • Instant Runェ… ⁃ Instant Run • hot swap は Activity の再起動すら不要 • (開発時とリリース時の同一性) • (オーバーヘッド) ⁃ クラスがキャッシュされる問題さえなければ…… • さらなる改良に期待 まとめ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 28
  • 29. ⁃ Bazel • http://bazel.io/docs/mobile-install.html • mobile-install —incremental ⁃ Buck • https://buckbuild.com/article/exopackage.html • exopackage ⁃ LayoutCast • https://github.com/mmin18/LayoutCast • IntelliJ と eclipse に対応 類似ツール Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 29
  • 30. Thanks! 30 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.