From 3c3cb9b13048609458fe11d8bd4cd2d85729bcdc Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 19 Feb 2025 18:49:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BD=91=E7=BB=9C=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重启MPApp使用临时方案,通过MpMaster来完成,解决自身不能重启的问题 --- app/src/main/cpp/CMakeLists.txt | 3 +- app/src/main/cpp/MicroPhoto.cpp | 32 +++- app/src/main/cpp/PhoneDevice.cpp | 38 +++- app/src/main/cpp/PhoneDevice.h | 3 +- .../java/com/xypower/mpapp/MainActivity.java | 4 - .../com/xypower/mpapp/MicroPhotoService.java | 171 ++++++++++++------ .../com/xypower/common/MicroPhotoContext.java | 4 +- .../com/xypower/mpmaster/MpMasterService.java | 23 ++- 8 files changed, 204 insertions(+), 74 deletions(-) diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 393acd36..ab571788 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -46,12 +46,13 @@ add_definitions(-DUSING_HDRPLUS) add_definitions(-DUSING_EXEC_HDRP=1) set(USING_EXEC_HDRP 1) +add_definitions(-DUSING_ETHERNET) if(ANDROID_ABI STREQUAL "armeabi-v7a") add_definitions(-DUSING_N938) elseif(ANDROID_ABI STREQUAL "arm64-v8a") # add_definitions(-DUSING_N938) - add_definitions(-DUSING_PLZ) + # add_definitions(-DUSING_PLZ) endif() # include_directories(${OpenCV_DIR}/include) diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index a5b03ead..8ac0bea3 100644 --- a/app/src/main/cpp/MicroPhoto.cpp +++ b/app/src/main/cpp/MicroPhoto.cpp @@ -941,6 +941,16 @@ Java_com_xypower_mpapp_MicroPhotoService_infoLog( env->ReleaseStringUTFChars(msg, msgStr); } +extern "C" JNIEXPORT jboolean JNICALL +Java_com_xypower_mpapp_MicroPhotoService_usingEthernet( + JNIEnv* env, jclass cls) { +#ifdef USING_ETHERNET + return JNI_TRUE; +#else + return JNI_FALSE; +#endif +} + extern "C" JNIEXPORT void JNICALL Java_com_xypower_mpapp_MicroPhotoService_setOtgState( JNIEnv* env, @@ -1336,7 +1346,27 @@ Java_com_xypower_mpapp_MicroPhotoService_updateEhernet( CPhoneDevice* device = (CPhoneDevice*)pTerminal->GetDevice(); if (device != NULL) { - device->UpdateEthernet(static_cast(networkHandle), available != JNI_FALSE); + device->UpdateNetwork(static_cast(networkHandle), available != JNI_FALSE, false); + } + + return JNI_TRUE; +} + + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_xypower_mpapp_MicroPhotoService_updateActiveNetwork( + JNIEnv* env, jobject pThis, jlong handle, jlong networkHandle, jboolean available) { + + CTerminal* pTerminal = reinterpret_cast(handle); + if (pTerminal == NULL) + { + return JNI_FALSE; + } + + CPhoneDevice* device = (CPhoneDevice*)pTerminal->GetDevice(); + if (device != NULL) + { + device->UpdateNetwork(static_cast(networkHandle), available != JNI_FALSE, true); } return JNI_TRUE; diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index bfa69e76..222f9a38 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -479,7 +479,7 @@ int32_t CPhoneDevice::CJpegCamera::getOutputFormat() const } CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode, const std::string& nativeLibDir) - : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir), m_network(NULL), m_ethnetHandle(NETWORK_UNSPECIFIED) + : mVersionCode(versionCode), m_nativeLibraryDir(nativeLibDir), m_network(NULL), m_defNetHandle(NETWORK_UNSPECIFIED), m_ethnetHandle(NETWORK_UNSPECIFIED) { mCamera = NULL; m_listener = NULL; @@ -647,6 +647,21 @@ void CPhoneDevice::SetRecognizationCfg(const IDevice::CFG_RECOGNIZATION* pRecogn bool CPhoneDevice::BindNetwork(int sock) { + + m_devLocker.lock(); + net_handle_t defNetHandle = m_defNetHandle; + m_devLocker.unlock(); + if (defNetHandle != NETWORK_UNSPECIFIED) + { + int res = android_setsocknetwork(defNetHandle, sock); + if (res == -1) + { + int errcode = errno; + printf("android_setsocknetwork errno=%d", errcode); + } + return res == 0; + } + return true; } @@ -3745,13 +3760,22 @@ void CPhoneDevice::UpdateSimcard(const std::string& simcard) m_simcard = simcard; } -void CPhoneDevice::UpdateEthernet(net_handle_t nethandle, bool available) +void CPhoneDevice::UpdateNetwork(net_handle_t nethandle, bool available, bool defaultOrEthernet) { - m_devLocker.lock(); - m_ethnetHandle = available ? nethandle : NETWORK_UNSPECIFIED; - m_devLocker.unlock(); - - XYLOG(XYLOG_SEVERITY_WARNING, "NET Handle: %lld", available ? (uint64_t)nethandle : 0); + if (defaultOrEthernet) + { + m_devLocker.lock(); + m_defNetHandle = available ? nethandle : NETWORK_UNSPECIFIED; + m_devLocker.unlock(); + XYLOG(XYLOG_SEVERITY_WARNING, "Active Network Handle: %lld", available ? (uint64_t)nethandle : 0); + } + else + { + m_devLocker.lock(); + m_ethnetHandle = available ? nethandle : NETWORK_UNSPECIFIED; + m_devLocker.unlock(); + XYLOG(XYLOG_SEVERITY_WARNING, "Ethernet Handle: %lld", available ? (uint64_t)nethandle : 0); + } } net_handle_t CPhoneDevice::GetEthnetHandle() const diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index fa9e9fed..4a72f9b9 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -260,7 +260,7 @@ public: mBuildTime = buildTime; } void UpdateSimcard(const std::string& simcard); - void UpdateEthernet(net_handle_t nethandle, bool available); + void UpdateNetwork(net_handle_t nethandle, bool available, bool defaultOrEthernet); net_handle_t GetEthnetHandle() const; @@ -354,6 +354,7 @@ protected: std::string m_nativeLibraryDir; NETWORK* m_network; + net_handle_t m_defNetHandle; net_handle_t m_ethnetHandle; jmethodID mRegisterHeartbeatMid; diff --git a/app/src/main/java/com/xypower/mpapp/MainActivity.java b/app/src/main/java/com/xypower/mpapp/MainActivity.java index 153548ab..bdcb78cd 100644 --- a/app/src/main/java/com/xypower/mpapp/MainActivity.java +++ b/app/src/main/java/com/xypower/mpapp/MainActivity.java @@ -133,8 +133,6 @@ public class MainActivity extends AppCompatActivity { Log.d(TAG, "MainActivity: reboot=" + rebootFlag + " noDelay=" + noDelay); - - final MicroPhotoContext.AppConfig appConfig = MicroPhotoContext.getMpAppConfig(appContext); if (TextUtils.isEmpty(appConfig.cmdid)) { appConfig.cmdid = MicroPhotoService.getSerialNumber(); @@ -178,8 +176,6 @@ public class MainActivity extends AppCompatActivity { } } - - if (MicroPhotoContext.hasMpAppConfig(appContext)) { Runnable runnable = new Runnable() { @Override diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 8c1801eb..84fc5f23 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -60,6 +60,7 @@ import android.util.Log; import android.widget.RemoteViews; import android.widget.Toast; +import com.dev.api.XyDev; import com.dev.devapi.api.SysApi; import com.xypower.common.FileDownloader; import com.xypower.common.FilesUtils; @@ -250,6 +251,71 @@ public class MicroPhotoService extends Service { public void onCreate() { super.onCreate(); + try { + if (usingEthernet()) { + mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); + mNetworkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onLost(Network network) { + infoLog("Network Lost " + network.toString()); + updateEhernet(mNativeHandle, network.getNetworkHandle(), false); + updateDefaultNetwork(); + } + @Override + public void onAvailable(final Network network) { + String ip = ""; + try { + NetworkInfo ni = mConnectivityManager.getNetworkInfo(network); + LinkProperties lp = mConnectivityManager.getLinkProperties(network); + if (lp != null) { + List addresses = lp.getLinkAddresses(); + if (addresses != null && addresses.size() > 0) { + for (LinkAddress linkAddress : addresses) { + InetAddress inetAddress = linkAddress.getAddress(); + if (inetAddress != null && inetAddress instanceof Inet4Address) { + ip = inetAddress.getHostAddress(); + break; + } + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + infoLog("Network Available " + network.toString() + " IP=" + ip); + updateEhernet(mNativeHandle, network.getNetworkHandle(), true); + updateDefaultNetwork(); + } + + private void updateDefaultNetwork() { + MicroPhotoService thisService = MicroPhotoService.this; + long defaultNetHandle = thisService.getDefaultNetworkHandle(); + if (defaultNetHandle != 0) { + thisService.updateEhernet(thisService.mNativeHandle, defaultNetHandle, true); + } + } + }; + + NetworkRequest request = new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) + .build(); + + mConnectivityManager.registerNetworkCallback(request, mNetworkCallback); + + Network[] nws = mConnectivityManager.getAllNetworks(); + for (Network nw : nws) { + NetworkInfo ni = mConnectivityManager.getNetworkInfo(nw); + if (ni.getType() == ConnectivityManager.TYPE_ETHERNET) { + updateEhernet(mNativeHandle, nw.getNetworkHandle(), true); + } + + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + try { final String appPath = MicroPhotoContext.buildMpAppDir(this); @@ -373,6 +439,10 @@ public class MicroPhotoService extends Service { getApplicationContext().unregisterReceiver(mScreenaAtionReceiver); getApplicationContext().unregisterReceiver(mNetworkChangedReceiver); + if (mConnectivityManager != null && mNetworkCallback != null) { + mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); + } + LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mLocalMsgReceiver); for(Map.Entry entry : mWakeLocks.entrySet()) { @@ -929,6 +999,23 @@ public class MicroPhotoService extends Service { return START_NOT_STICKY; } + long getDefaultNetworkHandle() { + long defaultNetHandle = 0; + if (mConnectivityManager != null) { + Network network = mConnectivityManager.getActiveNetwork(); + if (network != null) { + NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network); + int type = networkInfo.getType(); + if (type == ConnectivityManager.TYPE_MOBILE || type == ConnectivityManager.TYPE_VPN || + type == ConnectivityManager.TYPE_MOBILE_DUN || type == ConnectivityManager.TYPE_MOBILE_HIPRI) { + defaultNetHandle = network.getNetworkHandle(); + } + } + } + + return defaultNetHandle; + } + private void startTerminalService(Intent intent) { if (MicroPhotoService.this.mNativeHandle != 0) { @@ -982,8 +1069,9 @@ public class MicroPhotoService extends Service { ex.printStackTrace(); } + long defaultNetHandle = service.getDefaultNetworkHandle(); service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, - encryptData, 0, service.getSignalLevel(), versionCode, + encryptData, defaultNetHandle, service.getSignalLevel(), versionCode, BuildConfig.BUILD_TIMESTAMP, simcard, tfCardPath, nativeLibraryDir); if (service.mNativeHandle != 0) { @@ -1390,6 +1478,27 @@ public class MicroPhotoService extends Service { public static void restartApp(Context context, String packageName, String reason) { + // "com.xypower.mpmaster.ACT_REQ_RST_APP" + Intent intent = new Intent(); + intent.setAction("com.xypower.mpmaster.ACT_REQ_RST_APP"); + intent.setPackage(MicroPhotoContext.PACKAGE_NAME_MPMASTER); + intent.putExtra("noDelay", 1); + intent.putExtra("reason", reason); + intent.putExtra("packageName", context.getPackageName()); + context.sendBroadcast(intent); + System.exit(0); + + /* + if (TextUtils.equals(packageName, MicroPhotoContext.PACKAGE_NAME_MPAPP)) { + MicroPhotoContext.restartMpApp(context, reason, 0); + System.exit(0); + } else { + MicroPhotoContext.restartApp(context, packageName, reason); + } + + */ + + /* Intent intent = new Intent(context, MainActivity.class); int noDelay = 1; intent.putExtra("noDelay", noDelay); @@ -1397,11 +1506,10 @@ public class MicroPhotoService extends Service { intent.putExtra("reason", reason); } - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); System.exit(0); - - + */ /* Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); int noDelay = 1; @@ -1505,58 +1613,6 @@ public class MicroPhotoService extends Service { public void setStaticNetwork(String iface, String ip, String netmask, String gateway) { - if (mConnectivityManager == null || mNetworkCallback == null) { - mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); - mNetworkCallback = new ConnectivityManager.NetworkCallback() { - - @Override - public void onLost(Network network) { - infoLog("Network Lost " + network.toString()); - updateEhernet(mNativeHandle, network.getNetworkHandle(), false); - } - @Override - public void onAvailable(final Network network) { - String ip = ""; - try { - NetworkInfo ni = mConnectivityManager.getNetworkInfo(network); - LinkProperties lp = mConnectivityManager.getLinkProperties(network); - if (lp != null) { - List addresses = lp.getLinkAddresses(); - if (addresses != null && addresses.size() > 0) { - for (LinkAddress linkAddress : addresses) { - InetAddress inetAddress = linkAddress.getAddress(); - if (inetAddress != null && inetAddress instanceof Inet4Address) { - ip = inetAddress.getHostAddress(); - break; - } - } - } - } - } catch (Exception ex) { - ex.printStackTrace(); - } - - infoLog("Network Available " + network.toString() + " IP=" + ip); - updateEhernet(mNativeHandle, network.getNetworkHandle(), true); - } - }; - - NetworkRequest request = new NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) - .build(); - - mConnectivityManager.registerNetworkCallback(request, mNetworkCallback); - - Network[] nws = mConnectivityManager.getAllNetworks(); - for (Network nw : nws) { - NetworkInfo ni = mConnectivityManager.getNetworkInfo(nw); - if (ni.getType() == ConnectivityManager.TYPE_ETHERNET) { - updateEhernet(mNativeHandle, nw.getNetworkHandle(), true); - } - - } - } - if (!TextUtils.equals("0.0.0.0", ip)) { Intent intent = new Intent(); intent.putExtra("cmd", "setnet"); @@ -1602,6 +1658,7 @@ cellSignalStrengthGsm.getDbm(); protected native boolean reloadConfigs(long handler); protected native void updatePosition(long handler, double lon, double lat, double radius, long ts); protected native boolean updateEhernet(long handler, long nativeNetworkHandle, boolean available); + protected native boolean updateActiveNetwork(long handler, long nativeNetworkHandle, boolean available); protected native boolean uninit(long handler); protected native void recordingFinished(long handler, boolean photoOrVideo, boolean result, String path, long videoId); protected native void captureFinished(long handler, boolean photoOrVideo, boolean result, Bitmap bm, long videoId); @@ -1612,6 +1669,8 @@ cellSignalStrengthGsm.getDbm(); public static native boolean sendExternalPhoto(long deviceHandle, String path, long photoInfo); public static native void infoLog(String log); + public static native boolean usingEthernet(); + public static native void setOtgState(boolean enabled); public static native void setCam3V3Enable(boolean enabled); public static native String getSerialNumber(); diff --git a/common/src/main/java/com/xypower/common/MicroPhotoContext.java b/common/src/main/java/com/xypower/common/MicroPhotoContext.java index 3e33894b..eb9c910e 100644 --- a/common/src/main/java/com/xypower/common/MicroPhotoContext.java +++ b/common/src/main/java/com/xypower/common/MicroPhotoContext.java @@ -398,9 +398,9 @@ public class MicroPhotoContext { intent.putExtra("reason", reason); } intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, 0); + PendingIntent restartIntent = PendingIntent.getActivity(context, 100, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - mgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delayedTimeMs, restartIntent); + mgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ((delayedTimeMs > 0) ? delayedTimeMs : 10), restartIntent); } public static void restartApp(Context context, String packageName, String reason) { diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index 0cd0e49b..5196e13d 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -14,6 +14,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; @@ -70,6 +71,8 @@ public class MpMasterService extends Service { public static final String ACTION_STOP = "com.xypower.mpmaster.ACT_STOP"; public static final String ACTION_MAIN = "com.xypower.mpmaster.ACT_MAIN"; + public static final String ACTION_REQ_RESTART_APP = "com.xypower.mpmaster.ACT_REQ_RST_APP"; + public static final String ACTION_UPD_OTA = SysApi.OTA_RESULT_ACTION; public static final String ACTION_INSTALL_RESULT = SysApi.INSTALL_RESULT_ACTION; public static final String ACTION_UNINSTALL_RESULT = SysApi.UNINSTALL_RESULT_ACTION; @@ -245,6 +248,7 @@ public class MpMasterService extends Service { intentFilter.addAction(ACTION_UPD_OTA); intentFilter.addAction(ACTION_INSTALL_RESULT); intentFilter.addAction(ACTION_UNINSTALL_RESULT); + intentFilter.addAction(ACTION_REQ_RESTART_APP); intentFilter.addAction(MicroPhotoContext.ACTION_HEARTBEAT_MP); registerReceiver(mAlarmReceiver, intentFilter); @@ -649,8 +653,6 @@ public class MpMasterService extends Service { mService.detectMpAppAlive(); } else if (TextUtils.equals(MicroPhotoContext.ACTION_HEARTBEAT_MP, action)) { - - if (intent.hasExtra("HeartbeatDuration")) { int hbDuration = intent.getIntExtra("HeartbeatDuration", 600000); mService.mMpHeartbeatDuration = hbDuration > 0 ? hbDuration : 600000; @@ -712,6 +714,23 @@ public class MpMasterService extends Service { String pkname = intent.getStringExtra("pkname"); String msg = intent.getStringExtra("msg"); mService.logger.warning("UNINSTALL APP result =" + bSucc + ",pkname=" + pkname + ",msg=" + msg); + } else if (TextUtils.equals(ACTION_REQ_RESTART_APP, action)) { + + try { + String packageName = intent.getStringExtra("packageName"); + Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(packageName); + + Bundle bundle = intent.getExtras(); + bundle.remove("packageName"); + restartIntent.putExtras(bundle); + restartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + context.startActivity(restartIntent); + + } catch (Exception ex) { + ex.printStackTrace(); + } + + } } }