development build を on にする
上記の設定で adb shell の run-as package-name が使えるようになる。
Flipper を使ってみたら結構便利だった。
List<SharedPreferencesDescriptor> descriptors = new ArrayList<SharedPreferencesDescriptor>(); descriptors.add(new SharedPreferencesDescriptor("prefs", MODE_PRIVATE)); descriptors.add(new SharedPreferencesDescriptor("myPrefs",MODE_PRIVATE)); client.addPlugin(new SharedPreferencesFlipperPlugin(this, descriptors));
Execution failed for task ':app:checkDebugDuplicateClasses'. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class io.netty.channel.epoll.AbstractEpollChannel found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$3 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) : Execution failed for task ':app:checkDebugDuplicateClasses'. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class io.netty.channel.epoll.AbstractEpollChannel found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$3 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Execution failed for task ':app:checkDebugDuplicateClasses'. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class io.netty.channel.epoll.AbstractEpollChannel found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) Duplicate class io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$3 found in modules jetified-netty-transport-native-epoll-4.1.67-linux-x86_64.Final-linux-x86_64 (io.netty:netty-transport-native-epoll:4.1.67.Final) and jetified-netty-transport-native-epoll-4.1.67.Final (io.netty:netty-transport-native-epoll:4.1.67.Final) : : : : : :
対応方法は以下
build.gradle
implementation( group: 'io.appium', name: 'java-client', version: '8.0.0-beta') { exclude group: 'io.netty', module: 'netty-transport-native-epoll' exclude group: 'io.netty', module: 'netty-transport-native-kqueue' exclude group: 'commons-logging', module: 'commons-logging' }
基本的な考え方
io.netty:netty-transport-native-epoll
Dupulicate したグループとモジュールを指定して取り除く
group: io.netty
module : netty-transport-native-epoll
Appuim で Android のスクリーンキャプチャーを取るには?
index.js
const driver = require("webdriverio"); const assert = require("assert"); const opts = { path: '/wd/hub', port: 4723, capabilities: { platformName: "Android", platformVersion: "12", deviceName: "Android Emulator", app: "/Users/falco/Downloads/ApiDemos-debug.apk", appPackage: "io.appium.android.apis", appActivity: ".view.TextFields", automationName: "UiAutomator2" } }; async function main () { const client = await driver.remote(opts); await pauseSec(5) // Screen shot を取る client.saveScreenshot("first.png"); const field = await client.$("android.widget.EditText"); await field.setValue("Hello World!"); await pauseSec(5) await field.setValue("Hello World!!!!!!"); const value = await field.getText(); assert.strictEqual(value,"Hello World!"); await pauseSec(5) await client.deleteSession(); } async function pauseSec(timeSec) { console.log("Start pauseSec") await new Promise(r => setTimeout(r, timeSec * 1000)); console.log("End") } main();
node index.js
デモ用アプリ
https://github.com/appium/appium/raw/master/sample-code/apps/ApiDemos-debug.apk
adbc.sh
#!/bin/bash FILE_NAME=`date +%Y%m%d_%H_%M_%S`.png echo $FILE_NAME adb shell screencap -p /sdcard/$FILE_NAME adb pull /sdcard/$FILE_NAME adb shell rm /sdcard/$FILE_NAME
コマンドラインから実行して日時のファイル名でキャプチャーを取得する
build.gradle(app)
android { buildFeatures { viewBinding true } }
使う時
class MainActivity : AppCompatActivity() { lateinit var bind : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bind = ActivityMainBinding.inflate(layoutInflater) init() setContentView(bind.root) } private fun init() { bind.button.setOnClickListener{ Toast.makeText(this, "on click", Toast.LENGTH_LONG).show() bind.textViewDice.text = "6" } } }
findViewById
は、もう不要、DataBinding より軽量でシンプル
Execution failed for task ':app:compileDebugJavaWithJavac'. > java.lang.NoClassDefFoundError: javax/annotation/Generated
gradle 7.0.2 JDK11
dagger2 を試そうとしたらエラー
解決策、以下を追加
dependencies { annotationProcessor 'javax.annotation:javax.annotation-api:1.3.2' }
// ? null許容 (Nullable) var a: String = "abc" // Regular initialization means non-null by default a = null // compilation error var b: String? = "abc" // can be set to null b = null // ok // ?. 安全呼び出し (Safe Call) val a = "Kotlin" val b: String? = null println(b?.length) println(a?.length) // 不必要な安全呼び出し // !! Not-Null Assertion Operator // Nullableな変数を強制的にNon-Nullに変換。もし変数がnullだった場合は、例外が発生するので注意 // NPE-lovers の為の演算子? Null の時は、例外を発生させたいと言う強い意志を持って使う var a: Int? = 1 a = null val b = a!!.toString() // java.lang.NullPointerException // ?: エルビス演算子(Elvis Operator) var a: String? = "Hello" a = null val b: String = a ?: "1234567890" println(b?.length) // print 10
# キャプチャー adb shell screencap -p /sdcard/screen.png # ファイル取得 adb pull /sdcard/screen.png # デバイス一覧 adb devices # デバイス指定 adb -s [deviceId] pull /sdcard/screen.png # インストール adb install package.apk # アンインストール adb uninstall package.name
# パッケージ情報の取得
adb shell dumpsys package package.name
# 現在表示されてる Activity の取得
adb shell dumpsys window | grep mCurrentFocus
mCurrentFocus=Window{6f7463b u0 com.example.mybottombar/com.example.mybottombar.MainActivity}
# データ削除
adb shell pm clear package.name
# adb Wifi 接続
# 192.168.10.104 はAndroid端末のIPアドレス
adb tcpip 5555
adb connect 192.168.10.104
https://developer.android.com/studio/command-line/adb?hl=ja