- 投稿日:2020-02-12T14:15:07+09:00
AndroidStudioでプロキシの設定を解除しても反映されないときの対処法
目次
- 概要
- 環境
- 解決方法
- 原因
- まとめ
1. 概要
一度プロキシ設定を行った後に、File->setting->System Setting->HTTP Proxyから
No proxy
を選択してもプロキシ経由でアクセスしてしまい、解決に時間が掛かったので解決方法を残しておきます。2. 環境
- AndroidStudio 3.5.1
3. 解決方法
gradle.properties(Grobal Properties)の記述を削除したら,非プロキシ環境下でも動作しました。
上の4行を削除4. 原因
AndroidStudioの
setting
でプロキシの設定を行うと、自動でgradle.properties
にプロキシの設定が追加されます。しかし、No Proxy
を設定してもその記述は削除されないため、概要にある問題が発生しました。5. まとめ
いろいろ書きましたが、
gradle.properties
の4行を削除すれば解決しました。
実際は削除よりコメント化の方がいいかと。解決しなければgit周りの設定に問題があるかも
- 投稿日:2020-02-12T13:42:23+09:00
libtensorflow_inference r1.15 を Android 向けにビルドするメモ
背景
- C/C++ で, 既存 r1.x 系の Tensorflow(C binding) 推論アプリを Android でも動かしたい
- 速度はそんなに問わないし, そもそも tflite では動かないモデルがある
- Java レイヤーは使わない
tensorflow + Android で検索するとだいたい tflite がヒットしてしまいますが, ここでは本来の(?)libtensorflow を Android 向けにビルドしてみます.
モバイルでは tflite 推奨で, libtensorflow のモバイル向けビルドは非推奨となっています.
とはいえ, そもそも tflite では動かないケースが多いので(特に RNN とか使っていたりする音声系), 頑張って libtensorflow を動かしてみます.libtensorflow on Android では, CPU のみの対応になります.
現状 C++ API のみのようです. また, 使える C++ API には制約があります
(C API は根本からビルドを変えないといけないことが分かりましたので, 現状無理(or Bazel ファイルを頑張って解析&改修する必要がある))TensorFlow は r2.x が出ていますが, ここでは r1.15 を使います.
ビルド方法(Bazel)
TensorFlow の
./configure
で, Android WORKSPACE の作成を yes にしておきます.今回は ndk r21, Android API level 26, Android SDK tool 29 あたりを使いました.
(2020 年 02 月 12 日での概ね最新)を参考にビルドします.
bazel build --config=monolithic --cpu=arm64-v8a \ --compilation_mode=opt --cxxopt=-std=c++11 \ --crosstool_top=//external:android/crosstool \ --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \ //tensorflow/core:android_tensorflow_lib \ //tensorflow/tools/android/inference_interface:libtensorflow_inference.so \ //tensorflow/examples/android:libtensorflow_demo.so \ //tensorflow/tools/benchmark:benchmark_modelという感じで .so までビルドできるはずです. ビルドには, Threadripper 1950X で 10 分ほど時間かかります. libtensorflow_inference.so まででよくて, 最後のほうは動作確認用などとしてお好みで.
C++ std は, tf のバージョンによって変わります. v1.15.2 では c++11 でした. v2 では c++14 でした.
benchmark_model
までビルドしている場合,benchmark_model
を/data/local/tmp
などに adb push して走らせて動くかどう確認しましょうhttps://github.com/tensorflow/tensorflow/tree/r1.15/tensorflow/tools/benchmark
自前アプリに組み込む
TensorFlow C++(libtensorflow_cc.so) で推論アプリを CMake でビルドする(r1.8 対象)
https://qiita.com/syoyo/items/c102611ff63a6bbadc80を参考に, ヘッダファイルへパスを通し(eigen, protobuf, absl は bazel のビルドディレクトリにあるものへパスを通す), libtensorflow_inference.so と,
bazel-genfiles/external/com_google_protobuf
あたりにあるlibprotobuf.pic.a
,libprotobuf_lite.pic.a
をリンクすればいけるはずです!(libprotobuf と libprotobuf_lite の関係性は不明だが, 両方をリンクしないとうまくいかない).
もし, 他にリンク時にシンボルが見つからないエラーがでるようであれば,
Linux で, 複数 .a, .so のどこに C++ シンボルが定義されているか調べる
https://qiita.com/syoyo/items/cac44f37832b5f0e2bacや, bazel のビルドログ表示(
--subcommands
or-s
)でどのライブラリとリンクすればいいのかチェックしてみましょう.NDK のバージョンは, libtensorflow_inference をビルドしたときのものと合わせておきましょう
(そうでないと, 特に protobuf 周りでエラーが出る)C API ?
Android プロジェクトであればあまり ABI などでのリンクエラーは出ないと思うので, TF の呼び出しを C++ で書いてもいいと思いますが, Windows での TF アプリとコードを一緒にしたい(Windows では C API でないといろいろリンクエラーなど出てめんどいため)などで, C API を使いたいときもあります.
Android の
libtensorflow_inference.so
用 Bazel BUILD ファイルでは, C API のライブラリは含まれていませんでした.自前で
tensorflow/c
にある c_api.cc あたりのファイルをアプリに取り込んでビルドする必要がありそうですが, 現状足りないシンボルエラーが出てきてうまくいきません.libtensorflow_inference.so を作る時点で, 足りない(private になっている?) ソースコードを追加しないとダメそうです. いろいろ調べるのがめんどいので, 現状は C++ API で頑張りましょう.
TODO
- C API interface の .so を作る.
- Makefile ベースのビルドを試す(
tensorflow/contrib/makefile
)- TensorFlow r2.x で試す
- java バインディング含んだ prebuilt .so が C++ アプリにそのままつかえるか試す(ヘッダファイルを .so の tf version と合わせればいけそう)
- 相変わらず bazel + protobuf 周りでエラー出たりで tensorflow 辛すぎるので, はやく libtorch mobile に移行して幸せになりたい
- 投稿日:2020-02-12T13:42:23+09:00
libtensorflow_inference r1.15 を Android でビルドするメモ
背景
- C/C++ で, 既存 r1.x 系の Tensorflow(C binding) 推論アプリを Android でも動かしたい
- 速度はそんなに問わないし, そもそも tflite では動かないモデルがある
- Java レイヤーは使わない
tensorflow + Android で検索するとだいたい tflite がヒットしてしまいますが, ここでは本来のlibtensorflow をビルドしてみます.
モバイルでは tflite 推奨で, libtensorflow のモバイル向けビルドは非推奨となっています.
とはいえ, そもそも tflite では動かないケースが多いので(特に RNN とか使っていたりする音声系), 頑張って libtensorflow を動かしてみます.libtensorflow on Android では, CPU のみの対応になります.
現状 C++ のみのようです(C API はここからさらに何かビルドが必要?)TensorFlow は r2.x が出ていますが, ここでは r1.15 を使います.
ビルド方法(Bazel)
TensorFlow の
./configure
で, Android WORKSPACE の作成を yes にしておきます.今回は ndk r21, Android API level 26, Android SDK tool 29 あたりを使いました.
(2020 年 02 月 12 日での概ね最新)を参考にビルドします.
bazel build --config=monolithic --cpu=arm64-v8a \ --compilation_mode=opt --cxxopt=-std=c++11 \ --crosstool_top=//external:android/crosstool \ --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \ //tensorflow/core:android_tensorflow_lib \ //tensorflow/tools/android/inference_interface:libtensorflow_inference.so \ //tensorflow/examples/android:libtensorflow_demo.so \ //tensorflow/tools/benchmark:benchmark_modelという感じで .so までビルドできるはずです. ビルドには, Threadripper 1950X で 10 分ほど時間かかります. libtensorflow_inference.so まででよくて, 最後のほうは動作確認用などとしてお好みで.
C++ std は, tf のバージョンによって変わります. v1.15.2 では c++11 でした. v2 では c++14 でした.
benchmark_model
までビルドしている場合,benchmark_model
を/data/local/tmp
などに adb push して走らせて動くかどう確認しましょうhttps://github.com/tensorflow/tensorflow/tree/r1.15/tensorflow/tools/benchmark
自前アプリに組み込む
TensorFlow C++(libtensorflow_cc.so) で推論アプリを CMake でビルドする(r1.8 対象)
https://qiita.com/syoyo/items/c102611ff63a6bbadc80を参考に, ヘッダファイルへパスを通し(eigen, protobuf, absl は bazel のビルドディレクトリにあるものへパスを通す), .so をリンクすればいけるはずです!
C API ?
Android プロジェクトであればあまり ABI などでのリンクエラーは出ないと思うので, TF の呼び出しを C++ で書いてもいいと思いますが, Windows での TF アプリとコードを一緒にしたい(Windows では C API でないといろいろリンクエラーなど出てめんどいため)などで, C API を使いたいときもあります.
Android の
libtensorflow_inference.so
用 Bazel BUILD ファイルでは, C API のライブラリは含まれていませんでした.自前で
tensorflow/c
にある c_api.cc あたりのファイルをアプリに取り込んでビルドする必要がありそうですが, 現状足りないシンボルエラーが出てきてうまくいきません.libtensorflow_inference.so を作る時点で, 足りない(private になっている?) ソースコードを追加しないとダメなことがわかりました. いろいろ調べるのがめんどいので, 現状は C++ API で頑張りましょう.
TODO
- C API interface の .so を作る.
- Makefile ベースのビルドを試す(
tensorflow/contrib/makefile
)- TensorFlow r2.x で試す
- java バインディング含んだ prebuilt .so が C++ アプリにそのままつかえるか試す(ヘッダファイルを .so の tf version と合わせればいけそう)
- 投稿日:2020-02-12T13:39:17+09:00
WebViewでcssのvhが効かない時はLayoutParamsでheightを設定しよう
- 投稿日:2020-02-12T13:19:24+09:00
ExoPlayerのv2.11で個人的に便利だと思ったやつ
WakeLockを自動で取得
バックグラウンドでの安定して再生させるためにWakeLockを取得するわけですが、WakeLockは取得したままだと電池を消耗してしまうので再生状態に応じてWakeLockを自動で取得 / 開放してくれる機能が付きました。
Add automatic WakeLock handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleWakeLock (#5846). To use this feature, you must add the WAKE_LOCK permission to your application's manifest file.
使い方はかんたん。
setHandleWakeLock
でtrue
を設定するだけSimpleExoPlayer.Builder(context).build().also { it.setHandleWakeLock(true) }中を見てみると WakeLockManager という
WakeLock
を管理するクラスがいて、こいつが管理する模様。Streaming再生する場合は、WifiLock
も同じところで取るだろうから、 #5846 のissueにかかれているようにWifiLock
も取れるオプションつけてくれるともっと嬉しかったですね。イヤホンが外れたら再生を止める
今まで、ブロードキャストで流れてくる
ACTION_AUDIO_BECOMING_NOISY
を受けとって自分で止める処理を書かないといけなかったですが、自動で止めてくれるオプションが入りました。Add automatic "audio becoming noisy" handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleAudioBecomingNoisy.
使い方はかんたん。
setHandleAudioBecomingNoisy
でtrue
を設定するだけSimpleExoPlayer.Builder(context).build().also { it.setHandleAudioBecomingNoisy(true) }イヤホン外れても再生し続けるとかなかなかないと思うので、デフォルトでOnでもいいんじゃないかと思うオプションですね。BroadcastReceiverに登録・解除するのがまるっとなくなるのは良いですが、受信しているときにしている処理が停止しているだけなので、そのときに一緒に別の処理をしたい場合は自前で書くしか無いのがつらいです。
- 投稿日:2020-02-12T09:21:37+09:00
遅延評価lateinit・lazyの違い
はじめに
遅延評価とは、必要な時まで値を代入したり計算したりを無視することをさします。
そのため、使用しない場合は計算を無視することで、処理コストを減らすことができます。
今回は、遅延評価として使用されるlateinitとlazyの違い等の紹介したいと思います。lateinitとlazyの違い
まず、それぞれの宣言はこちらになります。
//lateinit private lateinit var testButton: Button private lateinit var 変数名 : 型 //lazy private val testNumber by lazy { intent.getIntExtra("Int", 0) } private val 変数名 by lazy { 代入したいもの }lateinitの特徴として、
・プリミティブ型は宣言できない。
・varで宣言。
・値の変更可能。
・初期値を与えず変数を使用すると、エラーが発生します。
・nullableは使用できない。lazyの特徴として、
・どんな型も宣言可能。
・valで宣言。
・値の変更不可能。
・初めて使用する際に初期化するため、エラーが発生しない。
以上がそれぞれの特徴と違いです!さいごに
変数等の宣言にはいろんな方法があるので、
それぞれの特徴を活かしたコードが書けるようになりたいですね!