JRebel for Android 1.2.14 update

11
JRebel for Android 1.2.14 update (2016/06/11) @kimukou2628

Transcript of JRebel for Android 1.2.14 update

Page 1: JRebel for Android 1.2.14 update

JRebel for Android 1.2.14 update(2016/06/11)

@kimukou2628

Page 2: JRebel for Android 1.2.14 update

JRebel for Androd最新状況 (1)• 1.0.24 (February 17, 2016)• > JRebel for Android no longer needs changes to build.gradle files. Existing

configuration is removed automatically.

• android の gradle plugin として提供するのではなく直接 build.gradle を読み込んで、メモリ上で独自 build.gradle を生成して、同一 JVM で独自パースしてビルドするようになりました• 高速化のためらしい。確かに gradle Daemon が環境によってはある意味ボトルネックな気も• IDE の Message タブに表示されているので、 IDE 上の Plugin で処理しているか、内部鯖上でビルドしたコンソールをリダイレクトしてるか どちらか

• <=そこまでは外見から判断できず。• <= まあ 最近の android gradle plugin って加速度的に Fat になっている気がしますのでしょうが無い。。。

Page 3: JRebel for Android 1.2.14 update

JRebel for Androd最新状況 (2)• 現在最新版 は 1.2.14 (June 8, 2016)

• 2 週間に 1 回、偶数番号のリビジョンの最新版が公開• 挙動的には大分安定してきた気がする

• 内部 gradle ビルドはは scala-runtime/jline 等が同梱されているので Scala製?(jr-android-gradle-bundle.jar)• Android 内部と内部サーバの通信は Retrofit を使用している (jr-android.jar)

• rxjava 等も使われているみたい• 完全 java オンリーというわけではなく ndk も使っている (jr-android-native.zip)

• ただ出来ないこともそれなりにあるのでこれだけで開発するのは無理

Page 4: JRebel for Android 1.2.14 update

JRebel for Androd最新状況 (3)• 従来通りのビルドで確認しないと駄目な処

• widget の登録 /Appindexing / AppLink 等のリンク起動系• =>端末内のショートカットから起動するイメージになるので「 Android Studio から起動してね」スプラッシュがでてそこで止まってしまう

• ただし、 jrebel でビルドした zip は patched.apk と名前が分けられてビルド / 転送されるので、従来の build.apk とは別になるので以前より大分テストはしやすくなった• 従来の apk はいつもどおりassembleDebug で生成、普通に adb -r install で容易に差し替え可能(すごく便利!)

Page 5: JRebel for Android 1.2.14 update

Android Studio 2.2 Preview 3 のお話 (1)

• プロセスアタッチ• Auto/java/native/Hybrid から選択するようになっている (CLion とマージしたから? )• <= なんか実行しようとすると Gradle ビルドが始まって超怖いw(Java 以外の時は必ず gradle build が走ってしまう状態 )• 従来のは、基本 Java のみで選択肢なし(NativeApplication は native の方を自動選択 )

• LayoutEditor• 新規追加された ConstraintLayout あたりはちゃんと表示されるが既存のカスタムレイアウト とか カスタムテーマ とか判定されてしまうのはレイアウトプレビューがかなりの確率で全滅 ( まだ Preview 1 の方がマシだった(AppCompat とかのレイアウト前提なのかな? )

Page 6: JRebel for Android 1.2.14 update

Android Studio 2.2 Preview 3 のお話 (2)• ndk-debug が死にました

• EditConfig でみると nativeAplication が廃止• Application の debugger タブで Auto=>Java,native,hybrid で切り替え(因みにこれ変更しても記憶されないバグ有り )

• プロセスアタッチ• java 以外はまともに動かない。は必ずビルドが走って=>接続失敗する• Hybrid って、 JJUG2016 で話があった下記なのを想定しているのかは気になる・・・

• http://www.slideshare.net/kenjikazumura/python-gdb-java

• ndk のプロセスアタッチが出来ない件は既に issue にあがってるのでそのうち治るのかな?( Preview4 には修正が入るような記載はあるけど。。)• -PlibraryName=XXX を指定しろみたいなエラーが出ていますが。。

Page 7: JRebel for Android 1.2.14 update

gradle warperの話• gradle warper 自体、現在下記が最新

• 3.0 に関しては warper の gradle のバージョンを変更して gradlew tasks 実行時に incompatible と表示されるので後方互換性はないようです• 3.0 ベースになる段階で、また Android Dsl の仕様が大幅に変わる可能性が高そう

2.14-rc-5 OK3.0-milestone-1 NG

Page 8: JRebel for Android 1.2.14 update

最新版の体感編 (良 )• layout.xml => 即時反映を体感できるのは従来通り• java => 上手く転送されているか凄くわかりづらい

• USB を抜き差し /adb の再起動 しないと上手く転送されないことも。。。( これは「高速化された adb 」の不具合のせいなのかな〜 )• JRebel が変更監視はしているんだろうけど変更有り=> adb push => adb の転送がコケた=>再転送候補☆☆辺りの判定が上手く言ってないんではないかな〜と予想される挙動• 通常の使い方だと下記に統一されている動き(デバック実行は、現在のところ一番下のライセンスでも使えるみたい)

ロケットマーク 起動も含めた再実行デバックマーク デバック実行更新マーク 起動している状態のアプリに差分転送

Page 9: JRebel for Android 1.2.14 update

最新版の体感編 (否 )• デバック実行ができるのですが、デバック中にエラーで落ちると adb の切断が切れる

• USB を繋ぎ直すと復帰• これに関しては adb の高速化が歌われ初めててた頃から通常の debug 実行でも同じ現象が出て不安定だったので、そちらのせいかもしれない

• AlertDialog を出した状態で reload をする=> Listner が消えて閉じれなくなる • データを消して再起動させるテストが辛い。

• データ消去をした時点でアプリが終了されるので、IDE からロケットマークで再起動が何気に面倒• 起動させ方がどうも特殊なようだから、現状は JRebel側も対応難しいかも

Page 10: JRebel for Android 1.2.14 update

最新版の体感編 (驚 )• 通常と違う起動の仕方のせいか、実は MultiDex でビルドできない状況でも

• ビルドできて転送できてしまったりする。• インストール&起動のさせ方が違うからかな?

• 最近の MultiDex/InstantRun事情• ADT形式のサポートがされていない

• manifest.src 等の宣言が無視されている• issue には上がっているけど回答はない状態• Manifest の位置 /ManifestMarger 関係に手を入れるのが難しい?下記あたりの宣言があると InstantRun はエラー、 MultiDex は無視される

android.applicationVariants.all { variant -> variant.outputs.each { output -> output.processResources.manifestFile = file("${projectDir}/AndroidManifest.xml") output.processManifest.enabled = false

Page 11: JRebel for Android 1.2.14 update

実行 log から追う挙動的な動き• apk をインストールする時

• アプリを実行する時 ( サービス経由から起動? )

adb get-serialnoadb push ./irof_history/build/jrebel/data/debug/work/patched.apk /data/local/tmp/.jrebel.com.irof.irof_history.apkadb shell pm install -r /data/local/tmp/.jrebel.com.irof.irof_history.apk

adb shell rm /data/local/tmp/.jrebel.com.irof.irof_history.apk

adb shell am start -n com.irof.irof_history/com.zeroturnaround.jrebel.android.boot.jRebelActivity -ez jrebelStart true

adb push /XXXX/jrebel8615508642593902281emptyfile /data/local/tmp/.jrebel.com.irof.irof_history.statusadb shell chmod 0777 /data/local/tmp/.jrebel.com.irof.irof_history.statusadb push /XXXX/jrebel8615508642593902281emptyfile /data/local/tmp/.jrebel.com.irof.irof_history.error.json

adb shell am startservice -e serviceId XXXX -n com.irof.irof_history/com.zeroturnaround.jrebel.android.boot.AgentStatusService --user 0