From 87217696dd785a4718109cbb78139dc65f7533ae Mon Sep 17 00:00:00 2001 From: kai-city <1830170041@qq.com> Date: Sun, 30 May 2021 20:03:13 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89dex?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=9D=E5=AD=98=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 25 ++++-- .../main/java/top/niunaijun/blackdex/App.kt | 26 ------ .../java/top/niunaijun/blackdex/app/App.kt | 38 ++++++++ .../top/niunaijun/blackdex/app/AppManager.kt | 26 ++++++ .../niunaijun/blackdex/app/BlackDexLoader.kt | 87 +++++++++++++++++++ .../biz/cache/AppSharedPreferenceDelegate.kt | 67 ++++++++++++++ .../blackdex/data/BlackDexConfiguration.kt | 41 --------- .../blackdex/view/base/BaseActivity.kt | 3 +- .../blackdex/view/main/MainActivity.kt | 21 ++--- .../blackdex/view/setting/SettingActivity.kt | 19 ++++ .../blackdex/view/setting/SettingFragment.kt | 61 +++++++++++++ app/src/main/res/layout/activity_setting.xml | 22 +++++ app/src/main/res/menu/menu_main.xml | 5 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/setting.xml | 15 ++++ 16 files changed, 373 insertions(+), 90 deletions(-) delete mode 100644 app/src/main/java/top/niunaijun/blackdex/App.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/app/App.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/app/AppManager.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/app/BlackDexLoader.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/biz/cache/AppSharedPreferenceDelegate.kt delete mode 100644 app/src/main/java/top/niunaijun/blackdex/data/BlackDexConfiguration.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/view/setting/SettingActivity.kt create mode 100644 app/src/main/java/top/niunaijun/blackdex/view/setting/SettingFragment.kt create mode 100644 app/src/main/res/layout/activity_setting.xml create mode 100644 app/src/main/res/xml/setting.xml diff --git a/app/build.gradle b/app/build.gradle index 962f5a2..cac0809 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "top.niunaijun.blackdex" minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" + versionCode 2 + versionName "1.1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -72,6 +72,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.preference:preference-ktx:1.1.1' implementation project(':Bcore') @@ -86,6 +87,7 @@ dependencies { //third implementation 'com.afollestad.material-dialogs:core:3.3.0' + implementation 'com.afollestad.material-dialogs:files:3.2.1' //dialog implementation 'com.github.nukc.stateview:kotlin:2.2.0' //状态控制控件 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc179a4..35731a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,29 +3,38 @@ xmlns:tools="http://schemas.android.com/tools" package="top.niunaijun.blackdex"> - - + + + + + - - - - - + + \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/App.kt b/app/src/main/java/top/niunaijun/blackdex/App.kt deleted file mode 100644 index 1ba0721..0000000 --- a/app/src/main/java/top/niunaijun/blackdex/App.kt +++ /dev/null @@ -1,26 +0,0 @@ -package top.niunaijun.blackdex - -import android.app.Application -import android.content.Context -import top.niunaijun.blackbox.BlackDexCore -import top.niunaijun.blackbox.app.configuration.ClientConfiguration -import top.niunaijun.blackdex.data.BlackDexConfiguration - -/** - * - * @Description: - * @Author: wukaicheng - * @CreateDate: 2021/5/23 14:00 - */ -class App : Application() { - - override fun attachBaseContext(base: Context?) { - super.attachBaseContext(base) - BlackDexCore.get().doAttachBaseContext(base,BlackDexConfiguration(base!!)) - } - - override fun onCreate() { - super.onCreate() - BlackDexCore.get().doCreate() - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/app/App.kt b/app/src/main/java/top/niunaijun/blackdex/app/App.kt new file mode 100644 index 0000000..e087889 --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/app/App.kt @@ -0,0 +1,38 @@ +package top.niunaijun.blackboxa.app + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import top.niunaijun.blackdex.app.AppManager + +/** + * + * @Description: + * @Author: wukaicheng + * @CreateDate: 2021/4/29 21:21 + */ +class App : Application() { + + companion object { + + @SuppressLint("StaticFieldLeak") + @Volatile + private lateinit var mContext: Context + + @JvmStatic + fun getContext(): Context { + return mContext + } + } + + override fun attachBaseContext(base: Context?) { + super.attachBaseContext(base) + mContext = base!! + AppManager.doAttachBaseContext(base) + } + + override fun onCreate() { + super.onCreate() + AppManager.doOnCreate(mContext) + } +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/app/AppManager.kt b/app/src/main/java/top/niunaijun/blackdex/app/AppManager.kt new file mode 100644 index 0000000..2789c5b --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/app/AppManager.kt @@ -0,0 +1,26 @@ +package top.niunaijun.blackdex.app + +import android.content.Context + +object AppManager { + @JvmStatic + val mBlackBoxLoader by lazy { + BlackDexLoader() + } + + fun doAttachBaseContext(context: Context) { + try { + mBlackBoxLoader.attachBaseContext(context) + mBlackBoxLoader.addLifecycleCallback() + } catch (e: Exception) { + e.printStackTrace() + } + } + + fun doOnCreate(context: Context) { + mBlackBoxLoader.doOnCreate(context) + initThirdService(context) + } + + private fun initThirdService(context: Context) {} +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/app/BlackDexLoader.kt b/app/src/main/java/top/niunaijun/blackdex/app/BlackDexLoader.kt new file mode 100644 index 0000000..ef08740 --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/app/BlackDexLoader.kt @@ -0,0 +1,87 @@ +package top.niunaijun.blackdex.app + +import android.content.Context +import top.niunaijun.blackbox.BlackDexCore +import top.niunaijun.blackbox.app.configuration.ClientConfiguration +import top.niunaijun.blackbox.utils.FileUtils +import top.niunaijun.blackbox.utils.compat.BuildCompat +import top.niunaijun.blackboxa.app.App +import top.niunaijun.blackdex.biz.cache.AppSharedPreferenceDelegate +import java.io.File + +/** + * + * @Description: + * @Author: wukaicheng + * @CreateDate: 2021/5/6 23:38 + */ +class BlackDexLoader { + + + private var mSavePath by AppSharedPreferenceDelegate(App.getContext(), "") + + private var mSaveEnable by AppSharedPreferenceDelegate(App.getContext(), false) + + private var mDir = if (mSaveEnable) { + getDexDumpDir(App.getContext()) + } else { + mSavePath + } + + fun addLifecycleCallback() { + + } + + fun attachBaseContext(context: Context) { + BlackDexCore.get().doAttachBaseContext(context, object : ClientConfiguration() { + override fun getHostPackageName(): String { + return context.packageName + } + + override fun getDexDumpDir(): String { + return mDir + } + }) + } + + fun doOnCreate(context: Context) { + BlackDexCore.get().doCreate() + } + + fun saveEnable(): Boolean { + return mSaveEnable + } + + fun saveEnable(state: Boolean) { + this.mSaveEnable = state + } + + fun getSavePath(): String { + return mSavePath + } + + fun setSavePath(path: String) { + this.mSavePath = path + } + + + companion object { + + val TAG: String = BlackDexLoader::class.java.simpleName + + fun getDexDumpDir(context: Context): String { + return if (BuildCompat.isR()) { + val dump = File( + context.externalCacheDir?.parentFile?.parentFile?.parentFile?.parentFile, + "hupu/dexDump" + ) + FileUtils.mkdirs(dump) + dump.absolutePath + } else { + val dump = File(context.externalCacheDir?.parentFile, "dump") + FileUtils.mkdirs(dump) + dump.absolutePath + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/biz/cache/AppSharedPreferenceDelegate.kt b/app/src/main/java/top/niunaijun/blackdex/biz/cache/AppSharedPreferenceDelegate.kt new file mode 100644 index 0000000..aa859da --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/biz/cache/AppSharedPreferenceDelegate.kt @@ -0,0 +1,67 @@ +package top.niunaijun.blackdex.biz.cache + + +import android.content.Context +import android.text.TextUtils +import androidx.core.content.edit +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + + +/** + * + * @desc:目前只支持 5种基本数据类型,如果要支持obj,请继承该类并重写他的相关方法 findData/putData + * + * @author: mini + * @created by 2021/5/10 + */ +open class AppSharedPreferenceDelegate(context: Context, private val default: Data, spName: String? = null) : ReadWriteProperty { + + private val mSharedPreferences by lazy { + val tmpCacheName = if (TextUtils.isEmpty(spName)) { + AppSharedPreferenceDelegate::class.java.simpleName + } else { + spName + } + return@lazy context.getSharedPreferences(tmpCacheName, Context.MODE_PRIVATE) + } + + override fun getValue(thisRef: Any, property: KProperty<*>): Data { + return findData(property.name, default) + } + + override fun setValue(thisRef: Any, property: KProperty<*>, value: Data?) { + putData(property.name, value) + } + + protected fun findData(key: String, default: Data): Data { + with(mSharedPreferences) { + val result: Any? = when (default) { + is Int -> getInt(key, default) + is Long -> getLong(key, default) + is Float -> getFloat(key, default) + is String -> getString(key, default) + is Boolean -> getBoolean(key, default) + else -> throw IllegalArgumentException("This type $default can not be saved into sharedPreferences") + } + return result as? Data ?: default + } + } + + protected fun putData(key: String, value: Data?) { + mSharedPreferences.edit { + if (value == null) { + remove(key) + } else { + when (value) { + is Int -> putInt(key, value) + is Long -> putLong(key, value) + is Float -> putFloat(key, value) + is String -> putString(key, value) + is Boolean -> putBoolean(key, value) + else -> throw IllegalArgumentException("This type $default can not be saved into Preferences") + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/data/BlackDexConfiguration.kt b/app/src/main/java/top/niunaijun/blackdex/data/BlackDexConfiguration.kt deleted file mode 100644 index a9bd5c4..0000000 --- a/app/src/main/java/top/niunaijun/blackdex/data/BlackDexConfiguration.kt +++ /dev/null @@ -1,41 +0,0 @@ -package top.niunaijun.blackdex.data - -import android.content.Context -import top.niunaijun.blackbox.app.configuration.ClientConfiguration -import top.niunaijun.blackbox.utils.FileUtils -import top.niunaijun.blackbox.utils.compat.BuildCompat -import java.io.File - -/** - * - * @Description: 启动配置文件 - * @Author: wukaicheng - * @CreateDate: 2021/5/23 14:04 - */ -class BlackDexConfiguration(private val context: Context) : ClientConfiguration() { - - companion object { - fun getDexDumpDir(context: Context): String { - return if (BuildCompat.isR()) { - val dump = File(context.externalCacheDir?.parentFile?.parentFile?.parentFile?.parentFile, "Download/dexDump") - FileUtils.mkdirs(dump) - dump.absolutePath - } else { - val dump = File(context.externalCacheDir?.parentFile, "dump") - FileUtils.mkdirs(dump) - dump.absolutePath - } - } - } - - private val dir = getDexDumpDir(context) - - override fun getHostPackageName(): String { - return context.packageName - } - - override fun getDexDumpDir(): String { - return dir - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/view/base/BaseActivity.kt b/app/src/main/java/top/niunaijun/blackdex/view/base/BaseActivity.kt index be3359d..b601653 100644 --- a/app/src/main/java/top/niunaijun/blackdex/view/base/BaseActivity.kt +++ b/app/src/main/java/top/niunaijun/blackdex/view/base/BaseActivity.kt @@ -20,8 +20,9 @@ open class BaseActivity : AppCompatActivity() { toolbar.setNavigationOnClickListener { if (onBack != null) { onBack() + }else{ + finish() } - finish() } } } diff --git a/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt b/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt index 1ac1c58..2e7522c 100644 --- a/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt +++ b/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt @@ -29,6 +29,8 @@ import top.niunaijun.blackdex.util.InjectionUtil import top.niunaijun.blackdex.util.LoadingUtil import top.niunaijun.blackdex.util.inflate import top.niunaijun.blackdex.view.base.BaseActivity +import top.niunaijun.blackdex.view.setting.SettingActivity + class MainActivity : BaseActivity() { @@ -47,11 +49,8 @@ class MainActivity : BaseActivity() { setContentView(viewBinding.root) initToolbar(viewBinding.toolbarLayout.toolbar, R.string.app_name) - initView() - initViewModel() - initSearchView() BlackDexCore.get().registerDumpMonitor(mMonitor) @@ -181,7 +180,6 @@ class MainActivity : BaseActivity() { }) } - private fun filterApp(newText: String) { val newList = this.appList.filter { it.name.contains(newText, true) or it.packageName.contains(newText, true) @@ -224,24 +222,17 @@ class MainActivity : BaseActivity() { MaterialDialog(this).show { title(text = "申请失败") message(text = "请授予我们读写本地文件权限,否则软件将无法正常运行。") - if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - positiveButton(text = "再次申请") { requestStoragePermission() } } else { - positiveButton(text = "手动授予") { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) val uri = Uri.fromParts("package", packageName, null) intent.data = uri - try { - startActivity(intent) - } catch (e: Exception) { - e.printStackTrace() - } + startActivity(intent) } } negativeButton(text = "退出软件") { @@ -283,6 +274,12 @@ class MainActivity : BaseActivity() { Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/CodingGay/BlackDex")) startActivity(intent) } + + R.id.main_setting -> { + val intent = + Intent(this, SettingActivity::class.java) + startActivity(intent) + } } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingActivity.kt b/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingActivity.kt new file mode 100644 index 0000000..52f632e --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingActivity.kt @@ -0,0 +1,19 @@ +package top.niunaijun.blackdex.view.setting + +import android.os.Bundle +import top.niunaijun.blackdex.R +import top.niunaijun.blackdex.databinding.ActivitySettingBinding +import top.niunaijun.blackdex.util.inflate +import top.niunaijun.blackdex.view.base.BaseActivity + +class SettingActivity : BaseActivity() { + + private val viewBinding: ActivitySettingBinding by inflate() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(viewBinding.root) + initToolbar(viewBinding.toolbarLayout.toolbar, R.string.app_setting,true) + supportFragmentManager.beginTransaction().replace(R.id.fragment,SettingFragment()).commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingFragment.kt b/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingFragment.kt new file mode 100644 index 0000000..3eac02f --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/view/setting/SettingFragment.kt @@ -0,0 +1,61 @@ +package top.niunaijun.blackdex.view.setting + +import android.os.Bundle +import android.os.Environment +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.files.folderChooser +import top.niunaijun.blackdex.R +import top.niunaijun.blackdex.app.AppManager +import java.io.File + +/** + * + * @Description: + * @Author: wukaicheng + * @CreateDate: 2021/5/28 19:55 + */ +class SettingFragment : PreferenceFragmentCompat() { + + private lateinit var savePathPreference: Preference + + private lateinit var saveEnablePreference: SwitchPreferenceCompat + + private val initialDirectory = AppManager.mBlackBoxLoader.getSavePath() + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.setting) + savePathPreference = findPreference("save_path")!! + savePathPreference.onPreferenceClickListener = mSavedPathClick + savePathPreference.summary = initialDirectory + + saveEnablePreference = findPreference("save_enable")!! + saveEnablePreference.onPreferenceChangeListener = mSaveEnableChange + + } + + private val mSavedPathClick = Preference.OnPreferenceClickListener { + val initialFile = with(initialDirectory) { + if (initialDirectory.isEmpty()) { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + } else { + File(this) + } + } + + MaterialDialog(requireContext()).show { + folderChooser(requireContext(), initialDirectory = initialFile,allowFolderCreation = true) { _, file -> + AppManager.mBlackBoxLoader.setSavePath(file.absolutePath) + savePathPreference.summary = file.absolutePath + } + } + return@OnPreferenceClickListener true + } + + private val mSaveEnableChange = Preference.OnPreferenceChangeListener { _, newValue -> + AppManager.mBlackBoxLoader.saveEnable(newValue as Boolean) + return@OnPreferenceChangeListener true + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml new file mode 100644 index 0000000..204dd8c --- /dev/null +++ b/app/src/main/res/layout/activity_setting.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index d13cc84..e39f96e 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -9,6 +9,11 @@ android:title="@string/filter" app:showAsAction="ifRoom" /> + + 选择 软件日志 开源地址 + 软件设置 \ No newline at end of file diff --git a/app/src/main/res/xml/setting.xml b/app/src/main/res/xml/setting.xml new file mode 100644 index 0000000..2e5f4d8 --- /dev/null +++ b/app/src/main/res/xml/setting.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file