20200212のAndroidに関する記事は6件です。

AndroidStudioでプロキシの設定を解除しても反映されないときの対処法

目次

  1. 概要
  2. 環境
  3. 解決方法
  4. 原因
  5. まとめ

1. 概要

一度プロキシ設定を行った後に、File->setting->System Setting->HTTP ProxyからNo proxyを選択してもプロキシ経由でアクセスしてしまい、解決に時間が掛かったので解決方法を残しておきます。

2. 環境

  • AndroidStudio 3.5.1

3. 解決方法

gradle.properties(Grobal Properties)の記述を削除したら,非プロキシ環境下でも動作しました。
image.png
上の4行を削除

4. 原因

AndroidStudioのsettingでプロキシの設定を行うと、自動でgradle.propertiesにプロキシの設定が追加されます。しかし、No Proxyを設定してもその記述は削除されないため、概要にある問題が発生しました。

5. まとめ

いろいろ書きましたが、gradle.propertiesの4行を削除すれば解決しました。
実際は削除よりコメント化の方がいいかと。解決しなければgit周りの設定に問題があるかも

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 日での概ね最新)

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/ci_build/builds/android_full.sh

を参考にビルドします.

    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 に移行して幸せになりたい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 日での概ね最新)

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/ci_build/builds/android_full.sh

を参考にビルドします.

    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 と合わせればいけそう)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WebViewでcssのvhが効かない時はLayoutParamsでheightを設定しよう

タイトル通りなんだけど一応コード

    WebView webView = new CustomWebView(getActivity());
    parentLayout.addView(webView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

高さが設定されていないとvhは機能しない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.

使い方はかんたん。 setHandleWakeLocktrue を設定するだけ

    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.

使い方はかんたん。 setHandleAudioBecomingNoisytrue を設定するだけ

    SimpleExoPlayer.Builder(context).build().also {
        it.setHandleAudioBecomingNoisy(true)
    }

イヤホン外れても再生し続けるとかなかなかないと思うので、デフォルトでOnでもいいんじゃないかと思うオプションですね。BroadcastReceiverに登録・解除するのがまるっとなくなるのは良いですが、受信しているときにしている処理が停止しているだけなので、そのときに一緒に別の処理をしたい場合は自前で書くしか無いのがつらいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

遅延評価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で宣言。
・値の変更不可能。
・初めて使用する際に初期化するため、エラーが発生しない。
以上がそれぞれの特徴と違いです!

さいごに

変数等の宣言にはいろんな方法があるので、
それぞれの特徴を活かしたコードが書けるようになりたいですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む