あの Jake Wharton さんが伝授する Android Studio を高速化する方法

直接は関係ないような気がしますが

「Kotlinを使ったら Android Studio が遅くなった」

という疑問に対して、神と呼ばれる Jake Wharton さんがコメントしています。

「プラグイン捨てれ」

I find the IDE slower when adding any plugin. Especially ones which provide a great deal of functionality such as an entire language support.

Go to preferences > plugins > and disable everything you don't need. I disabled

Android APK Support
Android Games
Android NDK
App Links Assistant
CVS
EditorConfig
Firebase (all of them)
GitHub
Google (all of them)
hg4idea
Settings repository
Subversion integration
Task management
Terminal
Test recorder
TestNG
YAML

Goes real fast now.

JakeWharton comments on Android Studio slower when using Kotlin

本体や各ウインドウの起動などかなり高速化されます。

Kotlin や Google や RxJava など多岐に渡るオープンソースプロジェクトに深く関わる Jake さんが必要ないプラグインが私たち小市民に必要なわけがありません。

一回も使ったことがないプラグインが多くあるのは間違いありません。

他の多機能アプリやソフトウェアにも同様のことがいえます。

確認してみてはいかがでしょうか。


GoPro をライブカメラにしてターミナルから操作する

👉 【無料】使わなくなったスマホをライブカメラにしておじいちゃんを監視したい 

GoProはパソコンとWiFi接続で接続できますよね。

このとき、
10.5.5.9 をルータとしたローカルネットワークとなり、
パソコン側は、10.5.5.10? のアドレスが割り振られます。

非SSL通信です。

録画を開始・停止する

今、このページを見ているパソコンをGoProにWiFi接続すると

以下のただのリンクをタップして操作できます。

まず、ストリーミングを(再)起動して、

[→ (再)起動]


http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart

録画開始して、

[→ 録画開始]


http://10.5.5.9/gp/gpControl/command/shutter?p=1

そして、録画停止。

[→ 録画停止]


http://10.5.5.9/gp/gpControl/command/shutter?p=0

これだけで、録画開始・停止はできるのですが、ライブ画像を見たいところです。

ライブ画像を見る

ffplay (ffmpeg) で見ることができます。


ffplay -loglevel panic -an -fflags nobuffer -f:v mpegts -probesize 8192 udp://:8554

実際には、ストリーミング接続を保持させる処理が必要となります。


#!/usr/bin/env python3

import sys
import socket
from urllib.request import urlopen
import subprocess
from time import sleep
import datetime
import signal
import http
import multiprocessing

# GPH 6/0.160
GOPRO_IP = "10.5.5.9"
UDP_PORT = 8554
KEEP_ALIVE = 2.5
MESSAGE = "_GPHD_:0:0:2:0.000000"

URL_PREFIX       = f"http://{GOPRO_IP}/gp/gpControl"
URL_STREAM       = f"{URL_PREFIX}/execute?p1=gpStream&a1=proto_v2&c1=restart"
URL_RECORD_START = f"{URL_PREFIX}/command/shutter?p=1"
URL_RECORD_STOP  = f"{URL_PREFIX}/command/shutter?p=0"

CMD_VIEW = f"ffplay -loglevel panic -fflags nobuffer -f:v mpegts -probesize 8192 udp://:{UDP_PORT}"

def live():

    urlopen(URL_STREAM).read()
    subprocess.Popen(CMD_VIEW, shell=True)
    multiprocessing.Process(target=keep_alive).start()

    print("Press Ctl+C to quit.")
    print("Press ENTER to start/stop recording.")

    on = False
    while True:
        input()
        on = not on
        record(on)

def keep_alive():

    while True:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.sendto(bytes(MESSAGE, "utf-8"), (GOPRO_IP, UDP_PORT))
        sleep(KEEP_ALIVE)

def record(on):

    urlopen(URL_RECORD_START if on else URL_RECORD_STOP).read()
    print(f"Record {str(on)} {datetime.datetime.today()}")


def quit_gopro(signal, frame):

    sys.exit(0)

if __name__ == '__main__':

    signal.signal(signal.SIGINT, quit_gopro)
    live()

パソコン・スマホ共にアプリが公式に公開はされていますが、サクッと見たいですよね。

いろんな使い方ができそうです。

👉 【無料】使わなくなったスマホをライブカメラにしておじいちゃんを監視したい 
Live Hero5 Session with WiFi - GOPRO SUPPORT HUB


Android アプリ開発時の Intellij IDEA の設定

EAPでも厳しい感じするのですが...。

一応、ビルド→ラウンチはできるけど。

右下にアラートが出る。

開くと以下ダイアログ。


Unexpected schema version 3
java.lang.AssertionError: Unexpected schema version 3
	at com.android.dvlib.DeviceSchema.getXsdStream(DeviceSchema.java:247)
	at com.android.dvlib.DeviceSchema.getSchema(DeviceSchema.java:331)
	at com.android.sdklib.devices.DeviceParser.getParser(DeviceParser.java:503)
	at com.android.sdklib.devices.DeviceParser.parseImpl(DeviceParser.java:489)
	at com.android.sdklib.devices.DeviceParser.parse(DeviceParser.java:464)
	at com.android.sdklib.devices.DeviceManager.initUserDevices(DeviceManager.java:444)
	at com.android.sdklib.devices.DeviceManager.initDevicesLists(DeviceManager.java:287)
	at com.android.sdklib.devices.DeviceManager.getDevice(DeviceManager.java:217)
	at com.android.sdklib.internal.avd.AvdManager.parseAvdInfo(AvdManager.java:1486)
	at com.android.sdklib.internal.avd.AvdManager.buildAvdList(AvdManager.java:1382)
	at com.android.sdklib.internal.avd.AvdManager.<init>(AvdManager.java:358)
	at com.android.sdklib.internal.avd.AvdManager.getInstance(AvdManager.java:403)
	at com.android.tools.idea.avdmanager.AvdManagerConnection.initIfNecessary(AvdManagerConnection.java:170)
	at com.android.tools.idea.avdmanager.AvdManagerConnection.getAvds(AvdManagerConnection.java:277)
	at com.android.tools.idea.run.editor.DevicePicker.lambda$refreshAvds$2(DevicePicker.java:186)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

想像できるのは、android コマンドが利用できなくなったこと。2017年8月ぐらいからか。


$ ./android
*************************************************************************
The "android" command is deprecated.
For manual SDK, AVD, and project management, please use Android Studio.
For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager
*************************************************************************

現在、最新版の 2017.3.3 なのですが。

GradleのバージョンやAndroidプラグインのバージョンなどに強く依存して頻繁な更新の影響を受けてるわけで。


This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio this means version 3.0+


$ adb push /projects/ExampleApp/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.example.app
$ adb shell pm install -r "/data/local/tmp/com.example.app"
Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]

$ adb shell pm uninstall com.example.app
Unknown failure (at android.os.Binder.execTransact(Binder.java:565))
Error while Installing APK

ある程度の対応策としては以下はあるが。


# gradle.properties
android.injected.build.model.only.versioned=3
android.injected.testOnly=false

とうとうGUI制限が入った Android Studio 3.0 Beta4 - exception think

環境だけでで振り回される外の人々。

中の人たちはそれなりの設定方法があるのだろうか。