Android を実行している小さな TV ボックス デバイスがあります。Wi-Fi インターフェイスを起動すると、イーサネット インターフェイスが切断されます。次に、イーサネット デバイス、Wi-Fi インターフェイスを立ち上げます。コマンドラインを使用してインターフェイスを手動で起動するなど、さまざまな方法を試しましたが、同じ問題が発生します。Wi-Fi に接続して、それをデフォルト ゲートウェイとして使用したいのですが、イーサネット ポートにも接続して、そのインターフェイスを介して特定のトラフィックをルーティングしたいと考えています。明らかに、これはLinuxで実行できるため、方法があるはずです...他のインターフェースが開始されたときにインターフェースを破壊しているのは誰か知っていますか...
3 に答える
これは Android の制限です。意図的に一度に 1 つの接続のみを許可し、'ConnectivityServices.java' ファイルに、優先度のあるネットワークが有効になっている場合に「優先されない」ネットワークを切断するハンドラがあります。これは、認識されたホットスポットの範囲内にあるときに、Wi-Fi を起動し、セルラー データ接続を切断するものでもあります...
誰かがこれを必要とする場合に備えて、私がしたことは次のとおりです。
デバイスの Android のバージョンに対応する AOSP ソース コードをダウンロードします。
それに応じて「ConnectivityServices.java」ファイルを編集します。基本的に、接続変更ハンドラーのフェイルオーバー コマンドのコマンドをコメントアウトしただけです。私の前にソースコードがないので、私がここで何をしたかを知る必要がある場合は、私にメッセージを送ってください...
とにかく、マシン上で AOSP ソース コードをビルドします。
完了したら、作成された /dexclasses/ ディレクトリにある「services.jar」ファイルを取得します。WinRAR を使用して解凍し、「classes.dex」ファイルを .jar ファイルから別のディレクトリにコピーします。これを使用して classes.dex を抽出します: https://code.google.com/p/smali/ 「ConnectivityServices.smali」ファイルを取得し、安全に保管してください。
デバイスから 両方のネットワーク インターフェイスを有効にするデバイスに移動し、/system/framework/services.jar ファイルを PC にコピーします。WinRAR を使用して解凍し、「classes.dex」ファイルを .jar ファイルから別のディレクトリにコピーします。Java Smali コマンドを使用して、classes.dex を抽出します。
AOSP から ConnectivityServices.smali ファイルを取得し、デバイス上の classes.dex を使用して抽出したばかりの場所に直接配置します。上書きする前に、元の ConnectivityServices.smali ファイルのバックアップを作成することをお勧めします。
次に、baksmali コマンドを使用して classes.dex ファイルを単純に再パッケージ化します。winRAR を使用して、classes.dex ファイルを元の services.jar ファイルにコピーします。繰り返しますが、オリジナルのバックアップを取りますが、.jar ファイルで上書きします。
次に、新しい services.jar ファイルをデバイスの /system/framework/ ディレクトリに戻します。
次に再起動します。最初の起動には通常よりも時間がかかります。
デバイスに一致する AOSP をビルドする必要のない、より簡単な方法があります。smali で逆コンパイルされたコードを変更して再コンパイルするだけです。比較にはhttps://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/ConnectivityService.javaを使用してください。この行に沿った何か:
adb pull /system/framework/services.jar
cp services.jar services.jar.bak
unzip services.jar classes.dex
java -jar baksmali.jar classes.dex
これが結果になるように、handleConnect() で out/com/android/server/ConnectivityService.smali を編集します。
// if this is a default net and other default is running
// kill the one not preferred
if (false && mNetConfigs[newNetType].isDefault()) {
if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != newNetType) { ...
次の変更を加えました。
aget-object v5, v5, v1
invoke-virtual {v5}, Landroid/net/NetworkConfig;->isDefault()Z
move-result v5
#if-eqz v5, :cond_a6 # changed to unconditional jump
goto :cond_a6
再コンパイル、再パック、プッシュ。その後、再起動してテストします。
java -jar smali.jar -o classes.dex out
zip services.jar classes.dex
adb push services.jar /system/framework/services.jar
それで、CM12.1でそれを行う方法も見つけました
またはsmaliで.line 4266の前の行をgoto :cond_1b1に置き換えます