build不具合対処ネタ(WearApp Project編)
はじめに
すごくくだらない暗黙仕様?な話で 一日ビルド出来なかったので備忘録としてメモ
今回もLibraryProject周りの不具合
動作環境
備忘的なメモ
support v4 library の minsdk14化の境目
- 24.1.X ・・minsdk4
- 24.2.X ・・minsdk9
- 26.0.X ・・minsdk14
因みに support-library-24.2.X になるまで、
Android 5.0以上で MenuItemCompat.getActionView でnullを返すというバグが有り
google play services の minsdk14化の境目
- 10.0.X ・・minsdk9
- 10.2.X ・・minsdk14
ndk バージョンによる minsdk14化の境目
- r14 ・・minsdk9
- r15 ・・minsdk14
NDK r15で api-14未満のサポートが打ち切られたのか。たしかにmake_standalone_toolchain.py --arch arm --api 9 とやっても 14がminimumだってエラーになるな。Realmでもどうするかそろそろ考えないといけない時期かも
— zaki50 (@zaki50) 2017年6月25日
tools:overrideLibrary
local.aar/jarの差し替え時
android studio 2.3.1
— close_yutori (@kimukou2628) 2017年4月21日
うーん。local.jar/local.aarを差し替えたとき
gradlew cleanBuildCache clean
してからGradle Sync
するの必須?
強行してSyncするとdeamon複数立ち上がって誤動作しよる
ココらへんベテランの方の呟きとかでは見たこと無いんだけど、暗黙知?
gradle最近はじめました系 の呟きでは何度か見たこと有るんですけどね・・(汗
サードパーティライブラリの境目
license_dialog
- DialogFragment使うよりベタな方が使いやすい場合が多い。
- 1.8.1 まで minsdk 8
- 1.8.2 から minsdk14 になる *3
compile 'de.psdev.licensesdialog:licensesdialog:1.8.1'
leakcanary
- 1.5 まで minsdk 8
- 1.5.1から minsdk14 *4
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
PermissionDispacher
- 2.3.2 までは minsdk 9
- 2.4.0から minsdk14
compile("com.github.hotchemi:permissionsdispatcher:2.3.2") { // if you don't use android.app.Fragment you can exclude support for them exclude module: "support-v13" } annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:2.3.2"
状況的な話
- BlankActivity
- wearApp
のProjectをウイザード経由で作成して、共通ライブラリ(aar)を追加して
下記の構成を作った時、ビルドできなかったという話
- MainP
- apply plugin: ‘com.android.application’
- WearP
- apply plugin: ‘com.android.application’
LibP
- G様推奨形式 (import local.aar)
LibP/build.gradle
configurations.maybeCreate("default") artifacts.add("default", file('nend-sdk-3.2.2.aar'))
G様推奨方法でlibraryProjectをimportしている状態
この状態で
build/intermediates/exploded-aar/LibP.aar not found
とエラーが出てビルドができない状態。StackOverFlowでも回答がついていない状態。
でも gradle plugin 2.2 だとビルドが出来るような状況
- rebuild
- => OK
- run するときのbuild
- => NG
という状況ですごく混乱した><
Wiz経由で作成時に直した所
MainP
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.nihon_tc.fittest"> <uses-feature android:name="android.hardware.type.watch" android:required="false" tools:ignore="InvalidWearFeatureAttribute"/>
- ビルド時に、
- android.hardware.type.watch が必須
- ManifestMargerにより minsdk22だよ(WearApp側がminsdk22)
とか言われて target-19の端末にインストールできず。記述したら可能になった。
これ初心者に作らせると、いきなりminsdk22のアプリを作らせることになるわけで敷居高くないか?
LibP
MapsActivity
@TargetApi(22) public class MainActivity
エラー赤字になっていたので
ココらへんってテンプレート不正なのかな?
で何が悪かったのか?
LibPを通常のmaven形式のように展開しようとしてエラーになる
AS 2.3からは Library Project は展開場所が違うようなんですが、この場合の考慮漏れっぽい*5
- MultiProjectで
- 複数のapplicationが有るプロジェクト
では駄目みたい。
で紹介されていた
でもNG。
どちらかというと対応漏れ?に近い感じなんだろうか?
通る形式★
- MainP
- apply plugin: ‘com.android.application’
- LibP
- G様推奨形式
Android-Studio-Sample-Projects 等のgithubプロジェクトを簡単に開く方法
現在 dryrunが動かなくなっているので、studioコマンドで対応するのが良いらしいです
studioコマンドに関する追記(2017/04/26)
- これpythonスクリプト(実行権限付き)
- winだとこれどう生成するんだろう?
- Welcome画面 や 既にASが立ち上がっている状態じゃないと起動に失敗する
- port接続するような動き * local.propeties 等を作成しないので、他のプロジェクトから要コピー
- ないsdkを自動DLしてくる機能は動かないので *6
- targetsdk 等は、既にあるものを指定
でどう解決するのか?
- MainP/build.gradle
apply plugin: 'com.android.application' repositories{ flatDir{ dirs 'libs_aar' } } dependencies { compile(name:'nend-sdk-3.2.2', ext:'aar') }
としてLibPを使わない。全部maven形式っぽい記述に合わせる*7
結論として
apply plugin: ‘com.android.application’ が複数あるプロジェクトは
- library Projectの扱いが旧版のまま
- Android-Studio-Sample-Projects もmultiDexError がでてビルドできない状況
- Wiz経由の1プロジェクトではビルド可能なので、全プロジェクトの関数参照がくっついてしまっている挙動
これみてると、あいかわらず雑い対応で、これを正式版としてだされてもな〜(汗 とは思う
- wear Project って流行らせる気が有るんだろうか??
とか正直思ってしまうのは気のせい?
InstantApp対応とかが、wear形式で出てきた場合は注意が必要かもしれない*8
TLメモ
最近は予定が立たなくて平日勉強会は基本的に行けてないなーとかいう感じ(汗
休日も寝落ちしていることも多々ありますし・・・
Databinding
DataBindingホント素晴らしくてむせび泣いている あと半年早く使っていればもっと生産性の高いコードを生み出せたのに!
— Fumihiko Shiroyama (@fushiroyama) 2017年4月19日
NavigationViewでapp:menu="@{vm.flag ? @menu/foo : @menu/bar}"ってやってみたらさすがにこれはダメだった
— Fumihiko Shiroyama (@fushiroyama) 2017年4月19日
けどダメならダメでBindingAdapterを定義したら何とでもなるしホントネ申
BindingAdapterでNavigationViewとmenuResIdを引数に取ってnavigationView.getMenu().clear(); navigationView.inflateMenu(menuResId); とでも書いときゃ何とでもなるしマジチョロイ
— Fumihiko Shiroyama (@fushiroyama) 2017年4月19日
ホントですね〜!そのあたりも静的なバインディングは出来てるのでプラグインが充実していくのも時間の問題なんですかね!楽しみ。
— Fumihiko Shiroyama (@fushiroyama) 2017年4月20日
WebP
webp、弊社わりとツライ思いいっぱいしてる(デコード出来ない端末がある)んですが、全然平気なんです…? #ca_apk
— Fumihiko Shiroyama (@fushiroyama) 2017年4月20日
AS2.3からWebPに一括変換できるの知らなかった! #ca_apk
— むーむー (@muumuumuumuu) 2017年4月20日
webpでサイズ1/5かー。やってみよう #ca_apk
— kobakei (@kobakei122) 2017年4月20日
WebPは透過対応していないが、Android Studioが透過情報が入っているファイルはエラーを出してスキップしてくれる #ca_apk
— takahirom (@new_runnable) 2017年4月20日
onSaveInstanceState
DaggerのComponentをonRetainCustomNonConfigurationInstanceで受け渡す。なるほど。Componentのライフサイクルは(当たり前だが)生成破棄に一致するのでこのようなスコープ(ライフサイクル)を定義するのは有りだ #ca_apk
— Fumihiko Shiroyama (@fushiroyama) 2017年4月20日
画面回転の再生成時にBundleではなく、onRetainCustomNonConfigurationInstance()を使うことが出来る。これはParcelableは必要ない。 これにDaggerのComponentを渡す #ca_apk
— takahirom (@new_runnable) 2017年4月20日
先ほど発表したスライドになります。
— ogaclejapan (@ogaclejapan) 2017年4月20日
ありがとうございました🙇 #ca_apk https://t.co/e5iuwGTzao
うーん。Bundleってそもそも1MB制限とか有じゃなかったでしたっけ?(Activity間のIntentのBundle渡し然り)
— close_yutori (@kimukou2628) 2017年4月20日
で、a技術の本によるとApplication領域のメモリ上にもっている話だったから、largeHeap=“true”指定ぐらい
ですね〜。くっつくandroid.jarの挙動が変わってるんだと思います。
— close_yutori (@kimukou2628) 2017年4月20日
OS6あたりからPraceableの復元時のエラー(ClassLoader上にClassが見つからない)とかいうの出てたり<でも何故か使える
ココらへんドキュメントレスなんだよな(汗
*1:従ってsupport-v4は実体側Prjを指定しなければいけないので実質overrideは無理?
*2:通る形式★では問題なく使えるが・・・
*3:support library依存による
*4:これもsupport library依存による
*5:これもAS2.3からのInstantRun
*6:この機能AS 2.3.3 以降になったらどうも動かなくなってるみたいですね・・。うーん。2.3.2までは動いていたのに・・・
*7:G様社内だと、全部社内maven使っていて、G様推奨対応も特別対応に近い形式なのでテストしていないっぽい
*8:まあ個人開発者向けに公開されるかわからないので老婆心かもしれないけど<汗