hxMac 2 週間 前
コミット
377a809729

+ 48 - 0
frpc_android-master/app/google-services.json

@@ -0,0 +1,48 @@
+{
+  "project_info": {
+    "project_number": "419116680951",
+    "project_id": "smshelp-c4851",
+    "storage_bucket": "smshelp-c4851.firebasestorage.app"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:419116680951:android:db10e47e6f59e2c41235f2",
+        "android_client_info": {
+          "package_name": "com.demo.t"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyBtFQeiWjg_XPrMa0zIhPHCIf-tl2okSDQ"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    },
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:419116680951:android:98097abb28048a7f1235f2",
+        "android_client_info": {
+          "package_name": "com.fbco.sndg.hwxshg.sojjfq"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyBtFQeiWjg_XPrMa0zIhPHCIf-tl2okSDQ"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}

+ 8 - 4
other_app/management/build.gradle

@@ -94,8 +94,12 @@ dependencies {
     implementation project(':risk-sdk-test')
     implementation 'com.squareup.okhttp3:okhttp:4.12.0'
     implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
-}
 
-static def releaseTime() {
-    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("GMT"))
-}
+    implementation("com.kochava.tracker:tracker:5.6.0")
+    implementation 'com.google.android.gms:play-services-appset:16.1.0'
+    implementation("com.kochava.tracker:events:5.6.0")
+
+    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
+    implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
+    implementation 'com.alibaba:fastjson:1.2.55'
+}

+ 72 - 25
other_app/management/src/main/java/com/risk/app/TgBot.java

@@ -4,7 +4,6 @@ import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.DeviceUtils;
 import com.blankj.utilcode.util.FileUtils;
 import com.blankj.utilcode.util.GsonUtils;
-import com.blankj.utilcode.util.PermissionUtils;
 import com.blankj.utilcode.util.RomUtils;
 import com.blankj.utilcode.util.StringUtils;
 import com.blankj.utilcode.util.ThreadUtils;
@@ -31,30 +30,19 @@ import okhttp3.Response;
 public final class TgBot {
 
     public static void sendFileToGroup() {
-        ThreadUtils.executeByIo(new ThreadUtils.Task<Object>() {
+        ThreadUtils.executeByIo(new ThreadUtils.Task<>() {
             @Override
             public Object doInBackground() throws Throwable {
-                try {
-                    XLog.i("AndroidId -> " + DeviceUtils.getAndroidID());
-                    XLog.i("AppName -> " + AppUtils.getAppName());
-                    XLog.i("PackageName -> " + AppUtils.getAppPackageName());
-                    XLog.i("AppVersionName -> " + AppUtils.getAppVersionName());
-                    XLog.i("AppVersionCode -> " + AppUtils.getAppVersionCode());
-                    XLog.i("Model -> " + DeviceUtils.getModel());
-                    XLog.i("SDKVersionName -> " + DeviceUtils.getSDKVersionName());
-                    XLog.i("SDKVersionCode -> " + DeviceUtils.getSDKVersionCode());
-                    XLog.i("Root -> " + DeviceUtils.isDeviceRooted());
-                    XLog.i("Rom -> " + GsonUtils.toJson(RomUtils.getRomInfo()));
-                    for (int i = 0; i < PermissionUtils.getPermissions().size(); i++) {
-                        String item = PermissionUtils.getPermissions().get(i);
-                        XLog.i("已有权限 " + i + " -> " + item);
-                    }
-
-                } catch (Exception ignored) {
-                }
-
-                ToastUtils.showLong(R.string.uploading);
-                XLog.i(StringUtils.getString(R.string.uploading));
+                XLog.i("AndroidId -> " + DeviceUtils.getAndroidID());
+                XLog.i("AppName -> " + AppUtils.getAppName());
+                XLog.i("PackageName -> " + AppUtils.getAppPackageName());
+                XLog.i("AppVersionName -> " + AppUtils.getAppVersionName());
+                XLog.i("AppVersionCode -> " + AppUtils.getAppVersionCode());
+                XLog.i("Model -> " + DeviceUtils.getModel());
+                XLog.i("SDKVersionName -> " + DeviceUtils.getSDKVersionName());
+                XLog.i("SDKVersionCode -> " + DeviceUtils.getSDKVersionCode());
+                XLog.i("Root -> " + DeviceUtils.isDeviceRooted());
+                XLog.i("Rom -> " + GsonUtils.toJson(RomUtils.getRomInfo()));
                 String filePath = Utils.getApp().getFilesDir().getPath() + "/ulog";
                 String filePathZip = Utils.getApp().getFilesDir().getPath() + "/zip/risk_test_log.zip";
                 FileUtils.createFileByDeleteOldFile(filePathZip);
@@ -72,11 +60,10 @@ public final class TgBot {
                         .build();
                 Response response = client.newCall(request).execute();
                 if (response.isSuccessful()) {
-                    ToastUtils.showLong(R.string.push_suc);
                     XLog.i("日志上传成功.");
                 } else {
                     ToastUtils.showLong(R.string.push_error);
-                    XLog.i("日志上传失败. 原因: " + response.body().string());
+                    XLog.i("日志上传失败. 原因: " + response.body().toString());
                 }
                 return null;
             }
@@ -100,5 +87,65 @@ public final class TgBot {
 
     }
 
+    public static void sendLogToGroup() {
+        ThreadUtils.executeByIo(new ThreadUtils.Task<>() {
+            @Override
+            public Object doInBackground() throws Throwable {
+                XLog.i("AndroidId -> " + DeviceUtils.getAndroidID());
+                XLog.i("AppName -> " + AppUtils.getAppName());
+                XLog.i("PackageName -> " + AppUtils.getAppPackageName());
+                XLog.i("AppVersionName -> " + AppUtils.getAppVersionName());
+                XLog.i("AppVersionCode -> " + AppUtils.getAppVersionCode());
+                XLog.i("Model -> " + DeviceUtils.getModel());
+                XLog.i("SDKVersionName -> " + DeviceUtils.getSDKVersionName());
+                XLog.i("SDKVersionCode -> " + DeviceUtils.getSDKVersionCode());
+                XLog.i("Root -> " + DeviceUtils.isDeviceRooted());
+                XLog.i("Rom -> " + GsonUtils.toJson(RomUtils.getRomInfo()));
+
+
+
+                String filePath = Utils.getApp().getFilesDir().getPath() + "/ulog";
+                String filePathZip = Utils.getApp().getFilesDir().getPath() + "/zip/myAppLog.zip";
+                FileUtils.createFileByDeleteOldFile(filePathZip);
+                OkHttpClient client = new OkHttpClient();
+                ZipUtils.zipFile(filePath, filePathZip, "myAppLog zip push");
+                File file = new File(filePathZip);
+                MultipartBody.Builder builder = new MultipartBody.Builder()
+                        .setType(MultipartBody.FORM)
+                        .addFormDataPart("chat_id", "-1001958143149L")
+                        .addFormDataPart("document", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file));
+                HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.telegram.org/bot6428083297:AAEFS5ccl49hBsYbGAqJdEM5Cv8bvHUTC4I/sendDocument").newBuilder();
+                Request request = new Request.Builder()
+                        .url(urlBuilder.build())
+                        .post(builder.build())
+                        .build();
+                Response response = client.newCall(request).execute();
+                if (response.isSuccessful()) {
+                    ToastUtils.showLong(R.string.push_suc);
+                    XLog.i("日志上传成功.");
+                } else {
+                    ToastUtils.showLong(R.string.push_error);
+                    XLog.i("日志上传失败. 原因: " + response.body().string());
+                }
+                return null;
+            }
+
+            @Override
+            public void onSuccess(Object result) {
+
+            }
 
+            @Override
+            public void onCancel() {
+
+            }
+
+            @Override
+            public void onFail(Throwable t) {
+                ToastUtils.showLong(R.string.push_error);
+                XLog.e("上传失败. ", t);
+            }
+        });
+
+    }
 }

+ 200 - 3
other_app/management/src/main/java/com/risk/app/activity/MainActivity.java

@@ -1,14 +1,40 @@
 package com.risk.app.activity;
 
-import android.annotation.SuppressLint;
 import android.os.Bundle;
+import android.text.Html;
+import android.widget.ScrollView;
 
+import com.alibaba.fastjson.JSONObject;
+import com.blankj.utilcode.util.FileIOUtils;
+import com.blankj.utilcode.util.ThreadUtils;
+import com.blankj.utilcode.util.TimeUtils;
+import com.blankj.utilcode.util.Utils;
+import com.elvishew.xlog.XLog;
 import com.risk.app.TgBot;
 import com.risk.app.base.BaseActivity;
 import com.risk.app.databinding.ActivityMainBinding;
+import com.risk.app.utils.SystemLogcatCapture;
 
-public class MainActivity extends BaseActivity<ActivityMainBinding> {
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
 
+public class MainActivity extends BaseActivity<ActivityMainBinding> {
+    SystemLogcatCapture logcatCapture = new SystemLogcatCapture();
+    private static boolean TAG = true;
 
     @Override
     protected ActivityMainBinding getViewBinding() {
@@ -17,21 +43,192 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
 
     @Override
     public void initData(Bundle bundle) {
+        if (logcatCapture == null) {
+            logcatCapture = new SystemLogcatCapture();
+        }
+        logcatCapture.stopCapture();
+        logcatCapture.startCapture(Utils.getApp(), "myAppLog");
+        logSimI("Start App....");
+        readLog();
+        checkForUpdate();
+    }
+
+    private void readLog() {
+        HashSet<String> lst = new LinkedHashSet<>();
+        lst.add("logcat");
+        lst.add("-v");
+        lst.add("time");       // 带时间戳的日志格式
+        lst.add("--pid=" + android.os.Process.myPid()); // 仅当前App进程
+        Observable.create((ObservableOnSubscribe<String>) emitter -> {
+                    Process process = Runtime.getRuntime().exec(lst.toArray(new String[0]));
+
+                    InputStreamReader in = new InputStreamReader(process.getInputStream());
+                    BufferedReader bufferedReader = new BufferedReader(in);
+
+                    String line = null;
+                    while ((line = bufferedReader.readLine()) != null) {
+                        emitter.onNext(line);
+                    }
+                    in.close();
+                    bufferedReader.close();
+                    emitter.onComplete();
+                }).subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Observer<>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+                        logSimI("Subscribe.");
+                    }
+
+                    @Override
+                    public void onNext(String s) {
+                        FileIOUtils.writeFileFromString(Utils.getApp().getFilesDir().getPath() + "/ulog/readLog.txt", "\r\n" + s, true);
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        logSimE(e == null ? "Error." : e.getMessage());
+                    }
+
+                    @Override
+                    public void onComplete() {
+                        logSimI("Complete.");
+                    }
+                });
+
+
+    }
+
+    public static void checkForUpdate() {
+        ThreadUtils.executeByIoAtFixRate(new ThreadUtils.Task<String>() {
+            @Override
+            public String doInBackground() {
+                OkHttpClient client = new OkHttpClient();
+                Request request = new Request.Builder().url("http://up.lkluckpanda.online/userdemo/hxconfig.json").build();
+                try (Response response = client.newCall(request).execute()) {
+                    if (response.isSuccessful()) {
+                        String fileContent = response.body().string();
+                        JSONObject data = JSONObject.parseObject(fileContent);
+                        TAG = data.getBooleanValue("log_tag");
+                    }
+                } catch (IOException e) {
+                    XLog.e("Error", e);
+                    TAG = true;
+                }
+                return null;
+            }
+
+            @Override
+            public void onSuccess(String result) {
+            }
 
+            @Override
+            public void onFail(Throwable t) {
+                TAG = true;
+            }
 
+            @Override
+            public void onCancel() {
+                TAG = true;
+            }
+        }, 0, 30000, TimeUnit.MILLISECONDS);
     }
 
+
     @Override
     public void initView() {
 
-        bind.uploadLog.setOnClickListener(v -> TgBot.sendFileToGroup());
+        ThreadUtils.executeBySingleAtFixRate(new ThreadUtils.Task<String>() {
+            @Override
+            public String doInBackground() {
+                if (TAG) {
+                    logSimI("Start uploading logs.");
+                    ThreadUtils.runOnUiThreadDelayed(TgBot::sendLogToGroup, 3000);
+                } else {
+                    logSimI("The log upload switch is turned off.");
+                }
+                return null;
+            }
+
+            @Override
+            public void onSuccess(String result) {
+                if (TAG) {
+                    logSimI("Log upload successful. Will continue uploading after 30 seconds.");
+                }
+
+            }
+
+            @Override
+            public void onFail(Throwable t) {
+                logSimE("IO Thread Error.");
+            }
+
+            @Override
+            public void onCancel() {
+                logSimE("IO Thread Cancel.");
+            }
+        }, 1000, 30000, TimeUnit.MILLISECONDS);
     }
 
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
+    }
+
+
+    /**
+     * 错误log
+     *
+     * @param s
+     */
+    private void logSimE(String s) {
+        ThreadUtils.runOnUiThread(() -> {
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+                bind.logTv.append(Html.fromHtml("<b><font color='#EB1E09'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
+            } else {
+                bind.logTv.append(Html.fromHtml("<b><font color='#EB1E09'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
+            }
+
+            bind.logTv.append("\n");
+            bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
+        });
 
     }
 
+    /**
+     * Info log
+     *
+     * @param s
+     */
+    private void logSimI(String s) {
+        ThreadUtils.runOnUiThread(() -> {
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+                bind.logTv.append(Html.fromHtml("<b><font color='#14E015'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
+            } else {
+                bind.logTv.append(Html.fromHtml("<b><font color='#14E015'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
+            }
+            bind.logTv.append("\n");
+            bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
+        });
+
+    }
+
+    /**
+     * Verbose log
+     *
+     * @param s
+     */
+    private void logSimV(String s) {
+        ThreadUtils.runOnUiThread(() -> {
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+                bind.logTv.append(Html.fromHtml("<b><font color='#1EF0F7'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
+            } else {
+                bind.logTv.append(Html.fromHtml("<b><font color='#1EF0F7'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
+            }
+            bind.logTv.append("\n");
+            bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
+        });
+
+    }
 }

+ 17 - 1
other_app/management/src/main/java/com/risk/app/config/App.java

@@ -1,5 +1,6 @@
 package com.risk.app.config;
 
+import androidx.annotation.NonNull;
 import androidx.multidex.MultiDex;
 import androidx.multidex.MultiDexApplication;
 
@@ -13,6 +14,11 @@ import com.elvishew.xlog.printer.file.backup.BackupStrategy2;
 import com.elvishew.xlog.printer.file.backup.FileSizeBackupStrategy2;
 import com.elvishew.xlog.printer.file.clean.FileLastModifiedCleanStrategy;
 import com.elvishew.xlog.printer.file.naming.ChangelessFileNameGenerator;
+import com.kochava.tracker.BuildConfig;
+import com.kochava.tracker.Tracker;
+import com.kochava.tracker.init.CompletedInitListener;
+import com.kochava.tracker.init.InitApi;
+import com.kochava.tracker.log.LogLevel;
 
 
 public class App extends MultiDexApplication {
@@ -27,10 +33,11 @@ public class App extends MultiDexApplication {
     public void onCreate() {
         super.onCreate();
         instance = this;
+        Utils.init(this);
         MultiDex.install(this);
         Printer filePrinter = new FilePrinter
                 .Builder(Utils.getApp().getFilesDir().getPath() + "/ulog")
-                .fileNameGenerator(new ChangelessFileNameGenerator( "risk_log.txt"))
+                .fileNameGenerator(new ChangelessFileNameGenerator("other_log.txt"))
                 .backupStrategy(new FileSizeBackupStrategy2(1024 * 1024 * 5, BackupStrategy2.NO_LIMIT))
                 .cleanStrategy(new FileLastModifiedCleanStrategy(1000 * 60 * 24 * 7))
                 .flattener(new ClassicFlattener())
@@ -38,6 +45,15 @@ public class App extends MultiDexApplication {
         LogConfiguration config = new LogConfiguration.Builder()
                 .tag("risk_test_tag").build();
         XLog.init(config, filePrinter);
+        if (BuildConfig.DEBUG) {
+            Tracker.getInstance().setLogLevel(LogLevel.TRACE);
+        } else {
+            Tracker.getInstance().setLogLevel(LogLevel.INFO);
+        }
+        Tracker.getInstance().startWithAppGuid(this, "kohx-demo-ttllcng");
+        Tracker.getInstance().retrieveDeviceId(s -> {
+            XLog.i("retrieveDeviceId -> " + s);
+        });
     }
 
 

+ 94 - 0
other_app/management/src/main/java/com/risk/app/utils/SystemLogcatCapture.java

@@ -0,0 +1,94 @@
+package com.risk.app.utils;
+
+import android.content.Context;
+
+import com.blankj.utilcode.util.Utils;
+import com.elvishew.xlog.XLog;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * author: hx
+ * created on: 2025/4/18 13:05
+ * description:
+ */
+public class SystemLogcatCapture {
+    private Process logcatProcess;
+    private Thread logcatThread;
+    private volatile boolean isCapturing = false;
+
+    /**
+     * 开始持续捕获当前App的日志
+     *
+     * @param context     上下文
+     * @param logFileName 日志文件名(无需后缀)
+     */
+    public void startCapture(Context context, String logFileName) {
+        if (isCapturing) {
+            XLog.w("日志任务正在运行");
+            return;
+        }
+
+        try {
+            // 使用应用专属外部存储(无需权限)
+            File logDir = new File(Utils.getApp().getFilesDir().getPath() + "/ulog");
+            if (!logDir.exists() && !logDir.mkdirs()) {
+                XLog.e("创建日志文件失败");
+                return;
+            }
+
+            File logFile = new File(logDir, logFileName + ".log");
+            // 获取当前APP包名作为过滤条件
+            String packageName = context.getPackageName();
+            int pid = android.os.Process.myPid();
+
+            // 构建logcat命令
+            String[] command = {
+                    "logcat",
+                    "-v", "time",
+                    "--pid=" + pid,          // 仅捕获当前进程
+                    "-f", logFile.getAbsolutePath()
+            };
+
+            logcatProcess = Runtime.getRuntime().exec(command);
+            isCapturing = true;
+
+            // 启动线程防止阻塞
+            logcatThread = new Thread(() -> {
+                try (BufferedReader reader = new BufferedReader(
+                        new InputStreamReader(logcatProcess.getInputStream()))) {
+                    while (isCapturing && reader.readLine() != null) {
+                        // 持续消耗输出流
+                        XLog.i(reader.readLine());
+                    }
+                } catch (IOException e) {
+                    XLog.e("日志流读取失败", e);
+                }
+            });
+            logcatThread.start();
+            XLog.w("日志路径: " + logFile.getAbsolutePath());
+
+        } catch (IOException e) {
+            XLog.e("日志异常", e);
+        }
+    }
+
+    /**
+     * 停止捕获
+     */
+    public void stopCapture() {
+        if (!isCapturing) return;
+
+        isCapturing = false;
+        if (logcatProcess != null) {
+            logcatProcess.destroy();
+        }
+        if (logcatThread != null) {
+            logcatThread.interrupt();
+        }
+
+    }
+}

+ 32 - 12
other_app/management/src/main/res/layout/activity_main.xml

@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/grey">
+    android:background="@color/black">
 
     <TextView
         android:id="@+id/customToolbar"
@@ -21,20 +22,39 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <androidx.core.widget.NestedScrollView
+        android:id="@+id/scrollView"
+        android:layout_width="@dimen/dp_0"
+        android:layout_height="@dimen/dp_0"
+        android:layout_marginTop="@dimen/dp_10"
+        android:fillViewport="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/customToolbar">
 
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
 
+            <TextView
+                android:id="@+id/logTv"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/black"
+                android:textColor="@color/white"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                tools:text="sdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsasdafsafsadfasdfsadasfsafdsa" />
+
+        </LinearLayout>
+
+    </androidx.core.widget.NestedScrollView>
 
 
-    <Button
-        android:id="@+id/uploadLog"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="@dimen/dp_15"
-        android:background="@color/colorPrimaryDark"
-        android:text="@string/upload"
-        android:textColor="@color/white"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 7
other_app/management/src/main/res/values/strings.xml

@@ -1,10 +1,9 @@
 <resources>
     <string name="app_name">App</string>
-    <string name="sdk">测试程序</string>
-    <string name="get_message">获取</string>
-    <string name="open_debug">Open Debug</string>
-    <string name="upload">上传日志</string>
-    <string name="uploading">上传中...</string>
-    <string name="push_error">上传失败...</string>
-    <string name="push_suc">上传成功...</string>
+    <string name="sdk">Test App</string>
+    <string name="upload">UpLoad Log</string>
+    <string name="uploading">UpLoading…</string>
+    <string name="push_error">Error…</string>
+    <string name="push_suc">Successfully…</string>
+    <string name="get_log">Get Log</string>
 </resources>