浏览代码

<wdkl定制launcher备份上传>

weizhengliang 5 年之前
当前提交
8d88ae429b
共有 69 个文件被更改,包括 1785 次插入0 次删除
  1. 9 0
      .gitignore
  2. 二进制
      .idea/caches/build_file_checksums.ser
  3. 二进制
      .idea/caches/gradle_models.ser
  4. 113 0
      .idea/codeStyles/Project.xml
  5. 19 0
      .idea/gradle.xml
  6. 48 0
      .idea/misc.xml
  7. 9 0
      .idea/modules.xml
  8. 12 0
      .idea/runConfigurations.xml
  9. 1 0
      README.md
  10. 1 0
      app/.gitignore
  11. 52 0
      app/build.gradle
  12. 二进制
      app/keystore/wdkllaunch.jks
  13. 二进制
      app/keystore_wuyuqing/platform.pk8
  14. 24 0
      app/keystore_wuyuqing/platform.x509.pem
  15. 二进制
      app/keystore_wuyuqing/release.keystore
  16. 二进制
      app/keystore_wuyuqing/signapk.jar
  17. 17 0
      app/keystore_wuyuqing/说明.txt
  18. 25 0
      app/proguard-rules.pro
  19. 二进制
      app/sign_apk/Wdkllaunch.apk
  20. 二进制
      app/sign_apk/Wdkllaunch_V1.00_20190614_3368_T2.apk
  21. 二进制
      app/sign_apk/Wdkllaunch_V1.0_20190520.apk
  22. 二进制
      app/sign_apk/Wdkllaunch_V1.0_20190604_3368.apk
  23. 二进制
      app/sign_apk/Wdkllaunch_V1.0_20190604_A20.apk
  24. 二进制
      app/sign_apk/Wdkllaunch_V1.0_20190708_A20.apk
  25. 二进制
      app/sign_apk/Wdkllaunch_V1.0_20190709_A20.apk
  26. 二进制
      app/sign_apk/platform.pk8
  27. 27 0
      app/sign_apk/platform.x509.pem
  28. 二进制
      app/sign_apk/signapk.jar
  29. 11 0
      app/sign_apk/签名
  30. 26 0
      app/src/androidTest/java/com/example/dengzhe/launch/ExampleInstrumentedTest.java
  31. 63 0
      app/src/main/AndroidManifest.xml
  32. 26 0
      app/src/main/java/com/wdkl/launch/BootUpReceiver.java
  33. 116 0
      app/src/main/java/com/wdkl/launch/Launcher.java
  34. 69 0
      app/src/main/java/com/wdkl/launch/ListAppActivity.java
  35. 184 0
      app/src/main/java/com/wdkl/launch/MainActivity.java
  36. 119 0
      app/src/main/java/com/wdkl/launch/ShareData.java
  37. 121 0
      app/src/main/java/com/wdkl/launch/anrfcutil/AnrFcExceptionUtil.java
  38. 55 0
      app/src/main/java/com/wdkl/launch/runningApp/Programe.java
  39. 58 0
      app/src/main/java/com/wdkl/launch/runningApp/RunningApp.java
  40. 71 0
      app/src/main/java/com/wdkl/launch/runningApp/RunningUtil.java
  41. 101 0
      app/src/main/java/com/wdkl/launch/util/EthernetStatus.java
  42. 二进制
      app/src/main/jniLibs/frame.jar
  43. 7 0
      app/src/main/res/drawable/selector_click.xml
  44. 5 0
      app/src/main/res/drawable/shape_nor_click.xml
  45. 10 0
      app/src/main/res/drawable/shape_receive_date.xml
  46. 5 0
      app/src/main/res/drawable/shape_sel_click.xml
  47. 55 0
      app/src/main/res/layout/activity_main.xml
  48. 二进制
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  49. 二进制
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  50. 二进制
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  51. 二进制
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  52. 二进制
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  53. 二进制
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  54. 二进制
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  55. 二进制
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  56. 二进制
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  57. 二进制
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  58. 6 0
      app/src/main/res/values/colors.xml
  59. 3 0
      app/src/main/res/values/strings.xml
  60. 15 0
      app/src/main/res/values/styles.xml
  61. 二进制
      app/wdkl_launch_V1.0_20190507.apk
  62. 二进制
      app/wdkllaunch.zip
  63. 31 0
      build.gradle
  64. 14 0
      gradle.properties
  65. 二进制
      gradle/wrapper/gradle-wrapper.jar
  66. 6 0
      gradle/wrapper/gradle-wrapper.properties
  67. 160 0
      gradlew
  68. 90 0
      gradlew.bat
  69. 1 0
      settings.gradle

+ 9 - 0
.gitignore

@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.externalNativeBuild

二进制
.idea/caches/build_file_checksums.ser


二进制
.idea/caches/gradle_models.ser


+ 113 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,113 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <codeStyleSettings language="XML">
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>ANDROID_ATTRIBUTE_ORDER</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 19 - 0
.idea/gradle.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+        <option name="testRunner" value="PLATFORM" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 48 - 0
.idea/misc.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
+    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="12">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <item index="7" class="java.lang.String" itemvalue="android.annotation.Nullable" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+          <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="11">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <item index="6" class="java.lang.String" itemvalue="android.annotation.NonNull" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 9 - 0
.idea/modules.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/WdklLaunch.iml" filepath="$PROJECT_DIR$/WdklLaunch.iml" />
+      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
+    </modules>
+  </component>
+</project>

+ 12 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 1 - 0
README.md

@@ -0,0 +1 @@
+#WdklLaunch

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 52 - 0
app/build.gradle

@@ -0,0 +1,52 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 26
+    buildToolsVersion "26.0.1"
+    defaultConfig {
+        applicationId "com.wdkl.launch"
+        minSdkVersion 16
+        targetSdkVersion 26
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        multiDexEnabled true
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    sourceSets{
+        main{
+            jniLibs.srcDirs=['libs']
+        }
+    }
+}
+allprojects {
+    repositories {
+        jcenter()
+    }
+    gradle.projectsEvaluated {
+        tasks.withType(JavaCompile) {
+            options.compilerArgs << '-Xbootclasspath/p:app/src/main/jniLibs/frame.jar'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+        exclude group: 'com.android.support', module: 'support-annotations'
+    })
+    compile 'com.android.support:appcompat-v7:26.+'
+    compile 'com.android.support.constraint:constraint-layout:1.0.2'
+    testCompile 'junit:junit:4.12'
+    compile 'com.jakewharton:butterknife:7.0.1'
+    compile 'com.github.anrwatchdog:anrwatchdog:1.3.+'
+    //hongyang okhttp
+    compile 'com.zhy:autolayout:1.4.3'
+    compile 'com.zhy:okhttputils:2.6.2'
+    provided files('src/main/jniLibs/frame.jar')
+}

二进制
app/keystore/wdkllaunch.jks


二进制
app/keystore_wuyuqing/platform.pk8


+ 24 - 0
app/keystore_wuyuqing/platform.x509.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIJAP8GQTI8+VUSMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
+VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
+VmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UE
+AwwHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+Fw0xNDEyMjMwNjQzNDFaFw00MjA1MTAwNjQzNDFaMIGUMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+hvcNAQEBBQADggENADCCAQgCggEBAKHY8Fl4XZzpJvgHoezYjhmKPvdq9DGYVc/X
+9NQO5oUlYIA/Ci5rzvljz13KbNve/KxuEu9HN8SzsLg9EBhghOko8JxEg7I8W6uP
+VOoRngNCMvXzjf6av77vxPqphlgq++Y4MIC+fiOxLd+gpYq0p6W7RWxEgrzLHnWi
+CX0dRmWDs+ey2t4f1WKzGoRQQS0Tn21CViThrVEe+zNwANnhErUcvoQB2m4/PQot
+uij7LZNccHJvUOUf5/4wIZd8JOgO3VLwzFO/HhrqUjafCvkpKTjW8oQmHLUz5m40
+ljETGEjqQ6AuAwmaeFT+Bwj1DUaYg+m7AzalJ2aAtHVX0FftRUkCAQOjUDBOMB0G
+A1UdDgQWBBQi+LgbyFfWSoWCbQ+NVDF4ZKTPCjAfBgNVHSMEGDAWgBQi+LgbyFfW
+SoWCbQ+NVDF4ZKTPCjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBH
+1kIQlSBjXRMuQdaDLytr8ZaJXIN1HApg2QA8azYQXOS/B16gwm6tBfh1dL86LL/7
+w09oM9LZv8WwtQyFNjM97vvQvkaOGW/ubhrKOk3+8HTHkEx4n7H6tYGOLdpmWepD
+fBSEFuLwq6yqG6wZFdd7IKO+sPlCxqUpqg40YAb4WOwzDbiuJnswDftP3wIaaJPh
+li6OIjRKyd3Sgw1MtffHOy+WSwqHLkGNgH6GAgvZlvhPA/yim+rjnE9oKV5G6Pyg
+QK7kJJjS/LdeqxE7M7pNRYPhcLT7qhE7MiuBuyqwAMTTBoU8u3lTdOZwNErbRT5t
+SXkgVMffkfN7wBNqpSSY
+-----END CERTIFICATE-----

二进制
app/keystore_wuyuqing/release.keystore


二进制
app/keystore_wuyuqing/signapk.jar


+ 17 - 0
app/keystore_wuyuqing/说明.txt

@@ -0,0 +1,17 @@
+密码 111111 别名 wdkl_key
+玉清
+用此key 编译一个注册的护士主机apk发给彭工
+昨天 19:55
+玉清
+昨天 19:55
+AndroidManifest.xml中的manifest节点中先加入android:sharedUserId="android.uid.system"这个属性,再用release.keystore 编译一个注册的护士主机apk发给彭工
+
+工程根目录下修改说明文件 wuyq_callingdoor.txt     wuyq_CallingMainNurse.txt,试了,护士主机代码好像不需要root权限,门口机代码需要root权限,所以需要签名,我给的代码只需要用我做好的签名文件,编译出的apk就有root权限了。做了点小修改,有 wuyq的注明和 wuyq_callingdoor.txt     wuyq_CallingMainNurse.txt 这两个文件说明。
+
+签名文件 platform.x509.pem platform.pk8 也提供了,当然 用我生成的 key 文件 release.keystore 生成apk即可,不需要单独签名(就已经具备root权限)
+玉清
+15:36
+gradle中添加了点内容,保重在运行android studio时,就具备系统权限调试。
+
+去掉了导航条的镜像 在百度上有 链接:https://pan.baidu.com/s/1CBkIxDpSF_9EodlgQTiAug 
+提取码:arfn 

+ 25 - 0
app/proguard-rules.pro

@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\fengxiangqian\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# 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

二进制
app/sign_apk/Wdkllaunch.apk


二进制
app/sign_apk/Wdkllaunch_V1.00_20190614_3368_T2.apk


二进制
app/sign_apk/Wdkllaunch_V1.0_20190520.apk


二进制
app/sign_apk/Wdkllaunch_V1.0_20190604_3368.apk


二进制
app/sign_apk/Wdkllaunch_V1.0_20190604_A20.apk


二进制
app/sign_apk/Wdkllaunch_V1.0_20190708_A20.apk


二进制
app/sign_apk/Wdkllaunch_V1.0_20190709_A20.apk


二进制
app/sign_apk/platform.pk8


+ 27 - 0
app/sign_apk/platform.x509.pem

@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEqDCCA5CgAwIBAgIJALOZgIbQVs/6MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
+VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
+VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
+AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+Fw0wODA0MTUyMjQwNTBaFw0zNTA5MDEyMjQwNTBaMIGUMQswCQYDVQQGEwJVUzET
+MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
+A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+hvcNAQEBBQADggENADCCAQgCggEBAJx4BZKsDV04HN6qZezIpgBuNkgMbXIHsSAR
+vlCGOqvitV0Amt9xRtbyICKAx81Ne9smJDuKgGwms0sTdSOkkmgiSQTcAUk+fArP
+GgXIdPabA3tgMJ2QdNJCgOFrrSqHNDYZUer3KkgtCbIEsYdeEqyYwap3PWgAuer9
+5W1Yvtjo2hb5o2AJnDeoNKbf7be2tEoEngeiafzPLFSW8s821k35CjuNjzSjuqtM
+9TNxqydxmzulh1StDFP8FOHbRdUeI0+76TybpO35zlQmE1DsU1YHv2mi/0qgfbX3
+6iANCabBtJ4hQC+J7RGQiTqrWpGA8VLoL4WkV1PPX8GQccXuyCcCAQOjgfwwgfkw
+HQYDVR0OBBYEFE/koLPdnLop9x1yh8Tnw48ghsKZMIHJBgNVHSMEgcEwgb6AFE/k
+oLPdnLop9x1yh8Tnw48ghsKZoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
+CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
+QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
+CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJALOZgIbQVs/6MAwGA1Ud
+EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBAFclUbjZOh9z3g9tRp+G2tZwFAAp
+PIigzXzXeLc9r8wZf6t25iEuVsHHYc/EL9cz3lLFCuCIFM78CjtaGkNGBU2Cnx2C
+tCsgSL+ItdFJKe+F9g7dEtctVWV+IuPoXQTIMdYT0Zk4u4mCJH+jISVroS0dao+S
+6h2xw3Mxe6DAN/DRr/ZFrvIkl5+6bnoUvAJccbmBOM7z3fwFlhfPJIRc97QNY4L3
+J17XOElatuWTG5QhdlxJG3L7aOCA29tYwgKdNHyLMozkPvaosVUz7fvpib1qSN1L
+IC7alMarjdW4OZID2q4u1EYjLk/pvZYTlMYwDlE448/Shebk5INTjLixs1c=
+-----END CERTIFICATE-----

二进制
app/sign_apk/signapk.jar


+ 11 - 0
app/sign_apk/签名

@@ -0,0 +1,11 @@
+/**
+*  dengzhe 2018/06/29
+**/
+打包流程:
+cd app
+cd sign_apk
+java -jar signapk.jar platform.x509.pem platform.pk8 app-release-unsigned.apk Wdkllaunch.apk
+adb install Wdkllaunch.apk
+
+打包测试屏蔽:AndroidManifest.xml
+android:sharedUserId="android.uid.system"

+ 26 - 0
app/src/androidTest/java/com/example/dengzhe/launch/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.example.dengzhe.launch;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() throws Exception {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("com.example.dengzhe.autostartdemo", appContext.getPackageName());
+    }
+}

+ 63 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    coreApp="true"
+    package="com.wdkl.launch">
+    <!-- android:sharedUserId="android.uid.system" -->
+    <!-- coreApp="true" -->
+    <uses-permission
+        android:name="android.permission.WRITE_SECURE_SETTINGS"
+        tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
+    <uses-permission
+        android:name="android.permission.FORCE_STOP_PACKAGES"
+        tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.GET_TASKS" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:process="system"
+        android:theme="@style/AppTheme">
+        <!-- android:process="system" -->
+        <activity
+            android:name=".MainActivity"
+            android:launchMode="singleTask">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.HOME" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="com.wdkl.launch.ListAppActivity" />
+
+        <receiver
+            android:name=".BootUpReceiver"
+            android:enabled="true"
+            android:exported="true"
+            android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
+            android:priority="1000">
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+                <action android:name="android.intent.action.USER_PRESENT" />
+                <action android:name="android.intent.action.QUICK_CLOCK" />
+                <action android:name="android.intent.action.PACKAGE_ADDED" />
+                <action android:name="android.intent.action.PACKAGE_REMOVED" />
+
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="package" />
+
+            </intent-filter>
+        </receiver>
+        <service android:name=".Launcher" />
+    </application>
+
+</manifest>

+ 26 - 0
app/src/main/java/com/wdkl/launch/BootUpReceiver.java

@@ -0,0 +1,26 @@
+package com.wdkl.launch;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * Created by dengzhe on 2017/11/28.
+ */
+
+public class BootUpReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
+                intent.getAction().equals(Intent.ACTION_USER_PRESENT) ||
+                intent.getAction().equals(Intent.ACTION_QUICK_CLOCK)
+                || intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
+            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+            PendingIntent pi = PendingIntent.getService(context, 0, new Intent(context, Launcher.class), PendingIntent.FLAG_UPDATE_CURRENT);
+            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, pi);
+        }
+    }
+}

+ 116 - 0
app/src/main/java/com/wdkl/launch/Launcher.java

@@ -0,0 +1,116 @@
+package com.wdkl.launch;
+
+import android.app.ActivityManager;
+import android.app.Service;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import com.wdkl.launch.util.EthernetStatus;
+
+import java.util.List;
+
+public class Launcher extends Service {
+
+    @Nullable
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+
+        new AsyncTask<Service, Void, Service>() {
+            @Override
+            protected Service doInBackground(Service... params) {
+
+                if (systemVersionIsO()) {//安卓8.1.0 版用
+
+                } else {
+                    //以太网开关; 床 门 主 传统 机 要打开;
+                    EthernetStatus.getInstance().setEthernetEnable(true);
+                }
+
+                Service service = params[0];
+                checkApkLaunch(service);
+                return service;
+            }
+
+            @Override
+            protected void onPostExecute(Service service) {
+                service.stopSelf();
+            }
+
+        }.execute(this);
+
+        return START_STICKY;
+    }
+
+    /**
+     * 判断是否是8.0以上的系统版本
+     *
+     * @return
+     */
+    public static boolean systemVersionIsO() {
+        if (android.os.Build.VERSION.SDK_INT >= 26) {//8.0以上的系统
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 判断服务是否开启
+     *
+     * @param context
+     * @return
+     */
+    public static void checkApkLaunch(Context context) {
+        List<String> listPackageName = ShareData.getUniversalPackageName(context);
+        if (null != listPackageName && listPackageName.size() > 0) {
+            for (String s : listPackageName) {
+                try {
+                    Intent target = context.getPackageManager().getLaunchIntentForPackage(s);
+                    target.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                    if (target != null) {
+                        context.startActivity(target);
+                    }
+                } catch (ActivityNotFoundException e) {
+                    Log.d("checkApkLaunch", "ActivityNotFoundException");
+                } catch (Exception e) {
+                    Log.d("checkApkLaunch", "Exception");
+                }
+            }
+        }
+    }
+
+    /**
+     * 判断服务是否开启
+     *
+     * @param className 这里是包名+类名
+     * @return
+     */
+    public static boolean isServiceRunning(Context mContext, String className) {
+        boolean isRunning = false;
+        ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);
+
+        if (!(serviceList.size() > 0)) {
+            return isRunning;
+        }
+
+        for (int i = 0; i < serviceList.size(); i++) {
+            if (serviceList.get(i).service.getClassName().equals(className) == true) {
+                isRunning = true;
+                break;
+            }
+        }
+
+        return isRunning;
+    }
+}

+ 69 - 0
app/src/main/java/com/wdkl/launch/ListAppActivity.java

@@ -0,0 +1,69 @@
+package com.wdkl.launch;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.wdkl.launch.runningApp.Programe;
+import com.wdkl.launch.runningApp.RunningApp;
+
+import java.util.List;
+
+/**
+ * Created by dengzhe on 2018/1/4.
+ */
+
+public class ListAppActivity extends ListActivity {
+
+    private String[] list;
+    private String[] listPackage;
+    private List<Programe> mList;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mList = RunningApp.getInstance().getAllAppNamesPackages(this);
+        list = new String[mList.size()];
+        listPackage = new String[mList.size()];
+        int i = 0;
+        for (Programe p : mList) {
+            p.getName();
+            p.getContent();
+            list[i] = "程序名称:" + p.getName();
+            listPackage[i] = p.getContent();
+            i++;
+        }
+        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
+
+    }
+
+    @Override
+    protected void onListItemClick(ListView l, View v, int position, long id) {
+        super.onListItemClick(l, v, position, id);
+        startAPP(listPackage[position]);
+    }
+
+    /*
+    * 启动一个app
+    */
+    public void startAPP(String appPackageName) {
+        try {
+            Intent intent = this.getPackageManager().getLaunchIntentForPackage(appPackageName);
+            startActivity(intent);
+        } catch (Exception e) {
+            Toast.makeText(this, "没有安装", Toast.LENGTH_LONG).show();
+        }
+    }
+
+
+    @Override
+    public void setListAdapter(ListAdapter adapter) {
+        super.setListAdapter(adapter);
+    }
+}

+ 184 - 0
app/src/main/java/com/wdkl/launch/MainActivity.java

@@ -0,0 +1,184 @@
+package com.wdkl.launch;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.provider.Settings;
+import android.support.v7.app.AppCompatActivity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.wdkl.launch.anrfcutil.AnrFcExceptionUtil;
+import com.wdkl.launch.runningApp.RunningUtil;
+import com.wdkl.launch.util.EthernetStatus;
+
+public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
+
+    float x1 = 0;
+    float x2 = 0;
+    float y1 = 0;
+    float y2 = 0;
+
+    Button mBtnF;
+    Button mBtnS;
+    Button mBtnT;
+    Button mBtnFo;
+    Button mBtnSi;
+    TextView mTvFo;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        //ANR奔溃异常处理
+        AnrFcExceptionUtil.getInstance(getApplication()).initFCException();
+        Intent intent = new Intent(this, Launcher.class);
+        startService(intent);
+
+        mBtnF = (Button) findViewById(R.id.activity_main_first_btn);
+        mBtnS = (Button) findViewById(R.id.activity_main_second_btn);
+        mBtnT = (Button) findViewById(R.id.activity_main_third_btn);
+        mBtnFo = (Button) findViewById(R.id.activity_main_four_btn);
+        mBtnSi = (Button) findViewById(R.id.activity_main_six_btn);
+        mTvFo = (TextView) findViewById(R.id.activity_main_first_tv);
+
+        mBtnF.setOnClickListener(this);
+        mBtnS.setOnClickListener(this);
+        mBtnT.setOnClickListener(this);
+        mBtnFo.setOnClickListener(this);
+        mBtnSi.setOnClickListener(this);
+
+        //mBtnF.setOnTouchListener(this);
+        //mBtnS.setOnTouchListener(this);
+        //mBtnT.setOnTouchListener(this);
+        //mBtnFo.setOnTouchListener(this);
+        //mBtnSi.setOnTouchListener(this);
+        //Launcher.checkApkLaunch(this);
+
+    }
+
+    final int TIME_WHAT = 1000;
+    public Handler handler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case TIME_WHAT:
+                    handler.sendEmptyMessageDelayed(TIME_WHAT, 3000);
+                    try {
+                        if (!RunningUtil.appIsRunning(MainActivity.this)) {
+                            Launcher.checkApkLaunch(MainActivity.this);
+                        }
+                    } catch (Exception e) {
+                    }
+                    break;
+            }
+        }
+    };
+
+
+    public String mInput = "";
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.activity_main_first_btn:
+                mInput = mInput + "1";
+                break;
+            case R.id.activity_main_second_btn:
+                mInput = mInput + "2";
+                break;
+            case R.id.activity_main_third_btn:
+                mInput = mInput + "3";
+                break;
+            case R.id.activity_main_four_btn:
+                mInput = mInput + "4";
+                if (mInput.equals("1234")) {
+                    mTvFo.setText("");
+                    Intent intent = new Intent(this, ListAppActivity.class);
+                    startActivity(intent);
+                } else {
+                    mTvFo.setText("密码有误,请重试");
+                }
+                mInput = "";
+                break;
+            case R.id.activity_main_six_btn:
+                Launcher.checkApkLaunch(this);
+                break;
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Launcher.checkApkLaunch(this);
+
+        if (Launcher.systemVersionIsO()) {//安卓8.1.0 版用
+
+        } else {
+            handler.sendEmptyMessageDelayed(TIME_WHAT, 3000);
+        }
+
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            //当手指按下的时候
+            x1 = event.getX();
+            y1 = event.getY();
+        }
+        if (event.getAction() == MotionEvent.ACTION_UP) {
+            //当手指离开的时候
+            x2 = event.getX();
+            y2 = event.getY();
+            if (y1 - y2 > 400) {
+                startActivity(new Intent(Settings.ACTION_SETTINGS));
+            }
+        }
+        return super.onTouchEvent(event);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        if (event.getAction() != MotionEvent.ACTION_UP) return false;
+        switch (v.getId()) {
+            case R.id.activity_main_first_btn:
+                mInput = mInput + "1";
+                break;
+            case R.id.activity_main_second_btn:
+                mInput = mInput + "2";
+                break;
+            case R.id.activity_main_third_btn:
+                mInput = mInput + "3";
+                break;
+            case R.id.activity_main_four_btn:
+                mInput = mInput + "4";
+                if (mInput.equals("1234")) {
+                    mTvFo.setText("");
+                    Intent intent = new Intent(MainActivity.this, ListAppActivity.class);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                    startActivity(intent);
+                } else {
+                    mTvFo.setText("密码有误,请重试");
+                }
+                mInput = "";
+                break;
+            case R.id.activity_main_six_btn:
+                Launcher.checkApkLaunch(this);
+                break;
+        }
+        return false;
+    }
+}

+ 119 - 0
app/src/main/java/com/wdkl/launch/ShareData.java

@@ -0,0 +1,119 @@
+package com.wdkl.launch;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by dengzhe on 2018/1/3.
+ */
+
+public class ShareData {
+
+    public static final String PREFERENCE_PACKADOC = "com.wdkl.callingmaindoctor";
+    public static final String PREFERENCE_PACKAGEM = "com.wdkl.callingmainnurse";
+    public static final String PREFERENCE_PACKAGED = "com.wdkl.callingdoor";
+    public static final String PREFERENCE_PACKAGEB = "com.wdkl.callingbed";
+    public static final String PREFERENCE_PACKAGET = "com.wdkl.tradition";
+
+    public static final String PREFERENCE_PACKAWATCH = "com.wdkl.nursewatch";
+    public static final String PREFERENCE_PACKAINFOR = "com.wdkl.information";
+    public static final String PREFERENCE_PACKAUSER = "com.wdkl.care_user";
+    public static final String PREFERENCE_PACKASTATION = "com.wdkl.care_station";
+
+    public static final String UNIVERSAL_STRING = "com.wdkl.";
+
+    public static String packageName = null;
+
+    public static String getPackageName(Context context) throws PackageManager.NameNotFoundException {
+        Context c = null;
+        try {
+            c = context.createPackageContext(PREFERENCE_PACKAGEM, Context.CONTEXT_IGNORE_SECURITY);
+            packageName = PREFERENCE_PACKAGEM;
+        } catch (PackageManager.NameNotFoundException e) {
+            try {
+                c = context.createPackageContext(PREFERENCE_PACKAGED, Context.CONTEXT_IGNORE_SECURITY);
+                packageName = PREFERENCE_PACKAGED;
+            } catch (PackageManager.NameNotFoundException e1) {
+                try {
+                    c = context.createPackageContext(PREFERENCE_PACKAGEB, Context.CONTEXT_IGNORE_SECURITY);
+                    packageName = PREFERENCE_PACKAGEB;
+                } catch (PackageManager.NameNotFoundException e2) {
+                    try {
+                        c = context.createPackageContext(PREFERENCE_PACKAGET, Context.CONTEXT_IGNORE_SECURITY);
+                        packageName = PREFERENCE_PACKAGET;
+                    } catch (PackageManager.NameNotFoundException e3) {
+                        try {
+                            c = context.createPackageContext(PREFERENCE_PACKADOC, Context.CONTEXT_IGNORE_SECURITY);
+                            packageName = PREFERENCE_PACKADOC;
+                        } catch (PackageManager.NameNotFoundException e4) {
+                            try {
+                                c = context.createPackageContext(PREFERENCE_PACKAWATCH, Context.CONTEXT_IGNORE_SECURITY);
+                                packageName = PREFERENCE_PACKAWATCH;
+                            } catch (PackageManager.NameNotFoundException e5) {
+                                try {
+                                    c = context.createPackageContext(PREFERENCE_PACKAINFOR, Context.CONTEXT_IGNORE_SECURITY);
+                                    packageName = PREFERENCE_PACKAINFOR;
+                                } catch (PackageManager.NameNotFoundException e6) {
+                                    try {
+                                        c = context.createPackageContext(PREFERENCE_PACKAUSER, Context.CONTEXT_IGNORE_SECURITY);
+                                        packageName = PREFERENCE_PACKAUSER;
+                                    } catch (PackageManager.NameNotFoundException e7) {
+                                        try {
+                                            c = context.createPackageContext(PREFERENCE_PACKASTATION, Context.CONTEXT_IGNORE_SECURITY);
+                                            packageName = PREFERENCE_PACKASTATION;
+                                        } catch (PackageManager.NameNotFoundException e8) {
+
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return packageName != null ? packageName : "";
+    }
+
+
+    public static List<String> getUniversalPackageName(Context context) {
+        PackageManager pm = context.getPackageManager();
+        List<PackageInfo> list = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
+        List<String> listPackageName = new ArrayList<>();
+        for (PackageInfo packageInfo : list) {
+            //String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
+            String packageName = packageInfo.packageName;
+            if (vagueInquiry(packageName, UNIVERSAL_STRING)&& !"com.wdkl.launch".equals(packageName)){
+                listPackageName.add(packageName);
+            }
+        }
+
+        return listPackageName;
+    }
+
+    /**
+     * String字符串的匹配(做模糊查询)
+     *
+     * @param objStr
+     * @param inquiryStr
+     * @return boolean
+     */
+    public static boolean vagueInquiry(String objStr, String inquiryStr) {
+        if (null == objStr || null == inquiryStr) {
+            return false;
+        }
+        Pattern p = Pattern.compile(inquiryStr);
+        Matcher m = p.matcher(objStr);
+        return m.find();
+    }
+
+
+}

+ 121 - 0
app/src/main/java/com/wdkl/launch/anrfcutil/AnrFcExceptionUtil.java

@@ -0,0 +1,121 @@
+package com.wdkl.launch.anrfcutil;
+
+import android.annotation.SuppressLint;
+import android.app.AlarmManager;
+import android.app.Application;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Looper;
+import android.util.Log;
+
+import com.github.anrwatchdog.ANRError;
+import com.github.anrwatchdog.ANRWatchDog;
+import com.wdkl.launch.MainActivity;
+
+/**
+ * Created by dengzhe on 2018/4/2.
+ * //=========================FC&ANR异常处理类=========================//
+ */
+
+public class AnrFcExceptionUtil implements Thread.UncaughtExceptionHandler {
+
+    private static ANRWatchDog mANRWatchDog;
+    private Thread.UncaughtExceptionHandler mDefaultHandler;
+    public static final String TAG = "MyApplication";
+    private static Application application;
+    /**
+     * ANR FC  ANR 奔溃 异常处理
+     */
+    public static Class ANR_FC = MainActivity.class;
+
+    private static AnrFcExceptionUtil mAnrFcExceptionUtil;
+
+    public static AnrFcExceptionUtil getInstance(Application application) {
+        if (mAnrFcExceptionUtil == null) {
+            mAnrFcExceptionUtil = new AnrFcExceptionUtil(application);
+        }
+        return mAnrFcExceptionUtil;
+    }
+
+    private AnrFcExceptionUtil(Application application) {
+        //获取系统默认的UncaughtException处理器
+        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        this.application = application;
+    }
+
+    @SuppressWarnings("WrongConstant")
+    @Override
+    public void uncaughtException(Thread thread, Throwable ex) {
+        if (!handleException(ex) && mDefaultHandler != null) {
+            //如果用户没有处理则让系统默认的异常处理器来处理
+            mDefaultHandler.uncaughtException(thread, ex);
+        } else {
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                Log.e(TAG, "error : ", e);
+            }
+            Intent intent = new Intent(application.getApplicationContext(), ANR_FC);
+            @SuppressLint("WrongConstant") PendingIntent restartIntent = PendingIntent.getActivity(
+                    application.getApplicationContext(), 0, intent,
+                    Intent.FLAG_ACTIVITY_NEW_TASK);
+            //退出程序
+            AlarmManager mgr = (AlarmManager) application.getSystemService(Context.ALARM_SERVICE);
+            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
+                    restartIntent); // 1秒钟后重启应用
+            //杀死该应用进程
+            android.os.Process.killProcess(android.os.Process.myPid());
+        }
+    }
+
+    /**
+     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
+     *
+     * @param ex
+     * @return true:如果处理了该异常信息;否则返回false.
+     */
+    private boolean handleException(Throwable ex) {
+        if (ex == null) {
+            return false;
+        }
+        //使用Toast来显示异常信息
+        new Thread() {
+            @Override
+            public void run() {
+                Looper.prepare();
+//                Toast.makeText(application.getApplicationContext(), "很抱歉,程序出现异常,即将重新启动.",
+//                        Toast.LENGTH_SHORT).show();
+                Looper.loop();
+            }
+        }.start();
+        return true;
+    }
+
+
+    /**
+     * 崩溃异常处理
+     */
+    public static void initFCException() {
+        //设置该CrashHandler为程序的默认处理器
+        AnrFcExceptionUtil catchExcep = AnrFcExceptionUtil.getInstance(application);
+        Thread.setDefaultUncaughtExceptionHandler(catchExcep);
+        mANRWatchDog = new ANRWatchDog(5000);
+        mANRWatchDog.setInterruptionListener(new ANRWatchDog.InterruptionListener() {
+            @Override
+            public void onInterrupted(InterruptedException exception) {
+            }
+        }).setIgnoreDebugger(true).setANRListener(new ANRWatchDog.ANRListener() {
+            @Override
+            public void onAppNotResponding(ANRError error) {
+                Intent mStartActivity = new Intent(application.getApplicationContext(), ANR_FC);
+                int mPendingIntentId = 123456;
+                PendingIntent mPendingIntent = PendingIntent.getActivity(application.getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+                AlarmManager mgr = (AlarmManager) application.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
+                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1500, mPendingIntent);
+                android.os.Process.killProcess(android.os.Process.myPid());
+            }
+        }).start();
+
+    }
+}

+ 55 - 0
app/src/main/java/com/wdkl/launch/runningApp/Programe.java

@@ -0,0 +1,55 @@
+package com.wdkl.launch.runningApp;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * Created by dengzhe on 2018/1/3.
+ */
+
+public class Programe {
+    // 图标
+    private Drawable icon;
+    // 程序名
+    private String name;
+    private String pID;
+    private String memory;
+    private String content;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Drawable getIcon() {
+        return icon;
+    }
+
+    public void setIcon(Drawable icon) {
+        this.icon = icon;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setPID(String id){
+        this.pID = id;
+    }
+    public  String getPID(){
+        return pID;
+    }
+
+    public void setMemory(String m){
+        this.memory = m;
+    }
+    public String getMemory(){
+        return memory;
+    }
+}

+ 58 - 0
app/src/main/java/com/wdkl/launch/runningApp/RunningApp.java

@@ -0,0 +1,58 @@
+package com.wdkl.launch.runningApp;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by dengzhe on 2018/1/3.
+ */
+
+public class RunningApp {
+
+    private ActivityManager am;
+    private List<ActivityManager.RunningAppProcessInfo> run;
+    private PackageManager pm;
+    private PackageInfo pi;
+    private List<Programe> mP = new ArrayList<>();
+
+
+    private static final RunningApp ourInstance = new RunningApp();
+
+    public static RunningApp getInstance() {
+        return ourInstance;
+    }
+    public PackageManager getPm() {
+        return pm;
+    }
+
+    // 正在运行的
+    public List<Programe> getAllAppNamesPackages(Context context) {
+        pm = context.getPackageManager();
+        List<PackageInfo> list = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
+        if (!mP.isEmpty())
+            mP.clear();
+        for (PackageInfo packageInfo : list) {
+            //获取到设备上已经安装的应用的名字,即在AndriodMainfest中的app_name。
+            String appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
+            //获取到应用所在包的名字,即在AndriodMainfest中的package的值。
+            String packageName = packageInfo.packageName;
+            Log.i("zyn", "应用的名字:" + appName);
+            Log.i("zyn", "应用的包名字:" + packageName);
+            Programe programe = new Programe();
+            programe.setName(appName);
+            programe.setContent(packageName);
+            mP.add(programe);
+        }
+        return mP;
+    }
+
+}

+ 71 - 0
app/src/main/java/com/wdkl/launch/runningApp/RunningUtil.java

@@ -0,0 +1,71 @@
+package com.wdkl.launch.runningApp;
+
+import android.app.ActivityManager;
+import android.content.Context;
+
+import com.wdkl.launch.ShareData;
+
+import java.util.List;
+
+public class RunningUtil {
+
+    /**
+     * 方法描述:判断app是否正在运行
+     */
+    public static boolean appIsRunning(Context context) {
+        if (isAppRunning(context, ShareData.PREFERENCE_PACKADOC)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAGEM)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAGED)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAGEB)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAGET)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAWATCH)
+                || isAppRunning(context, ShareData.PREFERENCE_PACKAINFOR)) {
+            return true;
+
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 方法描述:判断某一应用是否正在运行
+     *
+     * @param context     上下文
+     * @param packageName 应用的包名
+     * @return true 表示正在运行,false表示没有运行
+     */
+    public static boolean isAppRunning(Context context, String packageName) {
+        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);
+        if (list.size() <= 0) {
+            return false;
+        }
+        for (ActivityManager.RunningTaskInfo info : list) {
+            if (info.baseActivity.getPackageName().equals(packageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 方法描述:判断某一Service是否正在运行
+     *
+     * @param context     上下文
+     * @param serviceName Service的全路径: 包名 + service的类名
+     * @return true 表示正在运行,false 表示没有运行
+     */
+    public static boolean isServiceRunning(Context context, String serviceName) {
+        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200);
+        if (runningServiceInfos.size() <= 0) {
+            return false;
+        }
+        for (ActivityManager.RunningServiceInfo serviceInfo : runningServiceInfos) {
+            if (serviceInfo.service.getClassName().equals(serviceName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 101 - 0
app/src/main/java/com/wdkl/launch/util/EthernetStatus.java

@@ -0,0 +1,101 @@
+package com.wdkl.launch.util;
+
+import android.net.ethernet.EthernetDevInfo;
+import android.net.ethernet.EthernetManager;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * 以太网开关
+ * Created by dengzhe on 2018/06/28.
+ */
+
+public class EthernetStatus {
+
+    private static EthernetStatus mEthernetStatus;
+    private EthernetManager mEthernetManager;
+    private EthernetDevInfo savedConfig;
+
+
+    public static EthernetStatus getInstance() {
+        if (mEthernetStatus == null) {
+            mEthernetStatus = new EthernetStatus();
+        }
+        return mEthernetStatus;
+    }
+
+    public EthernetStatus() {
+        mEthernetManager = EthernetManager.getInstance();
+    }
+
+    /**
+     * 以太网开关
+     *
+     * @param status
+     */
+    public void setEthernetEnable(boolean status) {
+        if (!isEthOn() && mEthernetManager != null) {
+            mEthernetManager.setEnabled(status);
+            Log.e("以太网:", "操作开关: " + "去打开");
+        }
+        Log.e("以太网:", "操作开关状态: " + isEthOn());
+    }
+
+    private boolean isEthOn() {
+        try {
+            String line;
+            boolean r = false;
+            Process p = Runtime.getRuntime().exec("netcfg");
+            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
+            while ((line = input.readLine()) != null) {
+                if (line.contains("eth0")) {
+                    if (line.contains("UP")) {
+                        r = true;
+                    } else {
+                        r = false;
+                    }
+                }
+            }
+            input.close();
+//            Log.e("以太网:", "isEthOn: " + r);
+            return r;
+        } catch (IOException e) {
+            Log.e("以太网:", "Runtime Error: " + e.getMessage());
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    private String configInfo = "";
+
+    /**
+     * 以太网设备信息
+     *
+     * @return
+     */
+    public String getSavedConfig() {
+        try {
+            savedConfig = mEthernetManager.getSavedConfig();
+            configInfo = "以太网设备信息:\n";
+            if (savedConfig == null && !isEthOn()) {
+                configInfo += "网卡异常";
+            }
+            configInfo += "\tDnsAddr:" + savedConfig.getDnsAddr();
+            configInfo += "\tGateWay:" + savedConfig.getGateWay();
+            configInfo += "\nIfName:" + savedConfig.getIfName();
+            configInfo += "\tIpAddress:" + savedConfig.getIpAddress();
+            configInfo += "\nHwaddr:" + savedConfig.getHwaddr();
+            configInfo += "\tNetMask:" + savedConfig.getNetMask();
+            Log.i("以太网:", "信息: " + configInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return configInfo;
+
+    }
+
+
+}

二进制
app/src/main/jniLibs/frame.jar


+ 7 - 0
app/src/main/res/drawable/selector_click.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/shape_sel_click" android:state_pressed="true" />
+    <item android:drawable="@drawable/shape_nor_click" android:state_pressed="false" />
+    <item android:drawable="@drawable/shape_nor_click" android:state_enabled="false" />
+
+</selector>

+ 5 - 0
app/src/main/res/drawable/shape_nor_click.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#000000" />
+</shape>

+ 10 - 0
app/src/main/res/drawable/shape_receive_date.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="8dp" />
+
+    <stroke android:width="1dp" android:color="#ffffff" />
+
+    <solid android:color="#ffffff" />
+
+</shape>

+ 5 - 0
app/src/main/res/drawable/shape_sel_click.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#ffffff" />
+</shape>

+ 55 - 0
app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#000000">
+
+    <TextView
+        android:id="@+id/activity_main_first_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="90dp"
+        android:text=""
+        android:textColor="#ffffff" />
+
+    <Button
+        android:id="@+id/activity_main_first_btn"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:background="@drawable/selector_click" />
+
+    <Button
+        android:id="@+id/activity_main_second_btn"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_alignParentRight="true"
+        android:background="@drawable/selector_click" />
+
+    <Button
+        android:id="@+id/activity_main_third_btn"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:background="@drawable/selector_click" />
+
+    <Button
+        android:id="@+id/activity_main_four_btn"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_alignParentBottom="true"
+        android:background="@drawable/selector_click" />
+
+    <Button
+        android:id="@+id/activity_main_six_btn"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/selector_click"
+        android:text="启动按钮"
+        android:textColor="#ffffff" />
+
+</RelativeLayout>

二进制
app/src/main/res/mipmap-hdpi/ic_launcher.png


二进制
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


二进制
app/src/main/res/mipmap-mdpi/ic_launcher.png


二进制
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


二进制
app/src/main/res/mipmap-xhdpi/ic_launcher.png


二进制
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


二进制
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


二进制
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


二进制
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


二进制
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 6 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+</resources>

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">启动器</string>
+</resources>

+ 15 - 0
app/src/main/res/values/styles.xml

@@ -0,0 +1,15 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+        <item name="windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+        <!-- 使用 API Level 22 編譯的話,要拿掉前綴字 -->
+        <item name="windowNoTitle">true</item>
+    </style>
+
+</resources>

二进制
app/wdkl_launch_V1.0_20190507.apk


二进制
app/wdkllaunch.zip


+ 31 - 0
build.gradle

@@ -0,0 +1,31 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        jcenter()
+        maven {
+            url 'https://maven.google.com/'
+            name 'Google'
+        }
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:2.3.3'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        maven {
+            url 'https://maven.google.com/'
+            name 'Google'
+        }
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 14 - 0
gradle.properties

@@ -0,0 +1,14 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+android.overridePathCheck=true
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true

二进制
gradle/wrapper/gradle-wrapper.jar


+ 6 - 0
gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Tue Nov 28 14:46:35 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

+ 160 - 0
gradlew

@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90 - 0
gradlew.bat

@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 1 - 0
settings.gradle

@@ -0,0 +1 @@
+include ':app'