├── .gitignore
├── Android_debugdata_webtool
├── app
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ └── layout
│ │ │ │ └── activity_main.xml
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java
│ │ │ └── com
│ │ │ └── itgowo
│ │ │ └── tool
│ │ │ └── android_debugdata_webtool
│ │ │ ├── MainActivity.java
│ │ │ └── DBManager.java
│ ├── proguard-rules.pro
│ └── build.gradle
├── webtoollibrary
│ ├── .gitignore
│ ├── src
│ │ └── main
│ │ │ ├── assets
│ │ │ ├── images
│ │ │ │ ├── bg.jpg
│ │ │ │ ├── file.png
│ │ │ │ ├── favicon.ico
│ │ │ │ ├── folder.png
│ │ │ │ ├── sort_asc.png
│ │ │ │ ├── sort_both.png
│ │ │ │ ├── sort_desc.png
│ │ │ │ ├── sort_asc_disabled.png
│ │ │ │ └── sort_desc_disabled.png
│ │ │ ├── language
│ │ │ │ └── Chinese.json
│ │ │ ├── custom.css
│ │ │ ├── css
│ │ │ │ ├── select.dataTables.min.css
│ │ │ │ ├── responsive.dataTables.min.css
│ │ │ │ └── buttons.dataTables.min.css
│ │ │ ├── index.html
│ │ │ └── js
│ │ │ │ ├── dataTables.responsive.min.js
│ │ │ │ └── dataTables.select.min.js
│ │ │ ├── java
│ │ │ └── android_debugdata_webtool
│ │ │ │ └── tool
│ │ │ │ └── itgowo
│ │ │ │ └── com
│ │ │ │ └── webtoollibrary
│ │ │ │ ├── utils
│ │ │ │ ├── Constants.java
│ │ │ │ ├── DebugDataAutoInitProvider.java
│ │ │ │ ├── NetworkUtils.java
│ │ │ │ ├── Utils.java
│ │ │ │ ├── PrefHelper.java
│ │ │ │ └── TableNameParser.java
│ │ │ │ ├── action
│ │ │ │ ├── Action.java
│ │ │ │ ├── ActionAddDataToSp.java
│ │ │ │ ├── ActionUpdateDataToSp.java
│ │ │ │ ├── ActionDeleteDataFromSp.java
│ │ │ │ ├── ActionGetSpList.java
│ │ │ │ ├── ActionGetDataFromSpFile.java
│ │ │ │ ├── ActionAddDataToDb.java
│ │ │ │ ├── ActionUpdateDataToDb.java
│ │ │ │ ├── ActionDeleteDataFromDb.java
│ │ │ │ ├── ActionGetTableList.java
│ │ │ │ ├── ActionDeleteFile.java
│ │ │ │ ├── ActionGetDbList.java
│ │ │ │ ├── ActionGetDataFromDbTable.java
│ │ │ │ ├── ActionQuery.java
│ │ │ │ └── ActionGetFileList.java
│ │ │ │ ├── onDebugToolListener.java
│ │ │ │ ├── DatabaseManager.java
│ │ │ │ ├── ClientServer.java
│ │ │ │ ├── Request.java
│ │ │ │ ├── ResponseHandler.java
│ │ │ │ ├── HttpRequest.java
│ │ │ │ ├── DebugDataTool.java
│ │ │ │ ├── RequestHandler.java
│ │ │ │ └── Response.java
│ │ │ └── AndroidManifest.xml
│ ├── proguard-rules.pro
│ └── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── .gitignore
├── gradle.properties
├── build.gradle
├── gradlew.bat
└── gradlew
├── img1.png
├── img2.png
├── img3.png
├── img4.png
├── img5.png
├── img6.png
├── img7.png
├── WebTool-Demo1.0.7.apk
├── android-WebDebugTool-1.0.10.aar
├── android-WebDebugTool-1.0.10-sources.jar
├── API
├── deleteFile.md
├── getDbList.md
├── getTableList.md
├── deleteDataFromSp.md
├── deleteDataFromDb.md
├── downloadFile.md
├── updateDataToSp.md
├── getSpList.md
├── addDataToSp.md
├── addDataToDb.md
├── updateDataToDb.md
├── getFileList.md
├── query.md
├── getDataFromSpFile.md
└── getDataFromDbTable.md
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | Android_debugdata_webtool/.idea/
2 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':webtoollibrary'
2 |
--------------------------------------------------------------------------------
/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img1.png
--------------------------------------------------------------------------------
/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img2.png
--------------------------------------------------------------------------------
/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img3.png
--------------------------------------------------------------------------------
/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img4.png
--------------------------------------------------------------------------------
/img5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img5.png
--------------------------------------------------------------------------------
/img6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img6.png
--------------------------------------------------------------------------------
/img7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/img7.png
--------------------------------------------------------------------------------
/WebTool-Demo1.0.7.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/WebTool-Demo1.0.7.apk
--------------------------------------------------------------------------------
/android-WebDebugTool-1.0.10.aar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/android-WebDebugTool-1.0.10.aar
--------------------------------------------------------------------------------
/android-WebDebugTool-1.0.10-sources.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/android-WebDebugTool-1.0.10-sources.jar
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Android_debugdata_webtool
3 |
4 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/Android_debugdata_webtool/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/bg.jpg
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/file.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/favicon.ico
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/folder.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_asc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_asc.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_both.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_both.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_desc.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_asc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_asc_disabled.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_desc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgowo/android-debugdata-webtool/HEAD/Android_debugdata_webtool/webtoollibrary/src/main/assets/images/sort_desc_disabled.png
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Sep 12 14:24:40 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
7 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/language/Chinese.json:
--------------------------------------------------------------------------------
1 | {
2 | "sProcessing": "处理中...",
3 | "sLengthMenu": "显示 _MENU_ 项结果",
4 | "sZeroRecords": "没有匹配结果",
5 | "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
6 | "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
7 | "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
8 | "sInfoPostFix": "",
9 | "sSearch": "搜索:",
10 | "sUrl": "",
11 | "sEmptyTable": "表中数据为空",
12 | "sLoadingRecords": "载入中...",
13 | "sInfoThousands": ",",
14 | "oPaginate": {
15 | "sFirst": "首页",
16 | "sPrevious": "上页",
17 | "sNext": "下页",
18 | "sLast": "末页"
19 | },
20 | "oAria": {
21 | "sSortAscending": ": 以升序排列此列",
22 | "sSortDescending": ": 以降序排列此列"
23 | }
24 | }
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/utils/Constants.java:
--------------------------------------------------------------------------------
1 |
2 |
3 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils;
4 |
5 |
6 | public final class Constants {
7 |
8 | private Constants() {
9 | // This class in not publicly instantiable
10 | }
11 | /**
12 | * 数据库表结构常量, PRAGMA table_info(***)
13 | */
14 | public static final String PrimaryKey = "pk";
15 | public static final String NAME = "name";
16 | public static final String TYPE = "type";
17 | public static final String NotNull = "notnull";
18 | public static final String DefaultValue = "dflt_value";
19 | public static final String NULL = "null";
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
9 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/API/deleteFile.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 删除文件
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | "action": "deleteFile",
16 | "data": "/data/user/0/com.itgowo.tool.android_debugdata_webtool/databases"
17 | }
18 |
19 | ```
20 |
21 | |参数名|必选|类型|说明|
22 | |:---- |:---|:----- |----- |
23 | |action |是 |string |执行动作|
24 | |data |否 |string | 要获取列表的根目录,不传则返回app根目录, |
25 |
26 | **返回示例**
27 |
28 | ```
29 | {
30 | "code": 200,
31 | "msg": "success"
32 | }
33 |
34 | ```
35 |
36 |
37 | **返回参数说明**
38 |
39 | |参数名|类型|说明|
40 | |:----- |:-----|----- |
41 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
42 | |msg |String |返回状态文本,code不是200则提示msg信息 |
43 |
44 |
45 |
46 | **备注**
47 |
48 | - 更多返回错误代码请看首页的错误代码描述
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/Action.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import java.io.File;
6 | import java.util.HashMap;
7 |
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
12 |
13 | /**
14 | * @author lujianchao
15 | */
16 | public interface Action {
17 | Response doAction(Context context, Request request,HttpRequest httpRequest, ResponseHandler responseHandler);
18 | }
19 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/onDebugToolListener.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | /**
4 | * Created by hnvfh on 2017/8/17.
5 | */
6 |
7 | public interface onDebugToolListener {
8 | void onSystemMsg(String mS);
9 |
10 | String onObjectToJson(Object mObject);
11 |
12 | T onJsonStringToObject(String mJsonString, Class mClass);
13 |
14 | /**
15 | * 收到的所有请求
16 | *
17 | * @param mRequest
18 | */
19 | void onGetRequest(String mRequest, HttpRequest mHttpRequest);
20 |
21 | /**
22 | * 只返回请求操作数据,不返回文件
23 | *
24 | * @param mResponse
25 | */
26 | void onResponse(String mResponse);
27 |
28 | /**
29 | * 异常
30 | *
31 | * @param mTip
32 | * @param mThrowable
33 | */
34 | void onError(String mTip, Throwable mThrowable);
35 | }
36 |
--------------------------------------------------------------------------------
/API/getDbList.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取数据库列表
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action : getDbList
16 | }
17 |
18 | ```
19 |
20 | |参数名|必选|类型|说明|
21 | |:---- |:---|:----- |----- |
22 | |action |是 |string |执行动作|
23 |
24 |
25 | **返回示例**
26 |
27 | ```
28 | {
29 | code : 200,
30 | msg : success,
31 | dbList : [
32 | {
33 | fileName: appinfo.db,
34 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/databases/appinfo.db
35 | }
36 | ]
37 | }
38 |
39 | ```
40 |
41 |
42 | **返回参数说明**
43 |
44 | |参数名|类型|说明|
45 | |:----- |:-----|----- |
46 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
47 | |msg |String |返回状态文本,code不是200则提示msg信息 |
48 | |dbList |array |返回结果,数据库文件对象数组 |
49 | |fileName |String |返回结果,文件名 |
50 | |path |String |返回结果,文件路径 |
51 |
52 | **备注**
53 |
54 | - 更多返回错误代码请看首页的错误代码描述
55 |
56 |
57 |
--------------------------------------------------------------------------------
/API/getTableList.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取数据库表列表
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 |
14 | ```
15 | {
16 | action : getTableList,
17 | database : appinfo.db
18 | }
19 |
20 | ```
21 |
22 |
23 |
24 | |参数名|必选|类型|说明|
25 | |:---- |:---|:----- |----- |
26 | |action |是 |string |请求参数|
27 | |database |是 |string | 请求参数 |
28 |
29 |
30 | **返回示例**
31 |
32 | ```
33 |
34 | {
35 | code : 200,
36 | msg : success,
37 | dbVersion : 1,
38 | tableList :[
39 | android_metadata,
40 | historycache,
41 | sqlite_sequence
42 | ]
43 | }
44 |
45 | ```
46 |
47 | **返回参数说明**
48 |
49 | |参数名|类型|说明|
50 | |:----- |:-----|----- |
51 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
52 | |msg |String |返回状态文本,code不是200则提示msg信息 |
53 | |dbVersion |int |数据库版本 |
54 | |tableList |array |数据表名字列表数组 |
55 |
56 | **备注**
57 |
58 | - 更多返回错误代码请看首页的错误代码描述
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
14 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in E:\sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Uncomment this to preserve the line number information for
20 | # debugging stack traces.
21 | #-keepattributes SourceFile,LineNumberTable
22 |
23 | # If you keep the line number information, uncomment this to
24 | # hide the original source file name.
25 | #-renamesourcefileattribute SourceFile
26 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in E:\sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Uncomment this to preserve the line number information for
20 | # debugging stack traces.
21 | #-keepattributes SourceFile,LineNumberTable
22 |
23 | # If you keep the line number information, uncomment this to
24 | # hide the original source file name.
25 | #-renamesourcefileattribute SourceFile
26 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'com.novoda.bintray-release'//添加
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion '27.0.3'
6 | resourcePrefix "webtool_"
7 | defaultConfig {
8 | minSdkVersion 16
9 | targetSdkVersion 25
10 | versionCode 1
11 | versionName "1.0"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | lintOptions {
20 | abortOnError false
21 | }
22 | }
23 |
24 | dependencies {
25 | implementation fileTree(dir: 'libs', include: ['*.jar'])
26 |
27 |
28 | }
29 |
30 |
31 | publish {
32 | userOrg = 'itgowo'
33 | groupId = 'com.itgowo'
34 | artifactId = 'android-WebDebugTool'
35 | publishVersion = '1.0.10'
36 | desc = 'An Android Debug Tool(Database/SharedPreferences/FileManager)'
37 | website = 'https://github.com/hnsugar/android-debugdata-webtool'
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | maven { url 'http://maven.aliyun.com/repository/public/'}
6 | maven { url 'http://maven.itgowo.com/repository/maven-public/'}
7 | }
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.1.4'
10 | classpath 'com.novoda:bintray-release:0.8.1'
11 | // NOTE: Do not place your application dependencies here; they belong
12 | // in the individual module build.gradle files
13 | }
14 | }
15 |
16 | allprojects {
17 | tasks.withType(Javadoc) {
18 | options{
19 | encoding "UTF-8"
20 | charSet 'UTF-8'
21 | links "http://docs.oracle.com/javase/7/docs/api"
22 | }
23 | }
24 | repositories {
25 | maven { url 'http://maven.aliyun.com/repository/public/'}
26 | maven { url 'http://maven.itgowo.com/repository/maven-public/'}
27 | }
28 | }
29 |
30 | task clean(type: Delete) {
31 | delete rootProject.buildDir
32 | }
33 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion '27.0.3'
6 | defaultConfig {
7 | applicationId "com.itgowo.tool.android_debugdata_webtool"
8 | minSdkVersion 19
9 | targetSdkVersion 25
10 | versionCode 1
11 | versionName "1.0"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | lintOptions {
20 | abortOnError false
21 | }
22 | }
23 |
24 | dependencies {
25 | implementation fileTree(include: ['*.jar'], dir: 'libs')
26 | implementation 'com.android.support:appcompat-v7:25.+'
27 |
28 | // debugcompile 'com.itgowo:android-WebDebugTool:1.0.10'
29 | // debugImplementation 'com.itgowo:android-WebDebugTool:1.0.10'
30 | // api 'com.itgowo:android-WebDebugTool:1.0.10'
31 | implementation project(':webtoollibrary')
32 | // compile 'com.google.code.gson:gson:2.8.2'
33 | implementation 'com.alibaba:fastjson:1.1.67.android'
34 | }
35 |
--------------------------------------------------------------------------------
/API/deleteDataFromSp.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 删除共享参数文件中的数据,一次只能删除一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: deleteDataFromSp,
16 | spFileName:appinfo,
17 | RowDataRequests:
18 | [
19 | {
20 | primary: true,
21 | title: id,
22 | value: 3,
23 | dataType: integer
24 | }
25 | ]
26 | }
27 |
28 | ```
29 |
30 |
31 | |参数名|必选|类型|说明|
32 | |:---- |:---|:----- |----- |
33 | |action |是 |string |执行动作 |
34 | |database |是 |string | 待操作数据库名称 |
35 | |tableName |是 |string | 待操作表名称 |
36 | |RowDataRequests |是 |array |需要添加的数据数组 |
37 | |title |是 |String | 列名称 |
38 | |primary |否 |boolean | 是否是主键 |
39 | |value |是 |String | 对应列要添加的数据 |
40 | |dataType |是 |String | 数据类型 |
41 |
42 | **返回示例**
43 |
44 | ```
45 | {
46 | code: 200,
47 | msg: success
48 | }
49 | ```
50 |
51 | **返回参数说明**
52 |
53 | |参数名|类型|说明|
54 | |:----- |:-----|----- |
55 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
56 | |msg |String |返回状态文本,code不是200则提示msg信息 |
57 |
58 |
59 | **备注**
60 |
61 | - 更多返回错误代码请看首页的错误代码描述
62 |
63 |
64 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionAddDataToSp.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.PrefHelper;
10 |
11 | /**
12 | * @author lujianchao
13 | * 添加数据到共享参数
14 | */
15 | public class ActionAddDataToSp implements Action {
16 | public static final String ACTION = "addDataToSp";
17 |
18 | @Override
19 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
20 | Response response = PrefHelper.addOrUpdateRow(context, request.getSpFileName(), request.getRowDataRequests());
21 | responseHandler.sendPost(response);
22 | return response;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionUpdateDataToSp.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.PrefHelper;
10 |
11 | /**
12 | * @author lujianchao
13 | * 更新数据库数据
14 | */
15 | public class ActionUpdateDataToSp implements Action {
16 | public static final String ACTION = "updateDataToSp";
17 |
18 | @Override
19 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
20 | Response response = PrefHelper.addOrUpdateRow(context, request.getSpFileName(), request.getRowDataRequests());
21 | responseHandler.sendPost(response);
22 | return response;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionDeleteDataFromSp.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.PrefHelper;
10 |
11 | /**
12 | * @author lujianchao
13 | * 从共享参数中删数据
14 | */
15 | public class ActionDeleteDataFromSp implements Action {
16 | public static final String ACTION = "deleteDataFromSp";
17 |
18 | @Override
19 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
20 | Response response = PrefHelper.deleteRow(context, request.getSpFileName(), request.getRowDataRequests());
21 | responseHandler.sendPost(response);
22 | return response;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetSpList.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import java.io.File;
6 | import java.util.HashMap;
7 |
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
12 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.PrefHelper;
13 |
14 | /**
15 | * @author lujianchao
16 | * 获取共享参数列表
17 | */
18 | public class ActionGetSpList implements Action {
19 | public static final String ACTION = "getSpList";
20 |
21 | @Override
22 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
23 | Response response = new Response();
24 | response.setSpList(PrefHelper.getSharedPreferenceTags(context));
25 | responseHandler.sendPost(response);
26 | return response;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/API/deleteDataFromDb.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 删除数据库表内数据,一次只能删除一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: deleteDataFromDb,
16 | database: appinfo.db,
17 | tableName: historycache,
18 | RowDataRequests:
19 | [
20 | {
21 | primary: true,
22 | title: id,
23 | value: 3,
24 | dataType: integer
25 | }
26 | ]
27 | }
28 |
29 | ```
30 |
31 |
32 | |参数名|必选|类型|说明|
33 | |:---- |:---|:----- |----- |
34 | |action |是 |string |执行动作 |
35 | |database |是 |string | 待操作数据库名称 |
36 | |tableName |是 |string | 待操作表名称 |
37 | |RowDataRequests |是 |array |需要添加的数据数组 |
38 | |title |是 |String | 列名称 |
39 | |primary |是 |boolean | 是否是主键 |
40 | |value |是 |String | 对应列要添加的数据 |
41 | |dataType |是 |String | 数据类型 |
42 |
43 | **返回示例**
44 |
45 | ```
46 | {
47 | code: 200,
48 | msg: success
49 | }
50 | ```
51 |
52 | **返回参数说明**
53 |
54 | |参数名|类型|说明|
55 | |:----- |:-----|----- |
56 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
57 | |msg |String |返回状态文本,code不是200则提示msg信息 |
58 |
59 |
60 | **备注**
61 |
62 | - 更多返回错误代码请看首页的错误代码描述
63 |
64 |
65 |
--------------------------------------------------------------------------------
/API/downloadFile.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 文件下载
4 |
5 | **请求URL:**
6 | - ` /downloadFile?downloadFile=/data/user/0/com.itgowo.tool.android_debugdata_webtool/databases/appinfo.db `
7 |
8 | **请求方式:**
9 | - GET
10 |
11 | **参数:**
12 |
13 | |参数名|必选|类型|说明|
14 | |:---- |:---|:----- |----- |
15 | |downloadFile |是 |string |要下载的数据库名称 |
16 |
17 |
18 |
19 | **返回参数说明**
20 |
21 | 返回文件
22 |
23 |
24 |
25 |
26 |
27 |
28 | **简要描述:**
29 |
30 | - 数据库文件下载
31 |
32 | **请求URL:**
33 | - ` /downloadFile?downloadFile=/data/user/0/com.itgowo.tool.android_debugdata_webtool/databases/appinfo.db `
34 |
35 | **请求方式:**
36 | - GET
37 |
38 | **参数:**
39 |
40 | |参数名|必选|类型|说明|
41 | |:---- |:---|:----- |----- |
42 | |downloadFile |是 |string |要下载的数据库名称 |
43 |
44 |
45 |
46 | **返回参数说明**
47 |
48 | 返回文件
49 |
50 |
51 |
52 |
53 |
54 |
55 | **简要描述:**
56 |
57 | - 共享参数文件下载
58 |
59 | **请求URL:**
60 | - ` /downloadFile?downloadFile=/data/user/0/com.itgowo.tool.android_debugdata_webtool/shared_prefs/appinfo.xml `
61 |
62 | **请求方式:**
63 | - GET
64 |
65 | **参数:**
66 |
67 | |参数名|必选|类型|说明|
68 | |:---- |:---|:----- |----- |
69 | |downloadFile |是 |string |要下载的共享参数文件path路径 |
70 |
71 |
72 |
73 | **返回参数说明**
74 |
75 | 返回文件
76 |
77 |
78 | **备注**
79 |
80 | - 更多返回错误代码请看首页的错误代码描述
81 |
82 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetDataFromSpFile.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.PrefHelper;
10 |
11 | /**
12 | * @author lujianchao
13 | * 从共享参数文件获取数据
14 | */
15 | public class ActionGetDataFromSpFile implements Action {
16 | public static final String ACTION = "getDataFromSpFile";
17 |
18 | @Override
19 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
20 | if (request.getSpFileName() == null || request.getSpFileName().length() < 1) {
21 | return null;
22 | }
23 | Response response = PrefHelper.getAllPrefData(context, request.getSpFileName());
24 | responseHandler.sendPost(response);
25 | return response;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionAddDataToDb.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
11 |
12 | /**
13 | * @author lujianchao
14 | * 添加数据到数据库
15 | */
16 | public class ActionAddDataToDb implements Action {
17 | public static final String ACTION = "addDataToDb";
18 |
19 | @Override
20 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
21 | Response response = DatabaseHelper.addRow(DatabaseManager.getDatabase(context, request.getDatabase()), request.getTableName(), request.getRowDataRequests());
22 | responseHandler.sendPost(response);
23 | return response;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionUpdateDataToDb.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
11 |
12 | /**
13 | * @author lujianchao
14 | * 更新数据库数据
15 | */
16 | public class ActionUpdateDataToDb implements Action {
17 | public static final String ACTION = "updateDataToDb";
18 |
19 | @Override
20 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
21 | Response response = DatabaseHelper.updateRow(DatabaseManager.getDatabase(context, request.getDatabase()), request.getTableName(), request.getRowDataRequests());
22 | responseHandler.sendPost(response);
23 | return response;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionDeleteDataFromDb.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
11 |
12 | /**
13 | * @author lujianchao
14 | * 从数据库中删数据
15 | */
16 | public class ActionDeleteDataFromDb implements Action {
17 | public static final String ACTION = "deleteDataFromDb";
18 |
19 | @Override
20 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
21 | Response response = DatabaseHelper.deleteRow(DatabaseManager.getDatabase(context, request.getDatabase()), request.getTableName(), request.getRowDataRequests());
22 | responseHandler.sendPost(response);
23 | return response;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/API/updateDataToSp.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 更新数据库表内数据,一次只能更新一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: updateDataToSp,
16 | spFileName: appinfo,
17 | RowDataRequests:
18 | [
19 | {
20 | primary: true,
21 | title: key,
22 | value: ggg,
23 | dataType: text
24 | },
25 | {
26 | primary: false,
27 | title: value,
28 | value: 啦啦啦,
29 | dataType: text
30 | }
31 | ]
32 | }
33 |
34 | ```
35 |
36 |
37 | |参数名|必选|类型|说明|
38 | |:---- |:---|:----- |----- |
39 | |action |是 |string |执行动作 |
40 | |fileName |是 |string | 共享参数文件名称 |
41 | |RowDataRequests |是 |array |需要添加的数据数组 |
42 | |title |是 |String | 列名称 |
43 | |primary |否 |boolean | 是否是主键 |
44 | |value |是 |String | 对应列要添加的数据 |
45 | |dataType |是 |String | 数据类型 |
46 |
47 | **返回示例**
48 |
49 | ```
50 | {
51 | code: 200,
52 | msg: success
53 | }
54 | ```
55 |
56 | **返回参数说明**
57 |
58 | |参数名|类型|说明|
59 | |:----- |:-----|----- |
60 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
61 | |msg |String |返回状态文本,code不是200则提示msg信息 |
62 |
63 |
64 | **备注**
65 |
66 | - 更多返回错误代码请看首页的错误代码描述
67 |
68 |
69 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetTableList.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
11 |
12 | /**
13 | * @author lujianchao
14 | * 获取数据库表
15 | */
16 | public class ActionGetTableList implements Action {
17 | public static final String ACTION = "getTableList";
18 |
19 | @Override
20 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
21 | if (request.getDatabase() == null || request.getDatabase().length() < 1) {
22 | return null;
23 | }
24 | Response response=DatabaseHelper.getAllTableName(DatabaseManager.getDatabase(context, request.getDatabase()));
25 | responseHandler.sendPost(response);
26 | return response;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/custom.css:
--------------------------------------------------------------------------------
1 | .padding-fifty {
2 | padding-top: 50px;
3 | }
4 |
5 | .padding-twenty {
6 | padding-top: 20px;
7 | }
8 |
9 |
10 | .padding-five {
11 | padding-top: 5px;
12 | }
13 | .padding-ten{
14 | padding-top: 10px;
15 | }
16 | .display-none {
17 | display: none;
18 | }
19 |
20 | .list-group-item {
21 | word-break: break-all;
22 | }
23 |
24 | .list-group-item.selected {
25 | background: #dff0d8 !important;
26 | color: #3c763d !important;
27 | font-weight: bold;
28 | }
29 |
30 | #snackbar {
31 | visibility: hidden;
32 | min-width: 250px;
33 | margin-left: -125px;
34 | background-color: #5cb85c;
35 | color: #fff;
36 | text-align: center;
37 | border-radius: 2px;
38 | padding: 16px;
39 | position: fixed;
40 | z-index: 1;
41 | left: 50%;
42 | bottom: 30px;
43 | font-size: 17px;
44 | }
45 |
46 | #snackbar.show {
47 | visibility: visible;
48 | -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
49 | animation: fadein 0.5s, fadeout 0.5s 2.5s;
50 | }
51 |
52 | @-webkit-keyframes fadein {
53 | from {bottom: 0; opacity: 0;}
54 | to {bottom: 30px; opacity: 1;}
55 | }
56 |
57 | @keyframes fadein {
58 | from {bottom: 0; opacity: 0;}
59 | to {bottom: 30px; opacity: 1;}
60 | }
61 |
62 | @-webkit-keyframes fadeout {
63 | from {bottom: 30px; opacity: 1;}
64 | to {bottom: 0; opacity: 0;}
65 | }
--------------------------------------------------------------------------------
/API/getSpList.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取共享参数列表
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action : getSpList
16 | }
17 |
18 | ```
19 |
20 | |参数名|必选|类型|说明|
21 | |:---- |:---|:----- |----- |
22 | |action |是 |string |执行动作|
23 |
24 |
25 | **返回示例**
26 |
27 | ```
28 | {
29 | code : 200,
30 | msg : success,
31 | SpList : [
32 | {
33 | fileName: WebViewChromiumPrefs,
34 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/shared_prefs/WebViewChromiumPrefs.xml
35 | },
36 | {
37 | fileName: appinfo,
38 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/shared_prefs/appinfo.xml
39 | },
40 | {
41 | fileName: appinfo11,
42 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/shared_prefs/appinfo11.xml
43 | }
44 | ]
45 | }
46 |
47 | ```
48 |
49 |
50 | **返回参数说明**
51 |
52 | |参数名|类型|说明|
53 | |:----- |:-----|----- |
54 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
55 | |msg |String |返回状态文本,code不是200则提示msg信息 |
56 | |SpList |array |返回结果,数据库文件对象数组 |
57 | |fileName |String |返回结果,文件名 |
58 | |path |String |返回结果,文件路径 |
59 |
60 | **备注**
61 |
62 | - 更多返回错误代码请看首页的错误代码描述
63 |
64 |
65 |
--------------------------------------------------------------------------------
/API/addDataToSp.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 向数据库表内添加数据,一次只能添加一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: addDataToSp,
16 | spFileName: appinfo,
17 | RowDataRequests:
18 | [
19 | {
20 | primary: true,
21 | title: id,
22 | value: 1,
23 | dataType: integer
24 | }
25 | {
26 | primary: false,
27 | title: key,
28 | value: GetHomeInfo,
29 | dataType: text
30 | },
31 | {
32 | primary: false,
33 | title: value,
34 | value: ,
35 | dataType: text
36 | },
37 | {
38 | primary: false,
39 | title: bak,
40 | value: lll,
41 | dataType:
42 | }
43 | ]
44 | }
45 |
46 |
47 | ```
48 |
49 |
50 | |参数名|必选|类型|说明|
51 | |:---- |:---|:----- |----- |
52 | |action |是 |string |执行动作 |
53 | |fileName |是 |string | 共享参数文件名称 |
54 | |RowDataRequests |是 |array |需要添加的数据数组 |
55 | |title |是 |String | 列名称 |
56 | |primary |否 |boolean | 是否是主键 |
57 | |value |是 |String | 对应列要添加的数据 |
58 | |dataType |是 |String | 数据类型 |
59 |
60 | **返回示例**
61 |
62 | ```
63 | {
64 | code: 200,
65 | msg: success
66 | }
67 | ```
68 |
69 | **返回参数说明**
70 |
71 | |参数名|类型|说明|
72 | |:----- |:-----|----- |
73 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
74 | |msg |String |返回状态文本,code不是200则提示msg信息 |
75 |
76 |
77 | **备注**
78 |
79 | - 更多返回错误代码请看首页的错误代码描述
80 |
81 |
82 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionDeleteFile.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import java.io.File;
6 |
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
11 |
12 | /**
13 | * @author lujianchao
14 | * 删除文件
15 | */
16 | public class ActionDeleteFile implements Action {
17 | public static final String ACTION = "deleteFile";
18 |
19 | @Override
20 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
21 | Response response = new Response();
22 | if (request.getData() == null || request.getData().length() < 5) {
23 | response.setCode(Response.code_Error).setMsg("没有指定文件");
24 | }
25 | File mFile = new File(request.getData());
26 | if (mFile == null || !mFile.exists()) {
27 | response.setCode(Response.code_FileNotFound).setMsg("文件不存在");
28 | }
29 | if (!mFile.delete()) {
30 | response.setCode(Response.code_Error).setMsg("文件删除失败");
31 | }
32 | responseHandler.sendPost(response);
33 | return response;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/API/addDataToDb.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 向数据库表内添加数据,一次只能添加一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: addDataToDb,
16 | database: appinfo.db,
17 | tableName: historycache,
18 | RowDataRequests:
19 | [
20 | {
21 | primary: true,
22 | title: id,
23 | value: 1,
24 | dataType: integer
25 | }
26 | {
27 | primary: false,
28 | title: key,
29 | value: GetHomeInfo,
30 | dataType: text
31 | },
32 | {
33 | primary: false,
34 | title: value,
35 | value: ,
36 | dataType: text
37 | },
38 | {
39 | primary: false,
40 | title: bak,
41 | value: lll,
42 | dataType:
43 | }
44 | ]
45 | }
46 |
47 | ```
48 |
49 |
50 | |参数名|必选|类型|说明|
51 | |:---- |:---|:----- |----- |
52 | |action |是 |string |执行动作 |
53 | |database |是 |string | 待操作数据库名称 |
54 | |tableName |是 |string | 待操作表名称 |
55 | |RowDataRequests |是 |array |需要添加的数据数组 |
56 | |title |是 |String | 列名称 |
57 | |primary |否 |boolean | 是否是主键 |
58 | |value |是 |String | 对应列要添加的数据 |
59 | |dataType |是 |String | 数据类型 |
60 |
61 | **返回示例**
62 |
63 | ```
64 | {
65 | code: 200,
66 | msg: success
67 | }
68 | ```
69 |
70 | **返回参数说明**
71 |
72 | |参数名|类型|说明|
73 | |:----- |:-----|----- |
74 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
75 | |msg |String |返回状态文本,code不是200则提示msg信息 |
76 |
77 |
78 | **备注**
79 |
80 | - 更多返回错误代码请看首页的错误代码描述
81 |
82 |
83 |
--------------------------------------------------------------------------------
/API/updateDataToDb.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 更新数据库表内数据,一次只能更新一条数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: updateDataToDb,
16 | database: appinfo.db,
17 | tableName: historycache,
18 | RowDataRequests:
19 | [
20 | {
21 | primary: true,
22 | title: id,
23 | value: 1,
24 | dataType: integer
25 | }
26 | {
27 | primary: false,
28 | title: key,
29 | value: GetHomeInfo,
30 | dataType: text
31 | },
32 | {
33 | primary: false,
34 | title: value,
35 | value: ,
36 | dataType: text
37 | },
38 | {
39 | primary: false,
40 | title: bak,
41 | value: lll,
42 | dataType:
43 | }
44 | ]
45 | }
46 |
47 | ```
48 |
49 |
50 | |参数名|必选|类型|说明|
51 | |:---- |:---|:----- |----- |
52 | |action |是 |string |执行动作 |
53 | |database |是 |string | 待操作数据库名称 |
54 | |tableName |是 |string | 待操作表名称 |
55 | |RowDataRequests |是 |array |需要添加的数据数组 |
56 | |title |是 |String | 列名称 |
57 | |primary |是 |boolean | 是否是主键 |
58 | |value |是 |String | 对应列要添加的数据 |
59 | |dataType |是 |String | 数据类型 |
60 |
61 | **返回示例**
62 |
63 | ```
64 | {
65 | code: 200,
66 | msg: success
67 | }
68 | ```
69 |
70 | **返回参数说明**
71 |
72 | |参数名|类型|说明|
73 | |:----- |:-----|----- |
74 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
75 | |msg |String |返回状态文本,code不是200则提示msg信息 |
76 |
77 |
78 | **备注**
79 |
80 | - 更多返回错误代码请看首页的错误代码描述
81 |
82 |
83 |
--------------------------------------------------------------------------------
/API/getFileList.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取文件列表
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: getFileList,
16 | data: /data/user/0/com.itgowo.tool.android_debugdata_webtool/databases
17 | }
18 |
19 | ```
20 |
21 | |参数名|必选|类型|说明|
22 | |:---- |:---|:----- |----- |
23 | |action |是 |string |执行动作|
24 | |data |否 |string | 要获取列表的根目录,不传则返回app根目录, |
25 |
26 | **返回示例**
27 |
28 | ```
29 | {
30 | code: 200,
31 | msg: success,
32 | fileList: [
33 | {
34 | dir: false,
35 | fileName: appinfo.db,
36 | fileSize: 20.00KB,
37 | fileTime: 2017-09-17 23:19:32,
38 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/databases/appinfo.db,
39 | rootPath: /data/user/0/com.itgowo.tool.android_debugdata_webtool
40 | },
41 | {
42 | dir: false,
43 | fileName: appinfo.db-journal,
44 | fileSize: 12.52KB,
45 | fileTime: 2017-09-17 23:19:32,
46 | path: /data/user/0/com.itgowo.tool.android_debugdata_webtool/databases/appinfo.db-journal,
47 | rootPath: /data/user/0/com.itgowo.tool.android_debugdata_webtool
48 | }
49 | ]
50 | }
51 |
52 | ```
53 |
54 |
55 | **返回参数说明**
56 |
57 | |参数名|类型|说明|
58 | |:----- |:-----|----- |
59 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
60 | |msg |String |返回状态文本,code不是200则提示msg信息 |
61 | |fileList |array |返回结果,文件对象数组 |
62 | |dir |array |返回结果,是否是文件夹 |
63 | |fileName |String |返回结果,文件名 |
64 | |fileSize |String |返回结果,文件大小 |
65 | |fileTime |String |返回结果,文件最后编辑时间 |
66 | |path |String |返回结果,文件路径 |
67 | |rootPath |String |返回结果,文件所在的上级目录地址,返回上级传这个参数,如果为空则是请求首页,及data为空 |
68 |
69 |
70 | **备注**
71 |
72 | - 更多返回错误代码请看首页的错误代码描述
73 |
74 |
75 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetDbList.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import java.io.File;
6 | import java.util.ArrayList;
7 | import java.util.HashMap;
8 | import java.util.List;
9 | import java.util.Map;
10 |
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
12 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
13 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
14 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
15 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
16 |
17 | /**
18 | * @author lujianchao
19 | * 获取数据库列表
20 | */
21 | public class ActionGetDbList implements Action {
22 | public static final String ACTION = "getDbList";
23 |
24 | @Override
25 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
26 | HashMap databaseFiles = DatabaseManager.getDatabaseFiles(context);
27 | Response response = new Response();
28 | if (databaseFiles != null) {
29 | List dblist = new ArrayList<>();
30 | for (Map.Entry mStringFileEntry : databaseFiles.entrySet()) {
31 | if (!mStringFileEntry.getKey().contains("-journal")) {
32 | dblist.add(new Response.FileList.FileData().setFileName(mStringFileEntry.getKey()).setPath(mStringFileEntry.getValue().getPath()));
33 | }
34 | }
35 | response.setDbList(dblist);
36 | }
37 | responseHandler.sendPost(response);
38 | return response;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/utils/DebugDataAutoInitProvider.java:
--------------------------------------------------------------------------------
1 |
2 |
3 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils;
4 |
5 | import android.content.ContentProvider;
6 | import android.content.ContentValues;
7 | import android.database.Cursor;
8 | import android.net.Uri;
9 |
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DebugDataTool;
11 |
12 | /**
13 | * Created by amitshekhar on 16/11/16.
14 | */
15 |
16 | public class DebugDataAutoInitProvider extends ContentProvider {
17 |
18 |
19 | public DebugDataAutoInitProvider() {
20 | }
21 |
22 | @Override
23 | public boolean onCreate() {
24 | new Thread(new Runnable() {
25 | @Override
26 | public void run() {
27 | try {
28 | Thread.sleep(1200);
29 | } catch (InterruptedException mE) {
30 | mE.printStackTrace();
31 | }
32 | if (!DebugDataTool.isServerRunning()) {
33 | DebugDataTool.initialize(getContext(), 8088, false, null);
34 | }
35 | }
36 | }).start();
37 |
38 | return true;
39 | }
40 |
41 | @Override
42 | public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
43 | return null;
44 | }
45 |
46 | @Override
47 | public String getType(Uri uri) {
48 | return null;
49 | }
50 |
51 | @Override
52 | public Uri insert(Uri uri, ContentValues values) {
53 | return null;
54 | }
55 |
56 | @Override
57 | public int delete(Uri uri, String selection, String[] selectionArgs) {
58 | return 0;
59 | }
60 |
61 | @Override
62 | public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
63 | return 0;
64 | }
65 |
66 |
67 | }
68 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetDataFromDbTable.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 | import android.database.sqlite.SQLiteDatabase;
5 |
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
12 |
13 | /**
14 | * @author lujianchao
15 | * 从数据库表读取数据
16 | */
17 | public class ActionGetDataFromDbTable implements Action {
18 | public static final String ACTION = "getDataFromDbTable";
19 |
20 | @Override
21 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
22 | if (request.getTableName() == null || request.getTableName().length() < 1) {
23 | return null;
24 | }
25 | Response response = null;
26 | SQLiteDatabase sqLiteDatabase = DatabaseManager.getDatabase(context, request.getDatabase());
27 | if (sqLiteDatabase != null) {
28 | String sql;
29 | if (request.getPageIndex() == null || request.getPageSize() == null) {
30 | sql = "SELECT * FROM " + request.getTableName();
31 | } else {
32 | sql = "SELECT * FROM " + request.getTableName() + " limit " + (request.getPageIndex() - 1) * request.getPageSize() + "," + request.getPageSize();
33 | }
34 | response = DatabaseHelper.getTableData(sqLiteDatabase, sql, request.getTableName());
35 | } else {
36 | response = new Response().setCode(Response.code_FileNotFound).setMsg("数据库文件不存在,请检查是否做了删除操作");
37 | }
38 | responseHandler.sendPost(response);
39 | return response;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionQuery.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 | import android.database.sqlite.SQLiteDatabase;
5 |
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.DatabaseManager;
7 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
8 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
9 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper;
12 |
13 | /**
14 | * @author lujianchao
15 | * 数据库查询
16 | */
17 | public class ActionQuery implements Action {
18 | public static final String ACTION = "query";
19 |
20 | @Override
21 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
22 | Response response = null;
23 | String first;
24 | try {
25 | SQLiteDatabase database = DatabaseManager.getDatabase(context, request.getDatabase());
26 | if (request.getData() != null && database != null) {
27 | first = request.getData().split(" ")[0].toLowerCase();
28 | if (first.equals("select") || first.equals("pragma")) {
29 | response = DatabaseHelper.getTableData(database, request.getData(), null);
30 | } else {
31 | response = DatabaseHelper.exec(database, request.getData());
32 | }
33 | } else {
34 | response = new Response().setCode(Response.code_SQLNODATA).setMsg("找不到数据库:" + request.getDatabase());
35 | }
36 | } catch (Exception e) {
37 | e.printStackTrace();
38 | response = new Response().setCode(Response.code_SQLNODATA).setMsg(e.getLocalizedMessage());
39 | }
40 | if (response == null) {
41 | response = new Response().setCode(Response.code_SQLNODATA).setMsg("找不到数据或者SQL语句错误");
42 | }
43 | responseHandler.sendPost(response);
44 | return response;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/API/query.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 执行SQL数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action: query,
16 | database: appinfo.db,
17 | data: select * from historycache where key like '%Home%'
18 | }
19 |
20 | ```
21 |
22 |
23 | |参数名|必选|类型|说明|
24 | |:---- |:---|:----- |----- |
25 | |action |是 |string |执行动作 |
26 | |database |是 |string | 待操作数据库名称 |
27 | |data |是 |string | SQL语句 |
28 |
29 | **返回示例**
30 |
31 | ```
32 | {
33 | code: 200,
34 | editable: true,
35 | msg: success,
36 | tableData: {
37 | dataCount: 12,
38 | tableColumns: [
39 | {
40 | dataType: integer,
41 | notNull: false,
42 | primary: true,
43 | title: id
44 | },
45 | {
46 | dataType: text,
47 | notNull: false,
48 | primary: false,
49 | title: key
50 | },
51 | {
52 | dataType: text,
53 | notNull: false,
54 | primary: false,
55 | title: value
56 | },
57 | {
58 | dataType: long,
59 | notNull: false,
60 | primary: false,
61 | title: lasttime
62 | },
63 | {
64 | dataType: text,
65 | notNull: false,
66 | primary: false,
67 | title: bak
68 | },
69 | {
70 | dataType: text,
71 | notNull: false,
72 | primary: false,
73 | title: flag
74 | }
75 | ],
76 | tableDatas: [
77 | [
78 | 1,
79 | GetHomeInfo,
80 | llljk,
81 | 1505489911016,
82 | ,
83 |
84 | ]
85 | ]
86 | }
87 | }
88 |
89 | ```
90 |
91 | **返回参数说明**
92 |
93 | |参数名|类型|说明|
94 | |:----- |:-----|----- |
95 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
96 | |msg |String |返回状态文本,code不是200则提示msg信息 |
97 | |editable |boolean |是否可以编辑 |
98 | |tableData |对象 |返回的数据对象 |
99 | |tableColumns |Array |返回表结构信息 |
100 | |dataType |String |数据类型 |
101 | |notNull |boolean |是否可以为null |
102 | |primary |boolean |是否是主键 |
103 | |title |String |列名称 |
104 | |tableDatas |array |对应的一条记录数据 |
105 | |dataCount |int |数据库表中的数据总数 |
106 |
107 |
108 | **备注**
109 |
110 | - 更多返回错误代码请看首页的错误代码描述
111 |
112 |
113 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/DatabaseManager.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | import android.content.Context;
4 | import android.database.sqlite.SQLiteDatabase;
5 |
6 | import java.io.File;
7 | import java.util.HashMap;
8 |
9 | public class DatabaseManager {
10 | private static SQLiteDatabase database;
11 | private static HashMap customDatabaseFiles;
12 |
13 | public static void openDatabase(Context context, String databaseName) {
14 | synchronized (DatabaseManager.class) {
15 | if (database != null && database.isOpen() && new File(database.getPath()).getName().equals(databaseName)) {
16 | } else {
17 | if (databaseName == null || databaseName.trim().length() < 1) {
18 | return;
19 | }
20 | closeDatabase();
21 | File file = context.getDatabasePath(databaseName);
22 | if (file == null && customDatabaseFiles.get(databaseName) != null) {
23 | file = customDatabaseFiles.get(databaseName);
24 | }
25 | if (file == null || !file.exists()) {
26 | return;
27 | }
28 | database = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
29 | }
30 | }
31 | }
32 |
33 | public static HashMap getDatabaseFiles(Context context) {
34 | String[] d = context.databaseList();
35 | HashMap fileHashMap = new HashMap<>();
36 | for (int i = 0; i < d.length; i++) {
37 | File file = context.getDatabasePath(d[i]);
38 | fileHashMap.put(file.getName(), file);
39 | }
40 | if (customDatabaseFiles != null) {
41 | fileHashMap.putAll(customDatabaseFiles);
42 | }
43 | return fileHashMap;
44 | }
45 |
46 | public static void setCustomDatabaseFiles(HashMap customDatabaseFiles) {
47 | DatabaseManager.customDatabaseFiles = customDatabaseFiles;
48 | }
49 |
50 | public static SQLiteDatabase getDatabase() {
51 | return database;
52 | }
53 |
54 | public static SQLiteDatabase getDatabase(Context context, String databaseName) {
55 | openDatabase(context, databaseName);
56 | return database;
57 | }
58 |
59 | private static void closeDatabase() {
60 | synchronized (DatabaseManager.class) {
61 | if (database != null && database.isOpen()) {
62 | database.close();
63 | }
64 | database = null;
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/API/getDataFromSpFile.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取共享参数所有数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 |
14 |
15 |
16 | ```
17 |
18 | {
19 | action : getDataFromSpFile,
20 | spFileName : appinfo
21 | }
22 |
23 | ```
24 |
25 |
26 | |参数名|必选|类型|说明|
27 | |:---- |:---|:----- |----- |
28 | |action |是 |string |执行动作 |
29 | |spFileName |是 |string | 待查共享参数文件名称 |
30 |
31 |
32 | **返回示例**
33 |
34 |
35 | ```
36 | {
37 | code: 200,
38 | editable: true,
39 | msg: success,
40 | tableData: {
41 | tableColumns: [
42 | {
43 | primary: true,
44 | title: Key
45 | },
46 | {
47 | primary: false,
48 | title: Value
49 | },
50 | {
51 | primary: false,
52 | title: DataType
53 | }
54 | ],
55 | tableDatas: [
56 | [
57 | Int,
58 | 1234,
59 | integer
60 | ],
61 | [
62 | ggg,
63 | teddddst,
64 | text
65 | ],
66 | [
67 | aaaasdfsafee3aa,
68 | tadsfsadfest,
69 | text
70 | ],
71 | [
72 | Float,
73 | 1.5,
74 | float
75 | ],
76 | [
77 | Booblean,
78 | true,
79 | boolean
80 | ],
81 | [
82 | aaaaa,
83 | test,
84 | text
85 | ],
86 | [
87 | Long,
88 | 1232131231,
89 | long
90 | ],
91 | [
92 | adfs,
93 | 1505489963276,
94 | text
95 | ],
96 | [
97 | String,
98 | tadsfsadfest,
99 | text
100 | ]
101 | ]
102 | }
103 | }
104 |
105 | ```
106 |
107 |
108 | **返回参数说明**
109 |
110 | |参数名|类型|说明|
111 | |:----- |:-----|----- |
112 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
113 | |msg |String |返回状态文本,code不是200则提示msg信息 |
114 | |editable |boolean |是否可以编辑 |
115 | |tableData |对象 |返回的数据对象 |
116 | |tableColumns |Array |返回表结构信息 |
117 | |dataType |String |数据类型 |
118 | |notNull |boolean |是否可以为null |
119 | |primary |boolean |是否是主键 |
120 | |title |String |列名称 |
121 | |tableDatas |array |对应的一条记录数据 |
122 | |dataCount |int |数据总数 |
123 |
124 | **备注**
125 |
126 | - 更多返回错误代码请看首页的错误代码描述
127 |
128 |
129 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/utils/NetworkUtils.java:
--------------------------------------------------------------------------------
1 | /*
2 | *
3 | * * Copyright (C) 2016 Amit Shekhar
4 | * * Copyright (C) 2011 Android Open Source Project
5 | * *
6 | * * Licensed under the Apache License, Version 2.0 (the "License");
7 | * * you may not use this file except in compliance with the License.
8 | * * You may obtain a copy of the License at
9 | * *
10 | * * http://www.apache.org/licenses/LICENSE-2.0
11 | * *
12 | * * Unless required by applicable law or agreed to in writing, software
13 | * * distributed under the License is distributed on an "AS IS" BASIS,
14 | * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | * * See the License for the specific language governing permissions and
16 | * * limitations under the License.
17 | *
18 | */
19 |
20 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils;
21 |
22 | import android.annotation.SuppressLint;
23 | import android.content.Context;
24 | import android.net.wifi.WifiManager;
25 |
26 | import java.net.InetAddress;
27 | import java.net.NetworkInterface;
28 | import java.net.SocketException;
29 | import java.util.Enumeration;
30 |
31 | /**
32 | * Created by amitshekhar on 15/11/16.
33 | */
34 |
35 | public final class NetworkUtils {
36 |
37 | private NetworkUtils() {
38 | // This class in not publicly instantiable
39 | }
40 |
41 | /**
42 | * 获取WIFI网络地址,局域网
43 | *
44 | * @param context
45 | * @param port
46 | * @return
47 | */
48 | public static String getAddressLog(Context context, int port) {
49 | WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
50 | int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
51 | @SuppressLint("DefaultLocale")
52 | final String formattedIpAddress = String.format("%d.%d.%d.%d",
53 | (ipAddress & 0xff),
54 | (ipAddress >> 8 & 0xff),
55 | (ipAddress >> 16 & 0xff),
56 | (ipAddress >> 24 & 0xff));
57 | return formattedIpAddress + ":" + port;
58 | }
59 |
60 | /**
61 | * 获取数据的网址
62 | *
63 | * @return
64 | */
65 | public static String getLocalIpAddress() {
66 | try {
67 | for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
68 | NetworkInterface intf = en.nextElement();
69 | for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
70 | InetAddress inetAddress = enumIpAddr.nextElement();
71 | if (!inetAddress.isLoopbackAddress()) {
72 | return inetAddress.getHostAddress().toString();
73 | }
74 | }
75 | }
76 | } catch (SocketException ex) {
77 | ex.printStackTrace();
78 | }
79 | return null;
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/ClientServer.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | /**
4 | * Created by lujianchao on 17/8/16.
5 | */
6 |
7 |
8 | import android.content.Context;
9 |
10 | import java.io.File;
11 | import java.io.IOException;
12 | import java.net.ServerSocket;
13 | import java.net.Socket;
14 | import java.util.HashMap;
15 |
16 | public class ClientServer implements Runnable {
17 |
18 | private static final String TAG = "ClientServer";
19 |
20 | private int port;
21 |
22 | private boolean inRunning;
23 | /**
24 | * 是否使用多线程模式
25 | */
26 | private boolean isMultMode;
27 |
28 | private ServerSocket serverSocket;
29 |
30 | private final RequestHandler requestHandler;
31 |
32 | public ClientServer(Context context, int port, boolean isMultMode) {
33 | this.isMultMode = isMultMode;
34 | requestHandler = new RequestHandler(context);
35 | this.port = port;
36 | }
37 |
38 | public void start() {
39 | inRunning = true;
40 | new Thread(this).start();
41 | }
42 |
43 | public void resetServerPort(int newport) throws IOException, InterruptedException {
44 | stop();
45 | Thread.sleep(1000);
46 | port = newport;
47 | start();
48 | }
49 |
50 | public void stop() {
51 | try {
52 | inRunning = false;
53 | if (null != serverSocket) {
54 | new Thread(new Runnable() {
55 | @Override
56 | public void run() {
57 | try {
58 | new Socket("localhost", port).close();
59 | } catch (IOException mE) {
60 | mE.printStackTrace();
61 | }
62 | }
63 | }).start();
64 | }
65 | } catch (Exception e) {
66 | DebugDataTool.onError("web server error,服务器关闭异常", e);
67 | }
68 | }
69 |
70 | @Override
71 | public void run() {
72 | try {
73 | serverSocket = new ServerSocket(port);
74 | DebugDataTool.onSystemMsg("服务器已启动");
75 | while (inRunning) {
76 | Socket socket = serverSocket.accept();
77 | if (inRunning) {
78 | if (isMultMode) {
79 | requestHandler.asynHandle(socket);
80 | } else {
81 | requestHandler.syncHandle(socket);
82 | }
83 | }
84 |
85 | }
86 | serverSocket.close();
87 | serverSocket = null;
88 | DebugDataTool.onSystemMsg("服务器已关闭");
89 | } catch (Exception e) {
90 | DebugDataTool.onError("web server error", e);
91 | }
92 | }
93 |
94 | public void setCustomDatabaseFiles(HashMap customDatabaseFiles) {
95 | DatabaseManager.setCustomDatabaseFiles(customDatabaseFiles);
96 | }
97 |
98 | public boolean isRunning() {
99 | return inRunning;
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/action/ActionGetFileList.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action;
2 |
3 | import android.content.Context;
4 |
5 | import java.io.File;
6 | import java.text.SimpleDateFormat;
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.HttpRequest;
11 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request;
12 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
13 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.ResponseHandler;
14 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.Utils;
15 |
16 | /**
17 | * @author lujianchao
18 | * 获取data目录文件列表
19 | */
20 | public class ActionGetFileList implements Action {
21 | public static final String ACTION = "getFileList";
22 |
23 | @Override
24 | public Response doAction(Context context, Request request, HttpRequest httpRequest, ResponseHandler responseHandler) {
25 | File root = null;
26 | if (request.getData() == null || request.getData().length() < 5) {
27 | root = new File(context.getApplicationInfo().dataDir);
28 | } else {
29 | root = new File(request.getData());
30 | }
31 | if (root == null || !root.exists()) {
32 | return new Response().setCode(Response.code_FileNotFound).setMsg("请求的目录或文件不存在");
33 | }
34 | List mFileDatas = new ArrayList<>();
35 | List mFileColumns = new ArrayList<>();
36 | mFileColumns.add(new Response.FileList.FileColumn().setTitle("文件名").setRootPath(root.getPath()).setData("fileName"));
37 | mFileColumns.add(new Response.FileList.FileColumn().setTitle("文件大小").setRootPath(root.getPath()).setData("fileSize"));
38 | mFileColumns.add(new Response.FileList.FileColumn().setTitle("最后编辑时间").setRootPath(root.getPath()).setData("fileTime"));
39 | // mFileColumns.add(new Response.FileList.FileColumn().setTitle("文件夹").setRootPath(root.getPath()).setData("dir"));
40 | mFileColumns.add(new Response.FileList.FileColumn().setTitle("操作").setRootPath(root.getPath()).setData("delete"));
41 | File[] files = root.listFiles();
42 | if (files != null && files.length != 0) {
43 | for (File f : files) {
44 | Response.FileList.FileData mFileData = new Response.FileList.FileData();
45 | mFileData.setIsDir(f.isDirectory());
46 | mFileData.setFileName(f.getName());
47 | mFileData.setRootPath(root.getPath().equalsIgnoreCase(context.getApplicationInfo().dataDir) ? null : root.getParent());
48 | mFileData.setFileSize(f.isDirectory() ? "" : Utils.formatFileSize(context, f.length(), false));
49 | SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
50 | mFileData.setFileTime(mSimpleDateFormat.format(f.lastModified()));
51 | mFileData.setPath(f.getPath());
52 | mFileData.setDelete(f.canExecute());
53 | mFileDatas.add(mFileData);
54 | }
55 | }
56 | Response response = new Response().setFileList(new Response.FileList().setFileList(mFileDatas).setFileColumns(mFileColumns));
57 | responseHandler.sendPost(response);
58 | return response;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/css/select.dataTables.min.css:
--------------------------------------------------------------------------------
1 | table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable td.select-checkbox{position:relative}table.dataTable td.select-checkbox:before,table.dataTable td.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable td.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}
2 |
--------------------------------------------------------------------------------
/API/getDataFromDbTable.md:
--------------------------------------------------------------------------------
1 | **简要描述:**
2 |
3 | - 获取表内所有数据
4 |
5 | **请求URL:**
6 | - ` / `
7 |
8 | **请求方式:**
9 | - POST
10 |
11 | **参数:**
12 |
13 | ```
14 | {
15 | action : getDataFromDbTable,
16 | database:appinfo.db,
17 | tableName : historycache,
18 | pageIndex:1,
19 | pageSize:10
20 | }
21 |
22 | ```
23 |
24 |
25 | |参数名|必选|类型|说明|
26 | |:---- |:---|:----- |----- |
27 | |action |是 |string |执行动作 |
28 | |database |是 |string | 待查数据库名称 |
29 | |tableName |是 |string | 待查表名称 |
30 | |pageIndex |否 |int |页面索引,从1开始,默认为null,获取全部数据 |
31 | |pageSize |否 |int | 数据多少,默认null,获取全部数据 |
32 |
33 | **返回示例**
34 |
35 | ```
36 | {
37 | code: 200,
38 | editable: true,
39 | msg: success,
40 | tableData: {
41 | tableColumns: [
42 | {
43 | dataType: integer,
44 | notNull: false,
45 | primary: true,
46 | title: id
47 | },
48 | {
49 | dataType: text,
50 | notNull: false,
51 | primary: false,
52 | title: key
53 | },
54 | {
55 | dataType: text,
56 | notNull: false,
57 | primary: false,
58 | title: value
59 | },
60 | {
61 | dataType: long,
62 | notNull: false,
63 | primary: false,
64 | title: lasttime
65 | },
66 | {
67 | dataType: text,
68 | notNull: false,
69 | primary: false,
70 | title: bak
71 | },
72 | {
73 | dataType: text,
74 | notNull: false,
75 | primary: false,
76 | title: flag
77 | }
78 | ],
79 | tableDatas: [
80 | [
81 | 16,
82 | 1503476474752,
83 | bbbbbbbb,
84 | 1503476474752,
85 | ,
86 |
87 | ],
88 | [
89 | 17,
90 | 1503893038974,
91 | aaaaaaaaaaaaaaaa,
92 | 1503893038978,
93 | ,
94 |
95 | ],
96 | [
97 | 18,
98 | 1503893038983,
99 | bbbbbbbb,
100 | 1503893038983,
101 | ,
102 |
103 | ],
104 | [
105 | 19,
106 | 1503897959943,
107 | aaaaaaaaaaaaaaaa,
108 | 1503897959946,
109 | ,
110 |
111 | ],
112 | [
113 | 20,
114 | 1503897959948,
115 | bbbbbbbb,
116 | 1503897959948,
117 | ,
118 |
119 | ]
120 | ],
121 | dataCount: 20
122 | }
123 | }
124 | ```
125 |
126 | **返回参数说明**
127 |
128 | |参数名|类型|说明|
129 | |:----- |:-----|----- |
130 | |code |int |返回结果状态 200表示成功,不是200则提示msg信息 |
131 | |msg |String |返回状态文本,code不是200则提示msg信息 |
132 | |editable |boolean |是否可以编辑 |
133 | |tableData |对象 |返回的数据对象 |
134 | |tableColumns |Array |返回表结构信息 |
135 | |dataType |String |数据类型 |
136 | |notNull |boolean |是否可以为null |
137 | |primary |boolean |是否是主键 |
138 | |title |String |列名称 |
139 | |tableDatas |array |对应的一条记录数据 |
140 | |dataCount |int |数据库表中的数据总数 |
141 |
142 | **备注**
143 |
144 | - 更多返回错误代码请看首页的错误代码描述
145 |
146 |
147 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/css/responsive.dataTables.min.css:
--------------------------------------------------------------------------------
1 | table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:8px;left:4px;height:16px;width:16px;display:block;position:absolute;color:white;border:2px solid white;border-radius:16px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:left;font-family:'Courier New', Courier, monospace;text-indent:4px;line-height:16px;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:16px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:left;font-family:'Courier New', Courier, monospace;text-indent:4px;line-height:16px;content:'+';background-color:#31b131}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}
2 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/Request.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by hnvfh on 2017/8/22.
7 | */
8 |
9 | public class Request {
10 | /**
11 | * 操作动作
12 | */
13 | private String action;
14 | /**
15 | * 数据库名
16 | */
17 | private String database;
18 | private String spFileName;
19 |
20 | /**
21 | * 数据表明
22 | */
23 | private String tableName;
24 | /**
25 | * 携带的数据
26 | */
27 | private String data;
28 | /**
29 | *
30 | */
31 | private List RowDataRequests;
32 | /**
33 | * 非必须
34 | */
35 | private Integer pageIndex;
36 | /**
37 | * 非必须
38 | */
39 | private Integer pageSize;
40 | public String getSpFileName() {
41 | return spFileName;
42 | }
43 |
44 | public Request setSpFileName(String mSpFileName) {
45 | spFileName = mSpFileName;
46 | return this;
47 | }
48 |
49 | public Integer getPageIndex() {
50 | return pageIndex;
51 | }
52 |
53 | public Request setPageIndex(Integer mPageIndex) {
54 | pageIndex = mPageIndex;
55 | return this;
56 | }
57 |
58 | public Integer getPageSize() {
59 | return pageSize;
60 | }
61 |
62 | public Request setPageSize(Integer mPageSize) {
63 | pageSize = mPageSize;
64 | return this;
65 | }
66 |
67 | public String getTableName() {
68 | return tableName;
69 | }
70 |
71 | public Request setTableName(String mTableName) {
72 | tableName = mTableName;
73 | return this;
74 | }
75 |
76 | public List getRowDataRequests() {
77 | return RowDataRequests;
78 | }
79 |
80 | public Request setRowDataRequests(List mRowDataRequests) {
81 | RowDataRequests = mRowDataRequests;
82 | return this;
83 | }
84 |
85 | public String getAction() {
86 | return action;
87 | }
88 |
89 | public Request setAction(String mAction) {
90 | action = mAction;
91 | return this;
92 | }
93 |
94 | public String getDatabase() {
95 | return database;
96 | }
97 |
98 | public Request setDatabase(String mDatabase) {
99 | database = mDatabase;
100 | return this;
101 | }
102 |
103 | public String getData() {
104 | return data;
105 | }
106 |
107 | public Request setData(String mData) {
108 | data = mData;
109 | return this;
110 | }
111 |
112 | public static class RowDataRequest {
113 | public String title;
114 | public boolean isPrimary;
115 | public String dataType;
116 | public String value;
117 |
118 | public String getTitle() {
119 | return title;
120 | }
121 |
122 | public RowDataRequest setTitle(String mTitle) {
123 | title = mTitle;
124 | return this;
125 | }
126 |
127 | public boolean isPrimary() {
128 | return isPrimary;
129 | }
130 |
131 | public RowDataRequest setPrimary(boolean mPrimary) {
132 | isPrimary = mPrimary;
133 | return this;
134 | }
135 |
136 | public String getDataType() {
137 | return dataType;
138 | }
139 |
140 | public RowDataRequest setDataType(String mDataType) {
141 | dataType = mDataType;
142 | return this;
143 | }
144 |
145 | public String getValue() {
146 | return value;
147 | }
148 |
149 | public RowDataRequest setValue(String mValue) {
150 | value = mValue;
151 | return this;
152 | }
153 | }
154 | }
155 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/ResponseHandler.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | import java.io.IOException;
4 | import java.io.PrintStream;
5 |
6 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.Utils;
7 |
8 | public class ResponseHandler {
9 | private PrintStream printStream;
10 |
11 | public ResponseHandler(PrintStream printStream) {
12 | this.printStream = printStream;
13 | }
14 |
15 | /**
16 | * 响应跨域请求
17 | *
18 | */
19 | public void onRequestOptions() {
20 | printStream.println("HTTP/1.0 200 OK");
21 | printStream.println("Access-Control-Allow-Methods: *");
22 | printStream.println("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
23 | printStream.println("Access-Control-Max-Age: Origin, 3600");
24 | printStream.println("access-control-allow-origin: *");
25 | printStream.println("Content-Length: " + 0);
26 | printStream.println();
27 | printStream.flush();
28 | printStream.close();
29 | }
30 |
31 | public void onServerPostOK( String contentType, byte[] bytes) throws IOException {
32 | printStream.println("HTTP/1.1 200 OK");
33 | printStream.println("Content-Type: " + contentType);
34 | printStream.println("access-control-allow-origin: *");
35 | printStream.println("Content-Length: " + bytes.length);
36 | printStream.println();
37 | printStream.write(bytes);
38 | printStream.flush();
39 | }
40 |
41 | public void onServerError(String msg) {
42 | printStream.println("HTTP/1.0 500 Internal Server Error");
43 | printStream.println("Content-Type: application/json");
44 | printStream.println("access-control-allow-origin: *");
45 | printStream.println();
46 | printStream.println(new Response().setCode(Response.code_Error).setMsg("服务器异常 " + msg).toJson());
47 | printStream.println();
48 | printStream.flush();
49 | }
50 | public void onServerPostError(String msg) {
51 | printStream.println("HTTP/1.1 200 OK");
52 | printStream.println("Content-Type: application/json");
53 | printStream.println("access-control-allow-origin: *");
54 | printStream.println();
55 | printStream.println(new Response().setCode(Response.code_Error).setMsg(msg).toJson());
56 | printStream.println();
57 | printStream.flush();
58 | }
59 | public void onServerNotFound(String msg){
60 | printStream.println("HTTP/1.1 404 Not Found");
61 | printStream.println("Content-Type: application/json");
62 | printStream.println("access-control-allow-origin: *");
63 | printStream.println();
64 | printStream.println(new Response().setCode(Response.code_FileNotFound).setMsg(msg).toJson());
65 | printStream.println();
66 | printStream.flush();
67 | }
68 |
69 | /**
70 | *
71 | * @param isAttachment 是否是附件下载
72 | * @param fileName
73 | * @param contentType
74 | * @param bytes
75 | * @throws IOException
76 | */
77 | public void onServerGetFile(boolean isAttachment,String fileName,String contentType,byte[] bytes) throws IOException {
78 | printStream.println("HTTP/1.1 200 OK");
79 | printStream.println("Content-Type: " + contentType);
80 | printStream.println("Cache-Control: max-age=3600");
81 | printStream.println("access-control-allow-origin: *");
82 | if (isAttachment) {
83 | printStream.println("Content-Disposition: attachment; filename = " + fileName);
84 | } else {
85 | printStream.println("Content-Disposition: filename = " + fileName);
86 | }
87 | printStream.println("Content-Length: " + bytes.length);
88 | printStream.println();
89 | printStream.write(bytes);
90 | printStream.println();
91 | printStream.flush();
92 | }
93 | public void sendPost(Object response) {
94 | byte[] bytes=null;
95 | if (response==null){
96 | onServerError("not found action");
97 | }else {
98 | bytes = DebugDataTool.ObjectToJson(response).getBytes();
99 | DebugDataTool.onResponse(new String(bytes));
100 | try {
101 | onServerPostOK(Utils.JSON, bytes);
102 | } catch (IOException e) {
103 | e.printStackTrace();
104 | onServerPostError(e.getLocalizedMessage());
105 | }
106 | }
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/java/com/itgowo/tool/android_debugdata_webtool/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.itgowo.tool.android_debugdata_webtool;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.text.method.ScrollingMovementMethod;
6 | import android.view.View;
7 | import android.widget.TextView;
8 |
9 | public class MainActivity extends AppCompatActivity {
10 | private TextView mTextView;
11 |
12 | @Override
13 | protected void onCreate(Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | setContentView(R.layout.activity_main);
16 | mTextView = (TextView) findViewById(R.id.msg);
17 | mTextView.setMovementMethod(ScrollingMovementMethod.getInstance());
18 | findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() {
19 | @Override
20 | public void onClick(View v) {
21 | mTextView.setText("");
22 | }
23 | });
24 | // getSharedPreferences("appinfo", MODE_PRIVATE).edit().putBoolean("Booblean", true).commit();
25 | // getSharedPreferences("appinfo", MODE_PRIVATE).edit().putFloat("Float", 1.5f).commit();
26 | // getSharedPreferences("appinfo", MODE_PRIVATE).edit().putLong("Long", 1232131231).commit();
27 | // getSharedPreferences("appinfo", MODE_PRIVATE).edit().putString("String", "tadsfsadfest").commit();
28 | // getSharedPreferences("appinfo", MODE_PRIVATE).edit().putInt("Int", 1234).commit();
29 | // DBManager.init(getApplication(), "appinfo.db", null);
30 | // DBManager.updateCache("first", "yes");
31 | // DBManager.updateCache("second", "no");
32 | // DBManager.updateCache("haha", "hehe");
33 | // for (int i = 0; i < 50; i++) {
34 | // DBManager.addCache("haha"+i, "hehe");
35 | // }
36 |
37 | // DebugDataTool.initialize(this, 8088, false, new onDebugToolListener() {
38 | //
39 | //
40 | // @Override
41 | // public void onSystemMsg(final String mS) {
42 | // runOnUiThread(new Runnable() {
43 | // @Override
44 | // public void run() {
45 | // SpannableStringBuilder mBuilder = new SpannableStringBuilder("onSystemMsg:" + mS + "\r\n\r\n");
46 | // mBuilder.setSpan(new ForegroundColorSpan(Color.GREEN), 0, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
47 | // mTextView.append(mBuilder);
48 | // }
49 | // });
50 | // }
51 | //
52 | // @Override
53 | // public String onObjectToJson(Object mObject) {
54 | // return JSON.toJSONString(mObject);
55 | // }
56 | //
57 | // @Override
58 | // public T onJsonStringToObject(String mJsonString, Class mClass) {
59 | // return JSON.parseObject(mJsonString, mClass);
60 | // }
61 | //
62 | // @Override
63 | // public void onGetRequest(String mRequest, final HttpRequest mHttpRequest) {
64 | // runOnUiThread(new Runnable() {
65 | // @Override
66 | // public void run() {
67 | // SpannableStringBuilder mBuilder = new SpannableStringBuilder("onGetRequest:" + mHttpRequest.toString() + "\r\n\r\n");
68 | // mBuilder.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
69 | // mTextView.append(mBuilder);
70 | // }
71 | // });
72 | // Log.d("onGetRequest", mHttpRequest.toString());
73 | // }
74 | //
75 | //
76 | // @Override
77 | // public void onResponse(final String mResponse) {
78 | // runOnUiThread(new Runnable() {
79 | // @Override
80 | // public void run() {
81 | // SpannableStringBuilder mBuilder = new SpannableStringBuilder("onResponse:" + mResponse + "\r\n\r\n");
82 | // mBuilder.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
83 | // mTextView.append(mBuilder);
84 | // }
85 | // });
86 | // Log.d("onResponse", mResponse);
87 | // }
88 | //
89 | // @Override
90 | // public void onError(final String mTip, final Throwable mThrowable) {
91 | // runOnUiThread(new Runnable() {
92 | // @Override
93 | // public void run() {
94 | // SpannableStringBuilder mBuilder = new SpannableStringBuilder("onError:" + mTip + " " + mThrowable.getMessage() + "\r\n\r\n");
95 | // mBuilder.setSpan(new ForegroundColorSpan(Color.RED), 0, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
96 | // mTextView.append(mBuilder);
97 | // }
98 | // });
99 | // Log.e("DebugDataWebTool", mTip + " " + mThrowable.getMessage());
100 | // mThrowable.printStackTrace();
101 | // }
102 | // });
103 | }
104 |
105 | }
106 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # android_debugdata_webtool
2 | android debug database SharedPreference 查看并修改手机数据库和共享参数的工具,优化了amitshekhar工程的好多细节功能和代码
3 |
4 |
5 | 支持云端远程控制版本:https://github.com/itgowo/RemoteDataControllerForAndroid
6 |
7 | http://itgowo.com
8 |
9 | QQ:1264957104
10 |
11 | Email:lujianchao@itgowo.com
12 | # 这个版本不再更新,遗留了一些bug,请用[新版](https://github.com/itgowo/RemoteDataControllerForAndroid)
13 |
14 | 前辈版本 Github:https://github.com/amitshekhariitbhu/Android-Debug-Database
15 | 大家可以去膜拜一下前辈
16 |
17 | 因为一次使用中发现国外前辈写的服务和接口无法满足我的使用,主要是用的GET请求方式,再编码后url过于长,超出范围就会数据丢失,所以我改成了POST请求的,并且重写了Server逻辑,从Socket拿到流再解析http报文,再到业务处理,同时增加了文件管理功能,相对前辈作品来说这个bug少,功能强,有问题欢迎提问,最好放到issues里,直接问也会回答但是issues也是人气的表现,谢谢各位啦!
18 |
19 | ## 懒人模式,1.0.4版只需要一行代码就可以了,compile就会自动延时1.2秒开启,也保留了旧版手动开启,第二次开启会自动关闭第一次服务;
20 | ## 自动识别开发者使用的三方Json库并使用,同时用反射找Json工具类,一如既往不引入第三方,不管你用的是fastjson还是Gson,都能自动使用,目前只支持两个最常用的,优先使用fastjson。
21 |
22 | ## 优化与改进
23 |
24 | #### 1.增加多线程处理请求
25 | #### 2.手动解析http报文数据,增加HttpRequest类
26 | #### 3.web端get请求改成post请求,满足大数据量需求
27 | #### 4.服务端增加post处理能力,支持大数据量传输
28 | #### 5.增加文件管理功能(接口已完成)
29 | #### 6.更改布局和页面逻辑,数据库和共享参数分开,文件管理功能目前简单实现了目录浏览和文件下载功能
30 | #### 7.增加跨域请求Options处理,解决跨域问题
31 | #### 8.统一规范:返回值Response类,请求Request类,接口规范GET请求为资源请求,options请求为跨域说明,POST请求为数据交互
32 | #### 9.POST请求统一用action表示意向操作
33 | #### 10.本支持库为了尽量少的引用第三方,降低耦合性,由使用者定义json工具
34 |
35 | ## Server:android app(纯java和android原生代码实现http报文解析操作等)
36 |
37 | ## web:JQuery、BootStrap和DataTables框架,资源放到app内部,无需联网也可访问
38 |
39 | # 使用方法
40 |
41 | #### 1:可以将webToolLibrary.aar文件放到工程lib库里直接依赖,亦可以下载工程单独把lib放到项目里( compile project(':webtoollibrary'))
42 |
43 | #### 2.依赖
44 |
45 | ```
46 | buildscript {
47 | repositories {
48 | jcenter()
49 | *****
50 | }
51 | *****
52 | }
53 | ```
54 |
55 | maven依赖
56 | ```
57 |
58 | com.itgowo
59 | android-WebDebugTool
60 | 1.0.10
61 | pom
62 |
63 | ```
64 | Gradle依赖
65 | ```
66 | compile 'com.itgowo:android-WebDebugTool:1.0.10'
67 | debugCompile 'com.itgowo:android-WebDebugTool:1.0.10' //推荐
68 |
69 | Android Gradle plugin 3.0或更高
70 | debugApi 'com.itgowo:android-WebDebugTool:1.0.10' //推荐
71 | api 'com.itgowo:android-WebDebugTool:1.0.10'
72 | ```
73 | #### 3.初始化
74 |
75 | 可以在App启动后任意需要时刻初始化,不手动或手动触发较晚,都会在2秒内自动自动初始化,如果开发者自己手动启动且在application的onCreat()中,自动启动将失效。
76 | ###最简单的是,下面都不配置代码,是会自动启动服务器的。
77 |
78 | 第一个参数为context,第二个参数为端口,第三个参数为线程模式(是否是多线程),第四个为服务器状态监听。
79 | ```
80 | public static void initialize(Context context, int mPortNumber, boolean isMultMode, onDebugToolListener mOnDebugToolListener) {
81 | ```
82 |
83 | ```
84 | DebugDataTool.initialize(this, 8088, false, new onDebugToolListener() {
85 |
86 | @Override
87 | public void onSystemMsg(final String mS) {
88 | //系统信息,主要是一些提示性信息,例如服务器地址
89 | }
90 |
91 | @Override
92 | public String onObjectToJson(Object mObject) {
93 | //对象转换为json文本,本支持库为了尽量少的因为第三方,降低耦合性,由使用者定义json工具,可以用Gson或者fastjson等,demo使用的是fastjson。
94 | return JSON.toJSONString(mObject);
95 | }
96 |
97 | @Override
98 | public T onJsonStringToObject(String mJsonString, Class mClass) {
99 | //文本转换为Json对象,本支持库为了尽量少的因为第三方,降低耦合性,由使用者定义json工具,可以用Gson或者fastjson等,demo使用的是fastjson。
100 | return JSON.parseObject(mJsonString, mClass);
101 | }
102 |
103 | @Override
104 | public void onGetRequest(String mRequest, final HttpRequest mHttpRequest) {
105 | //服务器收到请求,文件请求只打印请求path,数据接口交互HTTPRequest包含报文全部信息
106 | }
107 |
108 |
109 | @Override
110 | public void onResponse(final String mResponse) {
111 | //服务器返回给页面的信息,只有跨域请求Options和POST数据交互时才会触发,文件下载不触发。
112 | }
113 |
114 | @Override
115 | public void onError(final String mTip, final Throwable mThrowable) {
116 | //捕捉到的服务器异常
117 | });
118 |
119 | ```
120 |
121 |
122 | #### 4.说明
123 |
124 | app启动后日志会打印手机网路地址(请在wifi下测试,模拟器无效),用浏览器打开对应地址就可以正常使用了,如果偶尔数据请求不到刷新页面即可,可能是某个js文件加载失败造成的,demo的屏幕打印了部分日志,方便测试。
125 |
126 | ## API
127 |
128 | ### Database 数据库
129 |
130 | [getDbList](/API/getDbList.md)
131 |
132 | [getTableList](/API/getTableList.md)
133 |
134 | [getDataFromDbTable](/API/getDataFromDbTable.md)
135 |
136 | [addDataToDb](/API/addDataToDb.md)
137 |
138 | [deleteDataFromDb](/API/deleteDataFromDb.md)
139 |
140 | [updateDataToDb](/API/updateDataToDb.md)
141 |
142 | [query](/API/query.md)
143 |
144 |
145 | ### SharedPreferences 共享参数
146 |
147 | [getSpList](/API/getSpList.md)
148 |
149 | [getDataFromSpFile](/API/getDataFromSpFile.md)
150 |
151 | [addDataToSp](/API/addDataToSp.md)
152 |
153 | [deleteDataFromSp](/API/deleteDataFromSp.md)
154 |
155 | [updateDataToSp](/API/updateDataToSp.md)
156 |
157 |
158 | ### FileManager 文件管理
159 |
160 | [getFileList](/API/getFileList.md)
161 |
162 | [downloadFile](/API/downloadFile.md)
163 |
164 | [deleteFile](/API/deleteFile.md)
165 |
166 |
167 | ## 图片示例(web界面功能开发中,样式有待调整)
168 |
169 | 
170 |
171 | 
172 |
173 | 
174 |
175 | 
176 |
177 | 
178 |
179 | 
180 |
181 | 
182 |
183 |
184 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/HttpRequest.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | /**
7 | * Created by hnvfh on 2017/8/21.
8 | */
9 |
10 | public class HttpRequest {
11 | private static final String TAG = "HttpRequest";
12 | private String method;// 请求方法
13 | private String protocol;// 协议版本
14 | private String requestURI = "";//请求的URI地址 在HTTP请求的第一行的请求方法后面
15 | private String path = "";//path地址
16 | private String body;//body信息
17 |
18 | public static String Accept_Charset = "Accept-Charset";//请求的字符编码 对应HTTP请求中的Accept-Charset
19 | public static String Connection = "Connection";//Http请求连接状态信息 对应HTTP请求中的Connection
20 | public static String Host = "Host";//请求的主机信息
21 | public static String User_Agent = "User-Agent";// 代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent:
22 | public static String Accept_Language = "Accept-Language";//对应Accept-Language
23 | public static String Accept_Encoding = "Accept-Encoding";//请求的编码方式 对应HTTP请求中的Accept-Encoding
24 |
25 | private Map mParameter = new HashMap<>();//get请求附加参数
26 | private Map mHeaders = new HashMap<>();//head信息
27 |
28 |
29 | private HttpRequest() {
30 | }
31 |
32 |
33 | public static HttpRequest parser(String mHttp) throws Exception {
34 | if (mHttp == null || mHttp.isEmpty() || mHttp.length() < 5) {
35 | DebugDataTool.onError(TAG, new Throwable("http parser: 数据不对,http报文不对"));
36 | return null;
37 | }
38 | HttpRequest mHttpRequest = new HttpRequest();
39 | int position = mHttp.indexOf("\r\n\r\n");//查找是否有连续两个换行
40 | if (position > -1) {
41 | parserHeader(mHttp, mHttpRequest, position);
42 | mHttpRequest.setBody(mHttp.substring(position + 4, mHttp.length()));
43 | } else {
44 | String[] mStrings = mHttp.split("\r\n");
45 | if (mStrings != null && mStrings.length > 0 && mStrings[0].contains("HTTP/1.1")) {
46 | parserHeader(mHttp, mHttpRequest, mHttp.trim().length());
47 | } else {
48 | mHttpRequest.setBody(mHttp);
49 | }
50 | }
51 |
52 |
53 | return mHttpRequest;
54 | }
55 |
56 | private static void parserHeader(String mHttp, HttpRequest mHttpRequest, int position) {
57 | String[] heads = mHttp.substring(0, position).trim().split("\r\n");
58 | if (heads != null && heads.length > 1) {
59 | String[] mRequestLine = heads[0].split(" ");
60 | mHttpRequest.setMethod(mRequestLine[0]);
61 | mHttpRequest.setProtocol(mRequestLine[2]);
62 | String[] mP = mRequestLine[1].split("\\?");
63 | if (mP != null && mP.length > 0) {
64 | mHttpRequest.setRequestURI(mRequestLine[1]);
65 | mHttpRequest.setPath(mP[0].isEmpty() ? "" : mP[0].substring(1));
66 | if (mP.length > 1) {
67 | String[] mParameter1 = mP[1].split("&");
68 | if (mParameter1 != null) {
69 | for (int mI = 0; mI < mParameter1.length; mI++) {
70 | String[] mS = mParameter1[mI].split("=");
71 | if (mS != null && mS.length == 2) {
72 | mHttpRequest.mParameter.put(mS[0], mS[1]);
73 | }
74 | }
75 | }
76 | }
77 | }
78 |
79 | for (int mI = 0; mI < (heads.length - 1); mI++) {
80 | String[] head = heads[mI + 1].split(":");
81 | if (head == null || head.length != 2) {
82 | continue;
83 | }
84 | mHttpRequest.mHeaders.put(head[0], head[1]);
85 | }
86 | }
87 | }
88 |
89 | public String getMethod() {
90 | return method;
91 | }
92 |
93 | public HttpRequest setMethod(String mMethod) {
94 | method = mMethod;
95 | return this;
96 | }
97 |
98 | public T getRequest(Class tClass) {
99 | return DebugDataTool.JsonToObject(getBody(), tClass);
100 | }
101 |
102 | public Map getHeaders() {
103 | return mHeaders;
104 | }
105 |
106 | public HttpRequest setHeaders(Map mHeaders) {
107 | this.mHeaders = mHeaders;
108 | return this;
109 | }
110 |
111 | public Map getParameter() {
112 | return mParameter;
113 | }
114 |
115 | public HttpRequest setParameter(Map mParameter) {
116 | this.mParameter = mParameter;
117 | return this;
118 | }
119 |
120 | public String getPath() {
121 | return path;
122 | }
123 |
124 | public HttpRequest setPath(String mPath) {
125 | path = mPath;
126 | return this;
127 | }
128 |
129 | public String getProtocol() {
130 | return protocol;
131 | }
132 |
133 | public HttpRequest setProtocol(String mProtocol) {
134 | protocol = mProtocol;
135 | return this;
136 | }
137 |
138 | public String getBody() {
139 | return body;
140 | }
141 |
142 | public HttpRequest setBody(String mBody) {
143 | body = mBody;
144 | return this;
145 | }
146 |
147 |
148 | public String getRequestURI() {
149 | return requestURI;
150 | }
151 |
152 | public HttpRequest setRequestURI(String mRequestURI) {
153 | requestURI = mRequestURI;
154 | return this;
155 | }
156 |
157 | @Override
158 | public String toString() {
159 | return "HttpRequest{" +
160 | "method='" + method + '\'' +
161 | ", requestURI='" + requestURI + '\'' +
162 | ", body='" + body + '\'' +
163 | '}';
164 | }
165 | }
166 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/utils/Utils.java:
--------------------------------------------------------------------------------
1 | /*
2 | *
3 | * * Copyright (C) 2016 Amit Shekhar
4 | * * Copyright (C) 2011 Android Open Source Project
5 | * *
6 | * * Licensed under the Apache License, Version 2.0 (the "License");
7 | * * you may not use this file except in compliance with the License.
8 | * * You may obtain a copy of the License at
9 | * *
10 | * * http://www.apache.org/licenses/LICENSE-2.0
11 | * *
12 | * * Unless required by applicable law or agreed to in writing, software
13 | * * distributed under the License is distributed on an "AS IS" BASIS,
14 | * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | * * See the License for the specific language governing permissions and
16 | * * limitations under the License.
17 | *
18 | */
19 |
20 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils;
21 |
22 | import android.content.Context;
23 | import android.content.res.AssetManager;
24 | import android.text.TextUtils;
25 | import android.util.Log;
26 |
27 | import java.io.ByteArrayOutputStream;
28 | import java.io.File;
29 | import java.io.FileInputStream;
30 | import java.io.FileNotFoundException;
31 | import java.io.IOException;
32 | import java.io.InputStream;
33 | import java.util.HashMap;
34 | import java.util.TreeMap;
35 |
36 | /**
37 | * Created by lujianchao on 2017.8.22.
38 | */
39 |
40 | public class Utils {
41 |
42 | private static final String TAG = "Utils";
43 | public static final String JSON = "application/json;charset=utf-8";
44 | public static final String HTML = "text/html";
45 | public static final String JS = "application/javascript";
46 | public static final String CSS = "text/css";
47 | public static final String OBJECT = "application/octet-stream";
48 |
49 | private Utils() {
50 | // This class in not publicly instantiable
51 | }
52 |
53 | public static String detectMimeType(String fileName) {
54 | if (TextUtils.isEmpty(fileName)) {
55 | return JSON;
56 | } else if (fileName.endsWith(".html")) {
57 | return HTML;
58 | } else if (fileName.endsWith(".js")) {
59 | return JS;
60 | } else if (fileName.endsWith(".css")) {
61 | return CSS;
62 | } else {
63 | return OBJECT;
64 | }
65 | }
66 |
67 | public static byte[] loadContent(String fileName, AssetManager assetManager) throws IOException {
68 | InputStream input = null;
69 | try {
70 | ByteArrayOutputStream output = new ByteArrayOutputStream();
71 | input = assetManager.open(fileName);
72 | byte[] buffer = new byte[1024];
73 | int size;
74 | while (-1 != (size = input.read(buffer))) {
75 | output.write(buffer, 0, size);
76 | }
77 | output.flush();
78 | return output.toByteArray();
79 | } catch (FileNotFoundException e) {
80 | return null;
81 | } finally {
82 | try {
83 | if (null != input) {
84 | input.close();
85 | }
86 | } catch (Exception e) {
87 | e.printStackTrace();
88 | }
89 | }
90 | }
91 |
92 |
93 | /**
94 | * 获取文件
95 | *
96 | * @param mFile
97 | * @return
98 | */
99 | public static byte[] getFile(File mFile) {
100 | if (mFile==null||!mFile.exists()) {
101 | return null;
102 | }
103 |
104 | byte[] byteArray = new byte[0];
105 | try {
106 | byteArray = null;
107 | try {
108 | InputStream inputStream = new FileInputStream(mFile);
109 | ByteArrayOutputStream bos = new ByteArrayOutputStream();
110 | byte[] b = new byte[(int) mFile.length()];
111 | int bytesRead;
112 |
113 | while ((bytesRead = inputStream.read(b)) != -1) {
114 | bos.write(b, 0, bytesRead);
115 | }
116 | byteArray = bos.toByteArray();
117 | } catch (IOException e) {
118 | }
119 | } catch (Exception e) {
120 | e.printStackTrace();
121 | }
122 | return byteArray;
123 | }
124 |
125 | public static String formatFileSize(Context context, long number, boolean shorter) {
126 | if (context == null) {
127 | return "";
128 | }
129 |
130 | float result = number;
131 | String suffix = "B";
132 | if (result > 900) {
133 | suffix = "KB";
134 | result = result / 1024;
135 | }
136 | if (result > 900) {
137 | suffix = "MB";
138 | result = result / 1024;
139 | }
140 | if (result > 900) {
141 | suffix = "GB";
142 | result = result / 1024;
143 | }
144 | if (result > 900) {
145 | suffix = "TB";
146 | result = result / 1024;
147 | }
148 | if (result > 900) {
149 | suffix = "PB";
150 | result = result / 1024;
151 | }
152 | String value;
153 | if (result < 1) {
154 | value = String.format("%.2f", result);
155 | } else if (result < 10) {
156 | if (shorter) {
157 | value = String.format("%.1f", result);
158 | } else {
159 | value = String.format("%.2f", result);
160 | }
161 | } else if (result < 100) {
162 | if (shorter) {
163 | value = String.format("%.0f", result);
164 | } else {
165 | value = String.format("%.2f", result);
166 | }
167 | } else {
168 | value = String.format("%.0f", result);
169 | }
170 |
171 | return value + suffix;
172 | }
173 | }
174 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Android-DebugData-Webtool
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | 
33 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
77 |
78 |
79 |
98 |
99 |
100 |
101 |
数据修改成功
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
124 |
125 |
126 |
127 |
130 |
131 |
132 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/assets/css/buttons.dataTables.min.css:
--------------------------------------------------------------------------------
1 | div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(top, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(top, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(top, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(top, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(top, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}
2 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/app/src/main/java/com/itgowo/tool/android_debugdata_webtool/DBManager.java:
--------------------------------------------------------------------------------
1 | package com.itgowo.tool.android_debugdata_webtool;
2 |
3 | import android.app.Application;
4 | import android.content.ContentValues;
5 | import android.content.Context;
6 | import android.database.Cursor;
7 | import android.database.sqlite.SQLiteDatabase;
8 | import android.database.sqlite.SQLiteOpenHelper;
9 |
10 | import java.lang.reflect.Field;
11 | import java.util.ArrayList;
12 | import java.util.Iterator;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by lujianchao on 2017/6/14.
17 | */
18 |
19 | public class DBManager {
20 | private static Application sApp;
21 |
22 | public static String DBName = "appinfo.db";
23 | public static Class TableClass = HistoryCache.class;
24 |
25 | public static void init(Application mApplication,String mDBName,Class mTableClass) {
26 | DBName=mDBName;
27 | sApp = mApplication;
28 | if (mTableClass!=null){
29 | TableClass=mTableClass;
30 | }
31 | }
32 |
33 |
34 | private static final String CREATE_CacheTABLE = "create table "+TableClass.getSimpleName()+" (id integer primary key autoincrement, key text, value text, lasttime long, bak text, flag text)";
35 | /**
36 | * 更改类文件必须更改版本号,否则不会更新缓存结构
37 | */
38 | public static final int DBVersion = 1;
39 | private static DBHelper mCacheDBHelper;
40 | private static SQLiteDatabase mSQLiteDatabase;
41 |
42 | /**
43 | * 删除数据库
44 | */
45 | public synchronized static void deleteDB() {
46 | sApp.deleteDatabase(DBName);
47 | }
48 |
49 | /**
50 | * 更新缓存
51 | *
52 | * @param key 预定义名称
53 | * @param value 待缓存数据
54 | */
55 | public synchronized static void updateCache(String key, String value) {
56 | if (mCacheDBHelper == null) {
57 | mCacheDBHelper = new DBHelper(sApp, DBName, null, DBVersion);
58 | }
59 | if (mSQLiteDatabase == null) {
60 | mSQLiteDatabase = mCacheDBHelper.getWritableDatabase();
61 | }
62 | ContentValues m = new ContentValues();
63 | m.put("value", value);
64 | m.put("lasttime", System.currentTimeMillis());
65 | try {
66 | mSQLiteDatabase.update(HistoryCache.class.getSimpleName(), m, "key=?", new String[]{key});
67 | } catch (Exception mE) {
68 | mE.printStackTrace();
69 | }
70 | }
71 |
72 | /**
73 | * 尽量不用,数据会越来越多
74 | *
75 | * @param key
76 | * @param value
77 | */
78 | public synchronized static void addCache(String key, String value) {
79 | if (mCacheDBHelper == null) {
80 | mCacheDBHelper = new DBHelper(sApp, DBName, null, DBVersion);
81 | }
82 | if (mSQLiteDatabase == null) {
83 | mSQLiteDatabase = mCacheDBHelper.getWritableDatabase();
84 | }
85 | ContentValues m = new ContentValues();
86 | m.put("key", key);
87 | m.put("value", value);
88 | m.put("lasttime", System.currentTimeMillis());
89 | try {
90 | mSQLiteDatabase.insert(HistoryCache.class.getSimpleName(), null, m);
91 | } catch (Exception mE) {
92 | mE.printStackTrace();
93 | }
94 | }
95 |
96 | /**
97 | * 获取缓存数据
98 | *
99 | * @param key 预定义名称
100 | * @return 缓存数据,异常或者不存在则返回null
101 | */
102 | public static String getCache(String key) {
103 | String string = null;
104 | if (mCacheDBHelper == null) {
105 | mCacheDBHelper = new DBHelper(sApp, DBName, null, DBVersion);
106 | }
107 | if (mSQLiteDatabase == null) {
108 | mSQLiteDatabase = mCacheDBHelper.getWritableDatabase();
109 | }
110 | Cursor mCursor = null;
111 | try {
112 | mCursor = mSQLiteDatabase.rawQuery("select * from " + HistoryCache.class.getSimpleName() + " where key=?", new String[]{key});
113 | if (mCursor != null && mCursor.getCount() == 1) {
114 | mCursor.moveToNext();
115 | string = mCursor.getString(2);
116 | }
117 | } catch (Exception mE) {
118 | mE.printStackTrace();
119 | } finally {
120 | if (mCursor != null) {
121 | mCursor.close();
122 | }
123 | return string;
124 |
125 | }
126 |
127 | }
128 |
129 | /**
130 | * Created by lujianchao on 2016/11/29.
131 | * SQLiteOpenHelper
132 | *
133 | * @author lujianchao
134 | */
135 | public static class DBHelper extends SQLiteOpenHelper {
136 |
137 |
138 | public DBHelper(final Context context, final String name, final SQLiteDatabase.CursorFactory factory, final int version) {
139 | super(context, name, factory, version);
140 | }
141 |
142 | @Override
143 | public void onCreate(final SQLiteDatabase db) {
144 | db.execSQL(CREATE_CacheTABLE);
145 | updatetable(db, TableClass);
146 | }
147 |
148 | @Override
149 | public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
150 | updatetable(db, TableClass);
151 | }
152 |
153 | /**
154 | * 传入的类名即为表名,传入的类的属性即为表内的记录,字段固定,用来实现动态增减记录,记录为缓存内容,所以数量较少,
155 | * 只需要更改实体类属性,就可以管理数据库了,动态升级。
156 | *
157 | * @param db
158 | * @param mClass
159 | */
160 | private void updatetable(final SQLiteDatabase db, Class mClass) {
161 | /**
162 | * 通过反射拿到当前所有cache名
163 | */
164 | List mList = new ArrayList<>();
165 | Field[] fields = mClass.getDeclaredFields();
166 | for (Field fd : fields) {
167 | fd.setAccessible(true);
168 | if (!fd.getName().equals("serialVersionUID") && !fd.getName().equals("$change")) {
169 | mList.add(fd.getName());
170 | }
171 | }
172 | Cursor mCursor = db.rawQuery("select * from " + mClass.getSimpleName(), null);
173 | while (mCursor.moveToNext()) {
174 | boolean ishave = false;
175 | String string = mCursor.getString(1);
176 | Iterator mStringIterator = mList.iterator();
177 | while (mStringIterator.hasNext()) {
178 | if (mStringIterator.next().equals(string)) {
179 | ishave = true;
180 | mStringIterator.remove();
181 | break;
182 | }
183 | }
184 | /**
185 | * 类里没有这个缓存名就将其删掉
186 | */
187 | if (!ishave) {
188 | db.delete(mClass.getSimpleName(), "key=?", new String[]{string});
189 | }
190 | }
191 | mCursor.close();
192 | for (int mI = 0; mI < mList.size(); mI++) {
193 | ContentValues values = new ContentValues();
194 | values.put("key", mList.get(mI));
195 | values.put("lasttime", System.currentTimeMillis());
196 | db.insert(mClass.getSimpleName(), null, values);
197 | }
198 | }
199 | }
200 |
201 | /**
202 | * Created by lujianchao on 2016/11/29.
203 | * 数据结构
204 | * 添加或者删除属性变量值,都必须更改数据库版本号,否则不会修改
205 | *
206 | * @author lujianchao
207 | */
208 |
209 | public static class HistoryCache {
210 | /**
211 | * 新派队首页
212 | */
213 | public static String GetHomeInfo = "GetHomeInfo";
214 |
215 | /**
216 | * 运动项目列表
217 | */
218 | public static String getSportItemListByParams = "getSportItemListByParams";
219 | public static String TestA = "TestA";
220 | public static String TestB = "TestB";
221 | public static String TestC = "TestC";
222 | }
223 | }
224 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/DebugDataTool.java:
--------------------------------------------------------------------------------
1 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
2 |
3 | import android.content.Context;
4 | import android.util.Log;
5 |
6 | import java.io.File;
7 | import java.io.IOException;
8 | import java.lang.reflect.InvocationTargetException;
9 | import java.lang.reflect.Method;
10 | import java.util.HashMap;
11 |
12 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.NetworkUtils;
13 |
14 | /**
15 | * Created by lujianchao on 2017/8/22.
16 | */
17 |
18 | public class DebugDataTool {
19 |
20 | private static final String TAG = DebugDataTool.class.getSimpleName();
21 | public static final String WARNING_JSON = "not found fastjson,not found Gson,onDebugToolListener is null,如果使用默认方式实现Json工具的方式,请在主工程中使用fastjson或者Gson库,或者实现自定义Json方法,不然无法处理Json,此工具内部不集成任何第三方,绿色无公害(ˇˍˇ) 想~";
22 | private static final int DEFAULT_PORT = 8080;
23 | private static ClientServer clientServer;
24 |
25 | private static String addressLog = "not available";
26 | private static onDebugToolListener mToolListener;
27 | private static Class mFastJson = null;
28 | private static Object mGsonJson = null;
29 | private static boolean isFastJson = true;
30 | private static Method mJsonMethodToJsonString = null;
31 | private static Method mJsonMethodToJsonObject = null;
32 |
33 |
34 | private DebugDataTool() {
35 | }
36 |
37 | protected static String ObjectToJson(Object mO) {
38 | if (mO != null) {
39 | if (mToolListener == null) {
40 | if (isFastJson) {
41 | try {
42 | return (String) mJsonMethodToJsonString.invoke(null, mO);
43 | } catch (IllegalAccessException mE) {
44 | mE.printStackTrace();
45 | } catch (InvocationTargetException mE) {
46 | mE.printStackTrace();
47 | }
48 | } else {
49 | try {
50 | return (String) mJsonMethodToJsonString.invoke(mGsonJson, mO);
51 | } catch (IllegalAccessException mE) {
52 | mE.printStackTrace();
53 | } catch (InvocationTargetException mE) {
54 | mE.printStackTrace();
55 | }
56 | }
57 | }
58 | return mToolListener.onObjectToJson(mO);
59 | }
60 | return "";
61 | }
62 |
63 | protected static T JsonToObject(String mJsonString, Class mClass) {
64 | if (mJsonString != null && mClass != null) {
65 | if (mToolListener == null) {
66 | if (isFastJson) {
67 | try {
68 | return (T) mJsonMethodToJsonObject.invoke(null, mJsonString, mClass);
69 | } catch (IllegalAccessException mE) {
70 | mE.printStackTrace();
71 | } catch (InvocationTargetException mE) {
72 | mE.printStackTrace();
73 | }
74 | } else {
75 | try {
76 | return (T) mJsonMethodToJsonObject.invoke(mGsonJson, mJsonString, mClass);
77 | } catch (IllegalAccessException mE) {
78 | mE.printStackTrace();
79 | } catch (InvocationTargetException mE) {
80 | mE.printStackTrace();
81 | }
82 | }
83 | }
84 | return mToolListener.onJsonStringToObject(mJsonString, mClass);
85 | }
86 | return null;
87 | }
88 |
89 | protected static void onRequest(String mS, HttpRequest mHttpRequest) {
90 | if (mS == null || mS.equals("")) {
91 | return;
92 | }
93 | if (mToolListener == null) {
94 | Log.d(TAG, mS + "\r\n" + mHttpRequest);
95 | } else {
96 | mToolListener.onGetRequest(mS, mHttpRequest);
97 | }
98 | }
99 |
100 |
101 | protected static void onResponse(String mS) {
102 | if (mToolListener == null) {
103 | Log.d(TAG, mS);
104 | } else {
105 | mToolListener.onResponse(mS);
106 | }
107 | }
108 |
109 | public synchronized static void initialize(Context context, int mPortNumber, boolean isMultMode, onDebugToolListener mOnDebugToolListener) {
110 | if (clientServer != null ) {
111 | try {
112 | clientServer.resetServerPort(mPortNumber);
113 | } catch (IOException mE) {
114 | mE.printStackTrace();
115 | } catch (InterruptedException mE) {
116 | mE.printStackTrace();
117 | }
118 | } else {
119 | mToolListener = mOnDebugToolListener;
120 | int portNumber;
121 | if (mPortNumber < 10) {
122 | portNumber = DEFAULT_PORT;
123 | } else {
124 | portNumber = mPortNumber;
125 | }
126 | if (mOnDebugToolListener == null) {
127 | onSystemMsg("未设置onDebugToolListener,自动搜索当前APP内使用的Json工具,目前支持FastJson和Gson");
128 | if (!searchJsonTool()) {
129 | return;
130 | }
131 | }
132 | clientServer = new ClientServer(context, portNumber, isMultMode);
133 | clientServer.start();
134 | addressLog = NetworkUtils.getAddressLog(context, portNumber);
135 | Log.d(TAG, "Open http://" + addressLog + " in your browser");
136 | Log.d(TAG, "请用浏览器打开 http://" + addressLog);
137 | DebugDataTool.onSystemMsg("请用浏览器打开 http://" + addressLog);
138 | }
139 | // System.out.println(TAG + " 请用浏览器打开 http://" + addressLog);
140 | }
141 |
142 | /**
143 | * 用反射检查APP内集成的Json工具。
144 | *
145 | * @return 是否找到并初始化
146 | */
147 | protected static boolean searchJsonTool() {
148 | try {
149 | mFastJson = Class.forName("com.alibaba.fastjson.JSON");
150 | isFastJson = true;
151 | mJsonMethodToJsonString = mFastJson.getMethod("toJSONString", Object.class);
152 | mJsonMethodToJsonObject = mFastJson.getMethod("parseObject", String.class, Class.class);
153 | } catch (ClassNotFoundException mE) {
154 |
155 | } catch (NoSuchMethodException mE) {
156 |
157 | }
158 | if (mFastJson == null || mJsonMethodToJsonString == null || mJsonMethodToJsonObject == null) {
159 | isFastJson = false;
160 | try {
161 | Class mGsonClass = Class.forName("com.google.gson.Gson");
162 | mGsonJson = mGsonClass.newInstance();
163 | mJsonMethodToJsonObject = mGsonClass.getDeclaredMethod("fromJson", String.class, Class.class);
164 | mJsonMethodToJsonString = mGsonClass.getDeclaredMethod("toJson", Object.class);
165 | } catch (ClassNotFoundException mE) {
166 |
167 | } catch (NoSuchMethodException mE) {
168 | mE.printStackTrace();
169 | } catch (IllegalAccessException mE) {
170 | mE.printStackTrace();
171 | } catch (InstantiationException mE) {
172 | mE.printStackTrace();
173 | }
174 | }
175 | if (mFastJson == null && mGsonJson == null || mJsonMethodToJsonString == null || mJsonMethodToJsonObject == null) {
176 | onError("警告", new Throwable(WARNING_JSON));
177 | onSystemMsg(WARNING_JSON);
178 | return false;
179 | }
180 | return true;
181 |
182 | }
183 |
184 | protected static void onSystemMsg(String mS) {
185 | if (mToolListener == null) {
186 | Log.i(TAG, mS);
187 | } else {
188 | mToolListener.onSystemMsg(mS);
189 | }
190 | }
191 |
192 | protected static void onError(String mTip, Throwable mThrowable) {
193 | if (mToolListener == null) {
194 | Log.e(TAG, mTip, mThrowable);
195 | } else {
196 | mToolListener.onError(mTip, mThrowable);
197 | }
198 | }
199 |
200 | public static String getAddressLog() {
201 | Log.d(TAG, addressLog);
202 | return addressLog;
203 | }
204 |
205 | public static void shutDown() {
206 | if (clientServer != null) {
207 | clientServer.stop();
208 | clientServer = null;
209 | }
210 | }
211 |
212 | /**
213 | * 指定appdata之外的可读数据库文件
214 | *
215 | * @param customDatabaseFiles
216 | */
217 | public static void setCustomDatabaseFiles(HashMap customDatabaseFiles) {
218 | if (clientServer != null) {
219 | clientServer.setCustomDatabaseFiles(customDatabaseFiles);
220 | }
221 | }
222 |
223 | public static boolean isServerRunning() {
224 | return clientServer != null && clientServer.isRunning();
225 | }
226 |
227 | }
228 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/RequestHandler.java:
--------------------------------------------------------------------------------
1 |
2 |
3 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary;
4 |
5 | import android.content.Context;
6 | import android.content.res.AssetManager;
7 | import android.text.TextUtils;
8 |
9 | import java.io.File;
10 | import java.io.IOException;
11 | import java.io.InputStream;
12 | import java.io.PrintStream;
13 | import java.net.Socket;
14 | import java.util.HashMap;
15 | import java.util.concurrent.ExecutorService;
16 | import java.util.concurrent.Executors;
17 |
18 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.Action;
19 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionAddDataToDb;
20 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionAddDataToSp;
21 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionDeleteDataFromDb;
22 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionDeleteDataFromSp;
23 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionDeleteFile;
24 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetDataFromDbTable;
25 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetDataFromSpFile;
26 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetDbList;
27 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetFileList;
28 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetSpList;
29 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionGetTableList;
30 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionQuery;
31 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionUpdateDataToDb;
32 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.action.ActionUpdateDataToSp;
33 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.Utils;
34 |
35 | /**
36 | * Created by lujianchao on 2017/8/22.
37 | */
38 |
39 | public class RequestHandler {
40 | private final Context context;
41 | private final AssetManager assetManager;
42 | private HashMap dispatcher = new HashMap<>();
43 | private ExecutorService executorService = Executors.newFixedThreadPool(3);
44 |
45 | public RequestHandler(Context context) {
46 | this.context = context;
47 | assetManager = context.getResources().getAssets();
48 | dispatcher.put(ActionGetDbList.ACTION, new ActionGetDbList());
49 | dispatcher.put(ActionGetSpList.ACTION, new ActionGetSpList());
50 | dispatcher.put(ActionGetTableList.ACTION, new ActionGetTableList());
51 | dispatcher.put(ActionGetDataFromDbTable.ACTION, new ActionGetDataFromDbTable());
52 | dispatcher.put(ActionGetDataFromSpFile.ACTION, new ActionGetDataFromSpFile());
53 | dispatcher.put(ActionAddDataToDb.ACTION, new ActionAddDataToDb());
54 | dispatcher.put(ActionAddDataToSp.ACTION, new ActionAddDataToSp());
55 | dispatcher.put(ActionUpdateDataToDb.ACTION, new ActionUpdateDataToDb());
56 | dispatcher.put(ActionUpdateDataToSp.ACTION, new ActionUpdateDataToSp());
57 | dispatcher.put(ActionDeleteDataFromDb.ACTION, new ActionDeleteDataFromDb());
58 | dispatcher.put(ActionDeleteDataFromSp.ACTION, new ActionDeleteDataFromSp());
59 | dispatcher.put(ActionQuery.ACTION, new ActionQuery());
60 | dispatcher.put(ActionGetFileList.ACTION, new ActionGetFileList());
61 | dispatcher.put(ActionDeleteFile.ACTION, new ActionDeleteFile());
62 | }
63 |
64 |
65 | /**
66 | * 多线程处理
67 | *
68 | * @param socket
69 | */
70 | public void asynHandle(final Socket socket) {
71 | executorService.execute(new Runnable() {
72 | @Override
73 | public void run() {
74 | try {
75 | syncHandle(socket);
76 | } catch (Exception mE) {
77 | DebugDataTool.onError("web server:received request error,分配并处理数据异常", mE);
78 | }
79 | }
80 | });
81 | }
82 |
83 | public void syncHandle(Socket socket) throws Exception {
84 | InputStream inputStream = null;
85 | PrintStream printStream = null;
86 | try {
87 | int count = 0;
88 | StringBuilder stringBuilder = new StringBuilder();
89 | inputStream = socket.getInputStream();
90 | byte[] bytes1 = new byte[1024];
91 | while (true) {
92 | count = inputStream.read(bytes1);
93 | if (count > 0) {
94 | stringBuilder.append(new String(bytes1, 0, count));
95 | }
96 | if (count < 1024) {
97 | break;
98 | }
99 | }
100 | HttpRequest httpRequest = null;
101 | try {
102 | httpRequest = HttpRequest.parser(stringBuilder.toString().trim());
103 | } catch (Exception mE) {
104 | DebugDataTool.onError("web server:RequestHandler error,http请求解析异常", mE);
105 | }
106 | if (httpRequest == null) {
107 | return;
108 | }
109 | // Output stream that we send the response to
110 | printStream = new PrintStream(socket.getOutputStream());
111 | ResponseHandler responseHandler = new ResponseHandler(printStream);
112 | if ("OPTIONS".equalsIgnoreCase(httpRequest.getMethod())) {
113 | responseHandler.onRequestOptions();
114 | } else if ("POST".equalsIgnoreCase(httpRequest.getMethod())) {
115 | DebugDataTool.onRequest(stringBuilder.toString(), httpRequest);
116 | onRequestPost(httpRequest, responseHandler);
117 | } else if ("GET".equalsIgnoreCase(httpRequest.getMethod())) {
118 | onRequestGet(httpRequest, responseHandler);
119 | }
120 | socket.close();
121 | } finally {
122 | try {
123 | if (null != printStream) {
124 | printStream.close();
125 | }
126 | if (null != inputStream) {
127 | inputStream.close();
128 | }
129 | if (socket != null) {
130 | socket.close();
131 | }
132 | } catch (Exception e) {
133 | DebugDataTool.onError("web server:close request error,http请求解析结束处理异常", e);
134 | }
135 | }
136 |
137 | }
138 |
139 | private void onRequestGet(HttpRequest httpRequest, ResponseHandler responseHandler) throws IOException {
140 | byte[] bytes = null;
141 | if (TextUtils.isEmpty(httpRequest.getPath())) {//index.html
142 | httpRequest.setPath("index.html");
143 | }
144 | File file = null;
145 | //文件请求
146 | if (httpRequest.getPath().equals("downloadFile")) {
147 | file = new File(httpRequest.getParameter().get("downloadFile"));
148 | if (file.exists()) {
149 | bytes = Utils.getFile(new File(httpRequest.getParameter().get("downloadFile")));
150 | }
151 | } else {
152 | bytes = Utils.loadContent(httpRequest.getPath(), assetManager);
153 | file = new File(httpRequest.getPath());
154 | }
155 | DebugDataTool.onRequest(httpRequest.getPath(), httpRequest);
156 | if (null == bytes) {
157 | responseHandler.onServerNotFound("请求的资源不存在");
158 | } else {
159 | responseHandler.onServerGetFile(!httpRequest.getPath().equals("index.html"), httpRequest.getPath(), Utils.detectMimeType(httpRequest.getPath()), bytes);
160 | }
161 | }
162 |
163 | private void onRequestPost(HttpRequest httpRequest, ResponseHandler responseHandler) throws Exception {
164 | Response response = null;
165 | //post请求数据
166 | Request request = null;
167 | try {
168 | request = DebugDataTool.JsonToObject(httpRequest.getBody(), Request.class);
169 | } catch (Exception e) {
170 | String msg = "web server:Request error,http请求解析异常 ";
171 | DebugDataTool.onError(msg, e);
172 | response = new Response().setCode(Response.code_Error).setMsg(msg + e.getMessage());
173 | }
174 | if (response == null) {
175 | if (request == null || TextUtils.isEmpty(request.getAction())) {
176 | String msg = "web server:Request data is null or action is null,http请求没有action,无法解析操作";
177 | DebugDataTool.onError(msg, new Throwable("action is null"));
178 | response = new Response().setCode(Response.code_Error).setMsg(msg);
179 | }
180 | }
181 | if (response == null) {
182 | try {
183 | Action action = dispatcher.get(request.getAction());
184 | if (action != null) {
185 | action.doAction(context, request, httpRequest, responseHandler);
186 | }
187 | } catch (Exception e) {
188 | String msg = "web server:action error(" + request.getAction() + "),参数处理异常";
189 | DebugDataTool.onError(msg, e);
190 | responseHandler.onServerPostError(msg + e.getLocalizedMessage());
191 | }
192 | }
193 | }
194 |
195 |
196 | }
197 |
--------------------------------------------------------------------------------
/Android_debugdata_webtool/webtoollibrary/src/main/java/android_debugdata_webtool/tool/itgowo/com/webtoollibrary/utils/PrefHelper.java:
--------------------------------------------------------------------------------
1 | /*
2 | *
3 | * * Copyright (C) 2016 Amit Shekhar
4 | * * Copyright (C) 2011 Android Open Source Project
5 | * *
6 | * * Licensed under the Apache License, Version 2.0 (the "License");
7 | * * you may not use this file except in compliance with the License.
8 | * * You may obtain a copy of the License at
9 | * *
10 | * * http://www.apache.org/licenses/LICENSE-2.0
11 | * *
12 | * * Unless required by applicable law or agreed to in writing, software
13 | * * distributed under the License is distributed on an "AS IS" BASIS,
14 | * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | * * See the License for the specific language governing permissions and
16 | * * limitations under the License.
17 | *
18 | */
19 |
20 | package android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils;
21 |
22 | import android.content.Context;
23 | import android.content.SharedPreferences;
24 |
25 | import org.json.JSONArray;
26 |
27 | import java.io.File;
28 | import java.util.ArrayList;
29 | import java.util.Collections;
30 | import java.util.HashSet;
31 | import java.util.List;
32 | import java.util.Map;
33 | import java.util.Set;
34 | import java.util.TreeMap;
35 |
36 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Request.RowDataRequest;
37 | import android_debugdata_webtool.tool.itgowo.com.webtoollibrary.Response;
38 |
39 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.BOOLEAN;
40 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.FLOAT;
41 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.INTEGER;
42 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.LONG;
43 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.STRING_SET;
44 | import static android_debugdata_webtool.tool.itgowo.com.webtoollibrary.utils.DatabaseHelper.TEXT;
45 |
46 | /**
47 | * Created by lujianchao on 2017/8/22.
48 | */
49 |
50 | public class PrefHelper {
51 |
52 | private static final String PREFS_SUFFIX = ".xml";
53 |
54 | private PrefHelper() {
55 | // This class in not publicly instantiable
56 | }
57 |
58 | public static TreeMap getSharedPreference(Context mContext) {
59 | TreeMap tags = new TreeMap<>();
60 |
61 | String rootPath = mContext.getApplicationInfo().dataDir + "/shared_prefs";
62 | File root = new File(rootPath);
63 | if (root.exists()) {
64 | for (File file : root.listFiles()) {
65 | String fileName = file.getName();
66 | if (file.getName().endsWith(PREFS_SUFFIX)) {
67 | fileName = file.getName().substring(0, file.getName().length() - PREFS_SUFFIX.length());
68 | }
69 | tags.put(fileName, file);
70 | }
71 | }
72 | return tags;
73 | }
74 |
75 | public static List getSharedPreferenceTags(Context context) {
76 | ArrayList tags = new ArrayList<>();
77 | String rootPath = context.getApplicationInfo().dataDir + "/shared_prefs";
78 | File root = new File(rootPath);
79 | if (root.exists()) {
80 | for (File file : root.listFiles()) {
81 | String fileName = file.getName();
82 | if (fileName.endsWith(PREFS_SUFFIX)) {
83 | tags.add(new Response.FileList.FileData().setFileName(fileName.substring(0, fileName.length() - PREFS_SUFFIX.length())).setPath(file.getPath()));
84 | }
85 | }
86 | }
87 | Collections.sort(tags);
88 | return tags;
89 | }
90 |
91 | /**
92 | * 获取共享参数list
93 | *
94 | * @param context
95 | * @return
96 | */
97 | public static Response getAllPrefData(Context context, String filename) {
98 |
99 | Response response = new Response();
100 | response.setEditable(true);
101 |
102 | /**
103 | * 设置表结构
104 | */
105 | Response.TableData.TableInfo keyInfo = new Response.TableData.TableInfo();
106 | keyInfo.setPrimary(true).setTitle("Key");
107 | Response.TableData.TableInfo valueInfo = new Response.TableData.TableInfo();
108 | valueInfo.setPrimary(false).setTitle("Value");
109 | Response.TableData.TableInfo typeInfo = new Response.TableData.TableInfo();
110 | typeInfo.setPrimary(false).setTitle("DataType");
111 |
112 | Response.TableData mTableData = new Response.TableData();
113 | mTableData.setTableColumns(new ArrayList());
114 | mTableData.getTableColumns().add(keyInfo);
115 | mTableData.getTableColumns().add(valueInfo);
116 | mTableData.getTableColumns().add(typeInfo);
117 | response.setTableData(mTableData);
118 | SharedPreferences preferences = context.getSharedPreferences(filename, Context.MODE_PRIVATE);
119 | Map allEntries = preferences.getAll();
120 |
121 | mTableData.setTableDatas(new ArrayList>());
122 | for (Map.Entry entry : allEntries.entrySet()) {
123 | List