diff --git a/demo-app/.gitignore b/demo-app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/demo-app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/demo-app/build.gradle b/demo-app/build.gradle
new file mode 100644
index 0000000..6cb6ce9
--- /dev/null
+++ b/demo-app/build.gradle
@@ -0,0 +1,77 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ namespace 'com.fankes.apperrorsdemo'
+ compileSdk 31
+
+ signingConfigs {
+ debug {
+ storeFile file('../keystore/public')
+ storePassword '123456'
+ keyAlias 'public'
+ keyPassword '123456'
+ v1SigningEnabled true
+ v2SigningEnabled true
+ }
+ }
+
+ defaultConfig {
+ minSdk 21
+ targetSdk 31
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ externalNativeBuild {
+ cmake {
+ cppFlags ""
+ }
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ signingConfig signingConfigs.debug
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ externalNativeBuild {
+ cmake {
+ path "src/main/cpp/CMakeLists.txt"
+ version "3.22.1"
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = '11'
+ freeCompilerArgs = [
+ '-Xno-param-assertions',
+ '-Xno-call-assertions',
+ '-Xno-receiver-assertions'
+ ]
+ }
+ buildFeatures {
+ viewBinding true
+ }
+ lintOptions {
+ checkReleaseBuilds false
+ }
+}
+
+dependencies {
+ implementation 'com.highcapable.yukihookapi:api:1.0.87'
+ implementation 'com.geyifeng.immersionbar:immersionbar:3.2.0'
+ implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.0'
+ implementation 'androidx.core:core-ktx:1.7.0'
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'com.google.android.material:material:1.6.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/demo-app/consumer-rules.pro b/demo-app/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/demo-app/proguard-rules.pro b/demo-app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/demo-app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt b/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..b85fcc4
--- /dev/null
+++ b/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.fankes.apperrorstracking.demo_app
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.fankes.apperrorstracking.demo_app.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/demo-app/src/main/AndroidManifest.xml b/demo-app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7d39d34
--- /dev/null
+++ b/demo-app/src/main/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/cpp/CMakeLists.txt b/demo-app/src/main/cpp/CMakeLists.txt
new file mode 100644
index 0000000..24d218b
--- /dev/null
+++ b/demo-app/src/main/cpp/CMakeLists.txt
@@ -0,0 +1,48 @@
+# For more information about using CMake with Android Studio, read the
+# documentation: https://d.android.com/studio/projects/add-native-code.html
+
+# Sets the minimum version of CMake required to build the native library.
+
+cmake_minimum_required(VERSION 3.22.1)
+
+# Declares and names the project.
+
+project("demo_app")
+
+# Creates and names a library, sets it as either STATIC
+# or SHARED, and provides the relative paths to its source code.
+# You can define multiple libraries, and CMake builds them for you.
+# Gradle automatically packages shared libraries with your APK.
+
+add_library( # Sets the name of the library.
+ demo_app
+
+ # Sets the library as a shared library.
+ SHARED
+
+ # Provides a relative path to your source file(s).
+ demo_app.cpp)
+
+# Searches for a specified prebuilt library and stores the path as a
+# variable. Because CMake includes system libraries in the search path by
+# default, you only need to specify the name of the public NDK library
+# you want to add. CMake verifies that the library exists before
+# completing its build.
+
+find_library( # Sets the name of the path variable.
+ log-lib
+
+ # Specifies the name of the NDK library that
+ # you want CMake to locate.
+ log)
+
+# Specifies libraries CMake should link to your target library. You
+# can link multiple libraries, such as libraries you define in this
+# build script, prebuilt third-party libraries, or system libraries.
+
+target_link_libraries( # Specifies the target library.
+ demo_app
+
+ # Links the target library to the log library
+ # included in the NDK.
+ ${log-lib})
\ No newline at end of file
diff --git a/demo-app/src/main/cpp/demo_app.cpp b/demo-app/src/main/cpp/demo_app.cpp
new file mode 100644
index 0000000..38aaa92
--- /dev/null
+++ b/demo-app/src/main/cpp/demo_app.cpp
@@ -0,0 +1,7 @@
+#include
+#include
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_fankes_apperrorsdemo_native_Channel_throwNativeException(JNIEnv *env, jobject) {
+ throw std::exception();
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt
new file mode 100644
index 0000000..89d37dd
--- /dev/null
+++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt
@@ -0,0 +1,34 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/5/10.
+ */
+package com.fankes.apperrorsdemo.application
+
+import android.app.Application
+import androidx.appcompat.app.AppCompatDelegate
+
+class DemoApplication : Application() {
+
+ override fun onCreate() {
+ super.onCreate()
+ /** 跟随系统夜间模式 */
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
+ }
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt
new file mode 100644
index 0000000..cafd623
--- /dev/null
+++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt
@@ -0,0 +1,47 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/5/10.
+ */
+package com.fankes.apperrorsdemo.native
+
+object Channel {
+
+ init {
+ System.loadLibrary("demo_app")
+ }
+
+ fun throwRuntimeException() {
+ throw RuntimeException("Exception test")
+ }
+
+ fun throwIllegalStateException() {
+ throw IllegalStateException("Exception test")
+ }
+
+ fun throwNullPointerException() {
+ throw NullPointerException("Exception test")
+ }
+
+ fun throwException() {
+ throw Exception()
+ }
+
+ external fun throwNativeException()
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt
new file mode 100644
index 0000000..3b2719f
--- /dev/null
+++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt
@@ -0,0 +1,38 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/5/10.
+ */
+package com.fankes.apperrorsdemo.ui.activity
+
+import com.fankes.apperrorsdemo.databinding.ActivityMainBinding
+import com.fankes.apperrorsdemo.native.Channel
+import com.fankes.apperrorsdemo.ui.activity.base.BaseActivity
+
+class MainActivity : BaseActivity() {
+
+ override fun onCreate() {
+ binding.titleBackIcon.setOnClickListener { onBackPressed() }
+ binding.throwRuntimeButton.setOnClickListener { Channel.throwRuntimeException() }
+ binding.throwIllegalStateButton.setOnClickListener { Channel.throwIllegalStateException() }
+ binding.throwNullPointerButton.setOnClickListener { Channel.throwNullPointerException() }
+ binding.throwExceptionButton.setOnClickListener { Channel.throwException() }
+ binding.throwNativeErrorButton.setOnClickListener { Channel.throwNativeException() }
+ }
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt
new file mode 100644
index 0000000..b53b4d1
--- /dev/null
+++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt
@@ -0,0 +1,69 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/5/10.
+ */
+@file:Suppress("UNCHECKED_CAST")
+
+package com.fankes.apperrorsdemo.ui.activity.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.viewbinding.ViewBinding
+import com.fankes.apperrorsdemo.R
+import com.fankes.apperrorsdemo.utils.factory.isNotSystemInDarkMode
+import com.gyf.immersionbar.ktx.immersionBar
+import com.highcapable.yukihookapi.hook.factory.method
+import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
+import java.lang.reflect.ParameterizedType
+
+abstract class BaseActivity : AppCompatActivity() {
+
+ /** 获取绑定布局对象 */
+ lateinit var binding: VB
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ javaClass.genericSuperclass.also { type ->
+ if (type is ParameterizedType) {
+ binding = (type.actualTypeArguments[0] as Class).method {
+ name = "inflate"
+ param(LayoutInflaterClass)
+ }.get().invoke(layoutInflater) ?: error("binding failed")
+ setContentView(binding.root)
+ } else error("binding but got wrong type")
+ }
+ /** 隐藏系统的标题栏 */
+ supportActionBar?.hide()
+ /** 初始化沉浸状态栏 */
+ immersionBar {
+ statusBarColor(R.color.colorThemeBackground)
+ autoDarkModeEnable(true)
+ statusBarDarkFont(isNotSystemInDarkMode)
+ navigationBarColor(R.color.colorThemeBackground)
+ navigationBarDarkIcon(isNotSystemInDarkMode)
+ fitsSystemWindows(true)
+ }
+ /** 装载子类 */
+ onCreate()
+ }
+
+ /** 回调 [onCreate] 方法 */
+ abstract fun onCreate()
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt
new file mode 100644
index 0000000..52f6474
--- /dev/null
+++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt
@@ -0,0 +1,37 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/5/10.
+ */
+package com.fankes.apperrorsdemo.utils.factory
+
+import android.content.Context
+import android.content.res.Configuration
+
+/**
+ * 系统深色模式是否开启
+ * @return [Boolean] 是否开启
+ */
+val Context.isSystemInDarkMode get() = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
+
+/**
+ * 系统深色模式是否没开启
+ * @return [Boolean] 是否开启
+ */
+inline val Context.isNotSystemInDarkMode get() = !isSystemInDarkMode
\ No newline at end of file
diff --git a/demo-app/src/main/res/drawable-night/bg_permotion_round.xml b/demo-app/src/main/res/drawable-night/bg_permotion_round.xml
new file mode 100644
index 0000000..09cbc15
--- /dev/null
+++ b/demo-app/src/main/res/drawable-night/bg_permotion_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/drawable/bg_button_round.xml b/demo-app/src/main/res/drawable/bg_button_round.xml
new file mode 100644
index 0000000..c7bf8cb
--- /dev/null
+++ b/demo-app/src/main/res/drawable/bg_button_round.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/drawable/bg_permotion_round.xml b/demo-app/src/main/res/drawable/bg_permotion_round.xml
new file mode 100644
index 0000000..b7d8b2b
--- /dev/null
+++ b/demo-app/src/main/res/drawable/bg_permotion_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/drawable/ic_launcher_background.xml b/demo-app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/demo-app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo-app/src/main/res/drawable/ic_launcher_foreground.xml b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..4e096a3
--- /dev/null
+++ b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/layout/activity_main.xml b/demo-app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..6953bd0
--- /dev/null
+++ b/demo-app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/mipmap-hdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..8870dd2
Binary files /dev/null and b/demo-app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/demo-app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9dc6e19
Binary files /dev/null and b/demo-app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/demo-app/src/main/res/mipmap-mdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..0378ce1
Binary files /dev/null and b/demo-app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/demo-app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..a45ba9d
Binary files /dev/null and b/demo-app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/demo-app/src/main/res/mipmap-xhdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..f5ed84d
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/demo-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..293fb6f
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_back.png b/demo-app/src/main/res/mipmap-xxhdpi/ic_back.png
new file mode 100644
index 0000000..49415ff
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xxhdpi/ic_back.png differ
diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..457cdf2
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..8c0275c
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..0784907
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d112706
Binary files /dev/null and b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/demo-app/src/main/res/values-night/color.xml b/demo-app/src/main/res/values-night/color.xml
new file mode 100644
index 0000000..809ab40
--- /dev/null
+++ b/demo-app/src/main/res/values-night/color.xml
@@ -0,0 +1,6 @@
+
+
+ #FF2D2D2D
+ #FFCFCFCF
+ #FFD3D3D3
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values-night/themes.xml b/demo-app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..c521579
--- /dev/null
+++ b/demo-app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values-zh-rCN/strings.xml b/demo-app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..c56be28
--- /dev/null
+++ b/demo-app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,11 @@
+
+
+ 异常示例
+ 返回
+ 这里提供了常见场景下的业务异常逻辑,激活 Xposed 模块后,可在此测试异常是否能够被捕获,为了验证 Xposed 模块生效情况,当前 APP 无任何手动处理异常的逻辑代码。
+ 抛出 RuntimeException
+ 抛出 IllegalStateException
+ 抛出 NullPointerException
+ 抛出 Exception
+ 抛出原生层异常
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values/color.xml b/demo-app/src/main/res/values/color.xml
new file mode 100644
index 0000000..24917f9
--- /dev/null
+++ b/demo-app/src/main/res/values/color.xml
@@ -0,0 +1,6 @@
+
+
+ #FFFFFFFF
+ #FF777777
+ #FF323B42
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values/colors.xml b/demo-app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..0df5e08
--- /dev/null
+++ b/demo-app/src/main/res/values/colors.xml
@@ -0,0 +1,11 @@
+
+
+ #656565
+ #656565
+ #656565
+ #656565
+ #656565
+ #FF000000
+ #FFFFFFFF
+ #00000000
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values/ic_launcher_background.xml b/demo-app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..a35b997
--- /dev/null
+++ b/demo-app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FF4400
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values/strings.xml b/demo-app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2e88dbb
--- /dev/null
+++ b/demo-app/src/main/res/values/strings.xml
@@ -0,0 +1,10 @@
+
+ AppErrorsDemo
+ Back
+ The business exception logic in common scenarios is provided here. After activating the Xposed module, you can test whether the exception can be caught here. In order to verify the effectiveness of the Xposed module, the current App does not have any logic code for manually handling exceptions.
+ throw RuntimeException
+ throw IllegalStateException
+ throw NullPointerException
+ throw Exception
+ throw Native Error
+
\ No newline at end of file
diff --git a/demo-app/src/main/res/values/themes.xml b/demo-app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..d113275
--- /dev/null
+++ b/demo-app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt b/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt
new file mode 100644
index 0000000..435cb7f
--- /dev/null
+++ b/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.fankes.apperrorstracking.demo_app
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index f648633..1d204d0 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -16,4 +16,5 @@ dependencyResolutionManagement {
}
}
rootProject.name = "AppErrorsTracking"
-include ':app'
\ No newline at end of file
+include ':app'
+include ':demo-app'
\ No newline at end of file