reiji6695301
@reiji6695301 (田中 令治)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Androidアプリ をDebug実行では外部からTCP接続できますが、Run実行だとブロックされますが、対処方法を教えてください

Q&A

Closed

解決したいこと

Android 13のスマホでnativeコードを使ったアプリを開発しています。
アプリでは、同じWiFiに接続したデバイスからのTCP接続を受け付け、受信したデータに合わせて処理を行う機能を、native "c"コードで作成しています。
USBケーブルでスマホに接続し、Android Studioでビルドしたものをスマホで実行させたとき、Debug実行(Debug 'App')を行うと、TCP待受けポートに接続してきたデバイスをaccept()で検出し、データを受信できます。
しかし、Run実行(Run 'App')を行うと、TCP待受けポートに接続してきたデバイスをaccept()で検出はできません。接続を行うデバイスでは、connect()がすぐに終了し、接続先に接続を明示的に拒否されたようなエラーになります。
Run実行でも、TCP接続を受け入れることができるようにしたいです。

発生している問題・エラー

Androidアプリ側では、エラーはありません。
接続側のエラーから考えると、Android側のFireWallなどでガードされているのではないかとも推測しています。

該当するソースコード

申し訳ありませんが、全コードは提示できません。
「自分で試したこと」にコードの一部を掲載させていただきます。

自分で試したこと

Androidアプリ側で確認したことは以下のとおりです。

AndroidManifest.xmlへのパーミッション設定

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

MainActivity.javaでの実行時パーミッション確認

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {

 パーミッションがないというエラーは出ませんので、パーミッションには問題ないです。

networl_security_config.xmlを構成

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">tanakafeworks.com</domain>
    </domain-config>
</network-security-config>

proguard-rules.proを設定

class名にはドメインなどの固有情報があるため、[MyPackageInfo]として、"com.{my-site-name}.{product-name}"で展開しています。

# Keep network-related classes
-keep class [MyPackageInfo].network.** { *; }

# Keep the main activity
-keep class [MyPackageInfo].MainActivity {
    *;
}

# Keep any classes that are used in native method signatures
-keepclassmembers class * {
    native <methods>;
}

# Keep classes used for JNI (Java Native Interface)
-keep class [MyPackageInfo].** { *; }

# Keep classes for logging
-keep class android.util.Log {
    public static int d(...);
    public static int e(...);
    public static int i(...);
    public static int v(...);
    public static int w(...);
}

# Keep networking classes
-keep class java.net.** { *; }
-keep class javax.net.** { *; }

# Prevent obfuscation of methods used for reflection
-keepclassmembers class * {
    void set*(***);
    *** get*();
}

# Keep your custom application classes
-keep class [MyPackageInfo].** {
    *;
}

開発環境

Windows11 Pro
Android Studio Iguana | 2023.2.1
Runtime version: 17.0.9+0--11185874 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

スマホ

Android 13
Memory 8GB
UMIDIGI G5 Mecha

Androidアプリ開発には不慣れなところもあり、当たり前ができていないこともありますが、ご教授をお願いします。

0

1Answer

こんなエラーがよく出るんだけど、その時はUSBケーブルを別のに替えるのが一番いいよ。

1Like

Comments

  1. @reiji6695301

    Questioner

    コメントありがとうございます。
    USBケーブルを変えて試してみました。
    TCPで接続を受け付けることができるようになりました。
    USBケーブルが影響するとは思いもしませんでした。
    助かりましたありがとうございます。

  2. @reiji6695301

    Questioner

    ちなみに、問題の発生していたUSBケーブルは、2.0でしたが、改善したケーブルは3.0でしたが、これも関係あるのでしょうか?

  3. 運が良ければUSB 2.0でも接続できる場合があると思いますが、USB 3.0はUSB 2.0に比べて10倍速く、Android Debug Bridge(ADB)は大容量データの転送や安定性が必要です。そのため、AndroidアプリをデプロイするにはUSB 3.0の方が最適な選択肢です。

  4. @reiji6695301

    Questioner

    なるほど、勉強になります。ありがとうございました。

Your answer might help someone💌