优化:判断Frpclib是否已经初始化

修复:Frpclib未下载时,自动任务添加启停frpc app自动重启 #402
This commit is contained in:
pppscn 2024-02-17 09:50:10 +08:00
parent ccd98ab2da
commit d8909ad676
9 changed files with 31 additions and 15 deletions

View File

@ -36,6 +36,8 @@ import com.idormy.sms.forwarder.utils.sdkinit.XBasicLibInit
import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit
import com.idormy.sms.forwarder.utils.tinker.TinkerLoadLibrary import com.idormy.sms.forwarder.utils.tinker.TinkerLoadLibrary
import com.king.location.LocationClient import com.king.location.LocationClient
import com.xuexiang.xutil.file.FileUtils
import frpclib.Frpclib
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
@ -91,6 +93,9 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
val LocationClient by lazy { LocationClient(context) } val LocationClient by lazy { LocationClient(context) }
val Geocoder by lazy { Geocoder(context) } val Geocoder by lazy { Geocoder(context) }
val DateFormat by lazy { SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) } val DateFormat by lazy { SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) }
//Frpclib是否已经初始化
var FrpclibInited = false
} }
override fun attachBaseContext(base: Context) { override fun attachBaseContext(base: Context) {
@ -138,6 +143,7 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
if (soFile.exists()) { if (soFile.exists()) {
try { try {
TinkerLoadLibrary.installNativeLibraryPath(classLoader, soFile) TinkerLoadLibrary.installNativeLibraryPath(classLoader, soFile)
FrpclibInited = FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so") && FRPC_LIB_VERSION == Frpclib.getVersion()
} catch (throwable: Throwable) { } catch (throwable: Throwable) {
Log.e("APP", throwable.message.toString()) Log.e("APP", throwable.message.toString())
} }

View File

@ -63,7 +63,6 @@ import com.yarolegovich.slidingrootnav.SlideGravity
import com.yarolegovich.slidingrootnav.SlidingRootNav import com.yarolegovich.slidingrootnav.SlidingRootNav
import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder
import com.yarolegovich.slidingrootnav.callback.DragStateListener import com.yarolegovich.slidingrootnav.callback.DragStateListener
import frpclib.Frpclib
import java.io.File import java.io.File
@Suppress("PrivatePropertyName", "unused", "DEPRECATION") @Suppress("PrivatePropertyName", "unused", "DEPRECATION")
@ -279,7 +278,7 @@ class MainActivity : BaseActivity<ActivityMainBinding?>(), DrawerAdapter.OnItemS
POS_SERVER -> openNewPage(ServerFragment::class.java) POS_SERVER -> openNewPage(ServerFragment::class.java)
POS_CLIENT -> openNewPage(ClientFragment::class.java) POS_CLIENT -> openNewPage(ClientFragment::class.java)
POS_FRPC -> { POS_FRPC -> {
if (FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so") && FRPC_LIB_VERSION == Frpclib.getVersion()) { if (App.FrpclibInited) {
openNewPage(FrpcFragment::class.java) openNewPage(FrpcFragment::class.java)
return return
} }

View File

@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.paging.PagingDataAdapter import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.adapter.FrpcPagingAdapter.MyViewHolder import com.idormy.sms.forwarder.adapter.FrpcPagingAdapter.MyViewHolder
import com.idormy.sms.forwarder.database.entity.Frpc import com.idormy.sms.forwarder.database.entity.Frpc
@ -31,7 +32,7 @@ class FrpcPagingAdapter(private val itemClickListener: OnItemClickListener) : Pa
holder.binding.tvUid.text = "UID:${item.uid}" holder.binding.tvUid.text = "UID:${item.uid}"
holder.binding.tvName.text = item.name holder.binding.tvName.text = item.name
if (item.connecting || Frpclib.isRunning(item.uid)) { if (item.connecting || (App.FrpclibInited && Frpclib.isRunning(item.uid))) {
holder.binding.ivPlay.setImageResource(R.drawable.ic_stop) holder.binding.ivPlay.setImageResource(R.drawable.ic_stop)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
holder.binding.ivPlay.imageTintList = getColors(R.color.colorStop) holder.binding.ivPlay.imageTintList = getColors(R.color.colorStop)

View File

@ -5,6 +5,7 @@ import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.STATUS_OFF import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.idormy.sms.forwarder.utils.STATUS_ON import com.idormy.sms.forwarder.utils.STATUS_ON
@ -34,6 +35,6 @@ data class Frpc(
} }
val status: Int val status: Int
get() = if (connecting || Frpclib.isRunning(uid)) STATUS_ON else STATUS_OFF get() = if (connecting || (App.FrpclibInited && Frpclib.isRunning(uid))) STATUS_ON else STATUS_OFF
} }

View File

@ -3,6 +3,7 @@ package com.idormy.sms.forwarder.fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.core.webview.AgentWebActivity import com.idormy.sms.forwarder.core.webview.AgentWebActivity
@ -25,7 +26,6 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xui.widget.textview.supertextview.SuperTextView import com.xuexiang.xui.widget.textview.supertextview.SuperTextView
import com.xuexiang.xutil.file.FileUtils
import frpclib.Frpclib import frpclib.Frpclib
import java.io.File import java.io.File
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -55,7 +55,7 @@ class AboutFragment : BaseFragment<FragmentAboutBinding?>(), SuperTextView.OnSup
binding!!.menuVersion.setLeftString(String.format(resources.getString(R.string.about_app_version), AppUtils.getAppVersionName())) binding!!.menuVersion.setLeftString(String.format(resources.getString(R.string.about_app_version), AppUtils.getAppVersionName()))
binding!!.menuCache.setLeftString(String.format(resources.getString(R.string.about_cache_size), CacheUtils.getTotalCacheSize(requireContext()))) binding!!.menuCache.setLeftString(String.format(resources.getString(R.string.about_cache_size), CacheUtils.getTotalCacheSize(requireContext())))
if (FileUtils.isFileExists(context?.filesDir?.absolutePath + "/libs/libgojni.so")) { if (App.FrpclibInited) {
binding!!.menuFrpc.setLeftString(String.format(resources.getString(R.string.about_frpc_version), Frpclib.getVersion())) binding!!.menuFrpc.setLeftString(String.format(resources.getString(R.string.about_frpc_version), Frpclib.getVersion()))
binding!!.menuFrpc.visibility = View.VISIBLE binding!!.menuFrpc.visibility = View.VISIBLE
} }

View File

@ -9,6 +9,7 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
import com.alibaba.android.vlayout.VirtualLayoutManager import com.alibaba.android.vlayout.VirtualLayoutManager
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.adapter.FrpcPagingAdapter import com.idormy.sms.forwarder.adapter.FrpcPagingAdapter
import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.core.BaseFragment
@ -21,6 +22,7 @@ import com.idormy.sms.forwarder.utils.EVENT_FRPC_DELETE_CONFIG
import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_ERROR import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_ERROR
import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_SUCCESS import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_SUCCESS
import com.idormy.sms.forwarder.utils.EVENT_FRPC_UPDATE_CONFIG import com.idormy.sms.forwarder.utils.EVENT_FRPC_UPDATE_CONFIG
import com.idormy.sms.forwarder.utils.FRPC_LIB_VERSION
import com.idormy.sms.forwarder.utils.FrpcUtils import com.idormy.sms.forwarder.utils.FrpcUtils
import com.idormy.sms.forwarder.utils.INTENT_FRPC_APPLY_FILE import com.idormy.sms.forwarder.utils.INTENT_FRPC_APPLY_FILE
import com.idormy.sms.forwarder.utils.INTENT_FRPC_EDIT_FILE import com.idormy.sms.forwarder.utils.INTENT_FRPC_EDIT_FILE
@ -144,6 +146,11 @@ class FrpcFragment : BaseFragment<FragmentFrpcsBinding?>(), FrpcPagingAdapter.On
} }
R.id.iv_play -> { R.id.iv_play -> {
if (!App.FrpclibInited) {
XToastUtils.error(String.format(getString(R.string.frpclib_download_title), FRPC_LIB_VERSION))
return
}
if (!ForegroundService.isRunning) { if (!ForegroundService.isRunning) {
val serviceIntent = Intent(requireContext(), ForegroundService::class.java) val serviceIntent = Intent(requireContext(), ForegroundService::class.java)
serviceIntent.action = "START" serviceIntent.action = "START"
@ -189,6 +196,11 @@ class FrpcFragment : BaseFragment<FragmentFrpcsBinding?>(), FrpcPagingAdapter.On
} }
else -> { else -> {
if (!App.FrpclibInited) {
XToastUtils.error(String.format(getString(R.string.frpclib_download_title), FRPC_LIB_VERSION))
return
}
//编辑或删除需要先停止客户端 //编辑或删除需要先停止客户端
if (Frpclib.isRunning(item.uid)) { if (Frpclib.isRunning(item.uid)) {
XToastUtils.warning(R.string.tipServiceRunning) XToastUtils.warning(R.string.tipServiceRunning)

View File

@ -12,6 +12,7 @@ import androidx.core.app.NotificationCompat
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.activity.MainActivity import com.idormy.sms.forwarder.activity.MainActivity
import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.core.Core
@ -20,7 +21,6 @@ import com.idormy.sms.forwarder.utils.task.CronJobScheduler
import com.idormy.sms.forwarder.workers.LoadAppListWorker import com.idormy.sms.forwarder.workers.LoadAppListWorker
import com.jeremyliao.liveeventbus.LiveEventBus import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xutil.XUtil import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.file.FileUtils
import frpclib.Frpclib import frpclib.Frpclib
import io.reactivex.Single import io.reactivex.Single
import io.reactivex.SingleObserver import io.reactivex.SingleObserver
@ -41,9 +41,8 @@ class ForegroundService : Service() {
private val compositeDisposable = CompositeDisposable() private val compositeDisposable = CompositeDisposable()
private val frpcObserver = Observer { uid: String -> private val frpcObserver = Observer { uid: String ->
if (Frpclib.isRunning(uid)) { if (!App.FrpclibInited || Frpclib.isRunning(uid)) return@Observer
return@Observer
}
Core.frpc.get(uid).flatMap { (uid1, _, config) -> Core.frpc.get(uid).flatMap { (uid1, _, config) ->
val error = Frpclib.runContent(uid1, config) val error = Frpclib.runContent(uid1, config)
Single.just(error) Single.just(error)
@ -147,7 +146,7 @@ class ForegroundService : Service() {
} }
//启动 Frpc //启动 Frpc
if (FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so")) { if (App.FrpclibInited) {
//监听Frpc启动指令 //监听Frpc启动指令
LiveEventBus.get(INTENT_FRPC_APPLY_FILE, String::class.java).observeStickyForever(frpcObserver) LiveEventBus.get(INTENT_FRPC_APPLY_FILE, String::class.java).observeStickyForever(frpcObserver)
//自启动的Frpc //自启动的Frpc

View File

@ -13,7 +13,6 @@ import com.idormy.sms.forwarder.server.model.SmsSendData
import com.idormy.sms.forwarder.service.HttpServerService import com.idormy.sms.forwarder.service.HttpServerService
import com.xuexiang.xrouter.utils.TextUtils import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xutil.XUtil import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.system.DeviceUtils import com.xuexiang.xutil.system.DeviceUtils
import frpclib.Frpclib import frpclib.Frpclib
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -43,7 +42,7 @@ class SmsCommandUtils {
val param = if (cmdList.count() > 2) cmdList[2] else "" val param = if (cmdList.count() > 2) cmdList[2] else ""
when (function) { when (function) {
"frpc" -> { "frpc" -> {
if (!FileUtils.isFileExists(context.filesDir?.absolutePath + "/libs/libgojni.so")) { if (!App.FrpclibInited) {
Log.d(TAG, "还未下载Frpc库") Log.d(TAG, "还未下载Frpc库")
return false return false
} }

View File

@ -48,7 +48,6 @@ import com.idormy.sms.forwarder.utils.TaskWorker
import com.jeremyliao.liveeventbus.LiveEventBus import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xrouter.utils.TextUtils import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xutil.XUtil import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.resource.ResUtils.getString import com.xuexiang.xutil.resource.ResUtils.getString
import frpclib.Frpclib import frpclib.Frpclib
import java.util.Calendar import java.util.Calendar
@ -193,7 +192,7 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
} }
TASK_ACTION_FRPC -> { TASK_ACTION_FRPC -> {
if (!FileUtils.isFileExists(App.context.filesDir?.absolutePath + "/libs/libgojni.so")) { if (!App.FrpclibInited) {
writeLog("还未下载Frpc库") writeLog("还未下载Frpc库")
continue continue
} }