源码调试整理

This commit is contained in:
2025-11-27 10:32:01 +08:00
parent 44d04eaa77
commit 2878e69c22
18 changed files with 394 additions and 255 deletions

View File

@@ -18,34 +18,35 @@ def genVersionName(def versionName){
} }
android { android {
compileSdkVersion 32
buildToolsVersion "32.0.0" // 1. compileSdkVersion必须 ≥ targetSdkVersion建议直接等于 targetSdkVersion30
compileSdkVersion 30
// 2. buildToolsVersion需匹配 compileSdkVersion建议使用 30.x.x 最新稳定版(无需高于 compileSdkVersion
buildToolsVersion "30.0.3" // 这是 30 对应的最新稳定版,避免使用 beta 版
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.winboll" applicationId "cc.winboll.studio.winboll"
minSdkVersion 24 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0 // .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.0" versionName "15.11"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
} }
buildTypes { // 米盟 SDK
release { packagingOptions {
minifyEnabled false doNotStrip "*/*/libmimo_1011.so"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} }
} }
dependencies { dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api 'com.google.code.gson:gson:2.10.1' api 'com.google.code.gson:gson:2.10.1'
// 下拉控件 // 下拉控件
@@ -60,19 +61,28 @@ dependencies {
api 'com.journeyapps:zxing-android-embedded:3.6.0' api 'com.journeyapps:zxing-android-embedded:3.6.0'
// 应用介绍页类库 // 应用介绍页类库
api 'io.github.medyo:android-about-page:2.0.0' api 'io.github.medyo:android-about-page:2.0.0'
// 吐司类库 // 网络连接类库
api 'com.github.getActivity:ToastUtils:10.5'
// 网络连接类库
api 'com.squareup.okhttp3:okhttp:4.4.1' api 'com.squareup.okhttp3:okhttp:4.4.1'
// AndroidX 类库
// AndroidX 类库
api 'androidx.appcompat:appcompat:1.1.0' api 'androidx.appcompat:appcompat:1.1.0'
api 'com.google.android.material:material:1.4.0' //api 'com.google.android.material:material:1.4.0'
//api 'androidx.viewpager:viewpager:1.0.0' //api 'androidx.viewpager:viewpager:1.0.0'
//api 'androidx.vectordrawable:vectordrawable:1.1.0' //api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0' //api 'androidx.fragment:fragment:1.1.0'
api 'cc.winboll.studio:libaes:15.10.2' // 米盟
api 'cc.winboll.studio:libapputils:15.10.2' api 'com.miui.zeus:mimo-ad-sdk:5.3.+'//请使用最新版sdk
api 'cc.winboll.studio:libappbase:15.10.9' //注意以下5个库必须要引入
//implementation 'androidx.appcompat:appcompat:1.4.1'
api 'androidx.recyclerview:recyclerview:1.0.0'
api 'com.google.code.gson:gson:2.8.5'
api 'com.github.bumptech.glide:glide:4.9.0'
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
api 'cc.winboll.studio:libaes:15.11.6'
api 'cc.winboll.studio:libappbase:15.11.0'
api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Thu Nov 27 10:06:32 HKT 2025 #Thu Nov 27 02:30:56 GMT 2025
stageCount=3 stageCount=0
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.11
publishVersion=15.0.2 publishVersion=15.11.0
buildCount=15 buildCount=1
baseBetaVersion=15.0.3 baseBetaVersion=15.11.1

View File

@@ -1,21 +1,137 @@
# Add project specific ProGuard rules here. # Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the # By default, the flags in this file are appended to flags specified
# proguardFiles setting in build.gradle. # in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt
# # You can edit the include path and order by changing the proguardFiles
# For more details, see # directive in build.gradle.
# http://developer.android.com/guide/developing/tools/proguard.html #
# For more details, see
# If your project uses WebView with JS, uncomment the following # http://developer.android.com/guide/developing/tools/proguard.html
# and specify the fully qualified class name to the JavaScript interface
# class: # Add any project specific keep options here:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *; # ============================== 基础通用规则 ==============================
#} # 保留系统组件
-keep public class * extends android.app.Activity
# Uncomment this to preserve the line number information for -keep public class * extends android.app.Service
# debugging stack traces. -keep public class * extends android.content.BroadcastReceiver
#-keepattributes SourceFile,LineNumberTable -keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
# If you keep the line number information, uncomment this to -keep public class * extends android.preference.Preference
# hide the original source file name.
#-renamesourcefileattribute SourceFile # 保留 WinBoLL 核心包及子类(合并简化规则)
-keep class cc.winboll.studio.** { *; }
-keepclassmembers class cc.winboll.studio.** { *; }
# 保留所有类中的 public static final String TAG 字段(便于日志定位)
-keepclassmembers class * {
public static final java.lang.String TAG;
}
# 保留序列化类避免Parcelable/Gson解析异常
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留 R 文件避免资源ID混淆
-keepclassmembers class **.R$* {
public static <fields>;
}
# 保留 native 方法避免JNI调用失败
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留注解和泛型(避免反射/序列化异常)
-keepattributes *Annotation*
-keepattributes Signature
# 屏蔽 Java 8+ 警告(适配 Java 7 语法)
-dontwarn java.lang.invoke.*
-dontwarn android.support.v8.renderscript.*
-dontwarn java.util.function.**
# ============================== 第三方框架专项规则 ==============================
# OkHttp 4.4.1米盟广告请求依赖完善Lambda兼容
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-keep class okhttp3.internal.** { *; }
-keep class okio.** { *; }
-dontwarn okhttp3.internal.platform.**
-dontwarn okio.**
# Glide 4.9.0(米盟广告图片加载依赖)
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType {
**[] $VALUES;
public *;
}
-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule {
<init>();
}
-dontwarn com.bumptech.glide.**
# Gson 2.8.5(米盟广告数据序列化依赖)
-keep class com.google.gson.** { *; }
-keep interface com.google.gson.** { *; }
-keepclassmembers class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# 米盟 SDK(核心广告组件,完整保留避免加载失败)
-keep class com.miui.zeus.** { *; }
-keep interface com.miui.zeus.** { *; }
# 保留米盟日志字段(便于广告加载失败排查)
-keepclassmembers class com.miui.zeus.mimo.sdk.** {
public static final java.lang.String TAG;
}
# RecyclerView 1.0.0(米盟广告布局渲染依赖)
-keep class androidx.recyclerview.** { *; }
-keep interface androidx.recyclerview.** { *; }
-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter {
public *;
}
# 其他第三方框架(按引入依赖保留,无则可删除)
# XXPermissions 18.63
-keep class com.hjq.permissions.** { *; }
-keep interface com.hjq.permissions.** { *; }
# ZXing 二维码(核心解析组件)
-keep class com.google.zxing.** { *; }
-keep class com.journeyapps.zxing.** { *; }
# Jsoup HTML解析
-keep class org.jsoup.** { *; }
# Pinyin4j 拼音搜索
-keep class net.sourceforge.pinyin4j.** { *; }
# JSch SSH组件
-keep class com.jcraft.jsch.** { *; }
# AndroidX 基础组件
-keep class androidx.appcompat.** { *; }
-keep interface androidx.appcompat.** { *; }
# ============================== 优化与调试配置 ==============================
# 优化级别(平衡混淆效果与性能)
-optimizationpasses 5
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 调试辅助(保留行号便于崩溃定位)
-verbose
-dontpreverify
-dontusemixedcaseclassnames
-keepattributes SourceFile,LineNumberTable

View File

@@ -22,10 +22,8 @@ import android.widget.HorizontalScrollView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import com.hjq.toast.ToastUtils; import cc.winboll.studio.libappbase.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.Closeable; import java.io.Closeable;
@@ -60,19 +58,27 @@ public class App extends GlobalApplication {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
WinBoLLActivityManager.init(this); //WinBoLLActivityManager.init(this);
// 初始化 Toast 框架 // 初始化 Toast 框架
ToastUtils.init(this); ToastUtils.init(this);
// 设置 Toast 布局样式 // 设置 Toast 布局样式
//ToastUtils.setView(R.layout.view_toast); //ToastUtils.setView(R.layout.view_toast);
ToastUtils.setStyle(new WhiteToastStyle()); //ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); //ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
//CrashHandler.getInstance().registerGlobal(this); //CrashHandler.getInstance().registerGlobal(this);
//CrashHandler.getInstance().registerPart(this); //CrashHandler.getInstance().registerPart(this);
} }
@Override
public void onTerminate() {
super.onTerminate();
ToastUtils.release();
}
public static void write(InputStream input, OutputStream output) throws IOException { public static void write(InputStream input, OutputStream output) throws IOException {
byte[] buf = new byte[1024 * 8]; byte[] buf = new byte[1024 * 8];
int len; int len;

View File

@@ -12,7 +12,8 @@ import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.libaes.models.WinBoLLClientServiceBean; import cc.winboll.studio.libaes.models.WinBoLLClientServiceBean;
import cc.winboll.studio.libapputils.utils.ServiceUtils; import cc.winboll.studio.winboll.WinBoLLClientService;
import cc.winboll.studio.winboll.utils.ServiceUtils;
public class AssistantService extends Service { public class AssistantService extends Service {

View File

@@ -1,31 +1,22 @@
package cc.winboll.studio.winboll; package cc.winboll.studio.winboll;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.Toast;
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity; import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog;
import cc.winboll.studio.libaes.dialogs.StoragePathDialog;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.models.DrawerMenuBean; import cc.winboll.studio.libaes.models.DrawerMenuBean;
import cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity;
import cc.winboll.studio.libaes.unittests.TestAButtonFragment; import cc.winboll.studio.libaes.unittests.TestAButtonFragment;
import cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity;
import cc.winboll.studio.libaes.unittests.TestAToolbarActivity;
import cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity;
import cc.winboll.studio.libaes.unittests.TestViewPageFragment; import cc.winboll.studio.libaes.unittests.TestViewPageFragment;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.winboll.R; import cc.winboll.studio.winboll.R;
import cc.winboll.studio.winboll.fragments.MainFragment;
import com.a4455jkjh.colorpicker.ColorPickerDialog;
import java.util.ArrayList;
import cc.winboll.studio.winboll.activities.AboutActivity; import cc.winboll.studio.winboll.activities.AboutActivity;
import cc.winboll.studio.winboll.fragments.MainFragment;
import java.util.ArrayList;
public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActivity { public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActivity {
@@ -33,7 +24,7 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActi
public static final String TAG = "MainActivity"; public static final String TAG = "MainActivity";
MainFragment mMainFragment; MainFragment mMainFragment;
@Override @Override
public Activity getActivity() { public Activity getActivity() {
return null; return null;
@@ -84,9 +75,9 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActi
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu); getMenuInflater().inflate(R.menu.toolbar_main, menu);
if(App.isDebuging()) { // if (App.isDebugging()) {
getMenuInflater().inflate(cc.winboll.studio.libapputils.R.menu.toolbar_studio_debug, menu); // getMenuInflater().inflate(cc.winboll.studio.libapputils.R.menu.toolbar_studio_debug, menu);
} // }
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@@ -117,6 +108,6 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActi
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }

View File

@@ -5,6 +5,14 @@ package cc.winboll.studio.winboll.activities;
* @Date 2025/09/29 13:30 * @Date 2025/09/29 13:30
* @Describe 应用介绍窗口 * @Describe 应用介绍窗口
*/ */
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.winboll.BuildConfig;
import cc.winboll.studio.winboll.R;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
@@ -16,8 +24,6 @@ import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.models.APPInfo; import cc.winboll.studio.libaes.models.APPInfo;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libaes.views.AboutView; import cc.winboll.studio.libaes.views.AboutView;
import cc.winboll.studio.winboll.R;
import cc.winboll.studio.libaes.BuildConfig;
public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity { public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
@@ -75,6 +81,8 @@ public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
WinBoLLActivityManager.getInstance().registeRemove(this); WinBoLLActivityManager.getInstance().registeRemove(this);
} }
public AboutView CreateAboutView() { public AboutView CreateAboutView() {
String szBranchName = "winboll"; String szBranchName = "winboll";
APPInfo appInfo = new APPInfo(); APPInfo appInfo = new APPInfo();
@@ -89,7 +97,7 @@ public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
appInfo.setAppAPKName("WinBoLL"); appInfo.setAppAPKName("WinBoLL");
appInfo.setAppAPKFolderName("WinBoLL"); appInfo.setAppAPKFolderName("WinBoLL");
//appInfo.setIsAddDebugTools(false); //appInfo.setIsAddDebugTools(false);
appInfo.setIsAddDebugTools(BuildConfig.DEBUG); //appInfo.setIsAddDebugTools(BuildConfig.DEBUG);
return new AboutView(mContext, appInfo); return new AboutView(mContext, appInfo);
} }
} }

View File

@@ -11,27 +11,15 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toolbar; import android.widget.Toolbar;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.winboll.R; import cc.winboll.studio.winboll.R;
public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity { public class New2Activity extends WinBoLLActivity {
public static final String TAG = "New2Activity"; public static final String TAG = "New2Activity";
Toolbar mToolbar; Toolbar mToolbar;
//LogView mLogView; //LogView mLogView;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -51,15 +39,15 @@ public class New2Activity extends WinBoLLActivity implements IWinBoLLActivity {
} }
public void onCloseThisActivity(View view) { public void onCloseThisActivity(View view) {
WinBoLLActivityManager.getInstance().finish(this); //WinBoLLActivityManager.getInstance().finish(this);
} }
public void onCloseAllActivity(View view) { public void onCloseAllActivity(View view) {
WinBoLLActivityManager.getInstance().finishAll(); //WinBoLLActivityManager.getInstance().finishAll();
} }
public void onNewActivity(View view) { public void onNewActivity(View view) {
WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, NewActivity.class); //WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, NewActivity.class);
} }

View File

@@ -14,6 +14,7 @@ import android.widget.Toolbar;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.winboll.R; import cc.winboll.studio.winboll.R;
import cc.winboll.studio.winboll.App;
public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity { public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity {
@@ -58,7 +59,7 @@ public class NewActivity extends WinBoLLActivity implements IWinBoLLActivity {
} }
public void onNew2Activity(View view) { public void onNew2Activity(View view) {
WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, New2Activity.class); // WinBoLLActivityManager.getInstance().startWinBoLLActivity(App.getInstance(), New2Activity.class);
} }

View File

@@ -9,28 +9,15 @@ import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity { public class WinBoLLActivity extends AppCompatActivity {
public static final String TAG = "WinBoLLActivity"; public static final String TAG = "WinBoLLActivity";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
LogUtils.d(TAG, String.format("onResume %s", getTag()));
} }
@Override @Override
@@ -49,12 +36,12 @@ public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivi
@Override @Override
protected void onPostCreate(Bundle savedInstanceState) { protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState); super.onPostCreate(savedInstanceState);
WinBoLLActivityManager.getInstance().add(this); //WinBoLLActivityManager.getInstance().add(this);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
WinBoLLActivityManager.getInstance().registeRemove(this); //WinBoLLActivityManager.getInstance().registeRemove(this);
} }
} }

View File

@@ -40,7 +40,7 @@ public class WinBoLLUnitTestActivity extends AppCompatActivity {
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1); CheckBox cbIsDebugMode = findViewById(R.id.activitymainCheckBox1);
cbIsDebugMode.setChecked(GlobalApplication.isDebuging()); cbIsDebugMode.setChecked(GlobalApplication.isDebugging());
} }
@Override @Override
@@ -70,8 +70,8 @@ public class WinBoLLUnitTestActivity extends AppCompatActivity {
public void onSwitchDebugMode(View view) { public void onSwitchDebugMode(View view) {
boolean isDebuging = ((CheckBox)view).isChecked(); boolean isDebuging = ((CheckBox)view).isChecked();
GlobalApplication.setIsDebuging(isDebuging); GlobalApplication.setIsDebugging(isDebuging);
GlobalApplication.saveDebugStatus(this); GlobalApplication.saveDebugStatus((App.getInstance()));
} }
public void onPreviewGlobalCrashActivity(View view) { public void onPreviewGlobalCrashActivity(View view) {
@@ -110,7 +110,7 @@ public class WinBoLLUnitTestActivity extends AppCompatActivity {
public void onTestDemoServiceSOS(View view) { public void onTestDemoServiceSOS(View view) {
Intent intent = new Intent(this, TestDemoService.class); Intent intent = new Intent(this, TestDemoService.class);
stopService(intent); stopService(intent);
if (App.isDebuging()) { if (App.isDebugging()) {
SOS.sosToAppBaseBeta(this, TestDemoService.class.getName()); SOS.sosToAppBaseBeta(this, TestDemoService.class.getName());
} else { } else {
SOS.sosToAppBase(this, TestDemoService.class.getName()); SOS.sosToAppBase(this, TestDemoService.class.getName());

View File

@@ -9,12 +9,10 @@ import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import cc.winboll.studio.winboll.R;
import cc.winboll.studio.libaes.views.AButton;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import android.widget.Switch; import android.widget.Switch;
import androidx.fragment.app.Fragment;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.winboll.R;
public class MainFragment extends Fragment { public class MainFragment extends Fragment {

View File

@@ -13,7 +13,6 @@ import android.content.IntentFilter;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils; import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.libapputils.utils.AppUtils;
import cc.winboll.studio.winboll.WinBoLL; import cc.winboll.studio.winboll.WinBoLL;
import cc.winboll.studio.winboll.models.WinBoLLModel; import cc.winboll.studio.winboll.models.WinBoLLModel;
import cc.winboll.studio.winboll.models.WinBoLLNewsBean; import cc.winboll.studio.winboll.models.WinBoLLNewsBean;
@@ -65,41 +64,41 @@ public class MainReceiver extends BroadcastReceiver {
} }
} else if (intent.getAction().equals(SOS.ACTION_SOS)) { } else if (intent.getAction().equals(SOS.ACTION_SOS)) {
LogUtils.d(TAG, "ACTION_SOS"); LogUtils.d(TAG, "ACTION_SOS");
String sos = intent.getStringExtra(SOS.EXTRA_OBJECT); // String sos = intent.getStringExtra(SOS.EXTRA_OBJECT);
LogUtils.d(TAG, String.format("SOS %s", sos)); // LogUtils.d(TAG, String.format("SOS %s", sos));
if (sos != null && !sos.equals("")) { // if (sos != null && !sos.equals("")) {
SOSObject bean = SOS.parseSOSObject(sos); // SOSObject bean = SOS.parseSOSObject(sos);
if (bean != null) { // if (bean != null) {
String szObjectPackageName = bean.getObjectPackageName(); // String szObjectPackageName = bean.getObjectPackageName();
LogUtils.d(TAG, String.format("szObjectPackageName %s", szObjectPackageName)); // LogUtils.d(TAG, String.format("szObjectPackageName %s", szObjectPackageName));
String szObjectServiveName = bean.getObjectServiveName(); // String szObjectServiveName = bean.getObjectServiveName();
LogUtils.d(TAG, String.format("szObjectServiveName %s", szObjectServiveName)); // LogUtils.d(TAG, String.format("szObjectServiveName %s", szObjectServiveName));
//
Intent intentService = new Intent(); // Intent intentService = new Intent();
intentService.setComponent(new ComponentName(szObjectPackageName, szObjectServiveName)); // intentService.setComponent(new ComponentName(szObjectPackageName, szObjectServiveName));
context.startService(intentService); // context.startService(intentService);
//
String appName = AppUtils.getAppNameByPackageName(context, szObjectPackageName); // String appName = AppUtils.getAppNameByPackageName(context, szObjectPackageName);
LogUtils.d(TAG, String.format("appName %s", appName)); // LogUtils.d(TAG, String.format("appName %s", appName));
WinBoLLNewsBean appWinBoLLNewsBean = new WinBoLLNewsBean(appName); // WinBoLLNewsBean appWinBoLLNewsBean = new WinBoLLNewsBean(appName);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currentTime = sdf.format(new Date()); // String currentTime = sdf.format(new Date());
StringBuilder sbLine = new StringBuilder(); // StringBuilder sbLine = new StringBuilder();
sbLine.append("["); // sbLine.append("[");
sbLine.append(currentTime); // sbLine.append(currentTime);
sbLine.append("] Power to "); // sbLine.append("] Power to ");
sbLine.append(appName); // sbLine.append(appName);
appWinBoLLNewsBean.setMessage(sbLine.toString()); // appWinBoLLNewsBean.setMessage(sbLine.toString());
//
APPNewsWidget.addWinBoLLNewsBean(context, appWinBoLLNewsBean); // APPNewsWidget.addWinBoLLNewsBean(context, appWinBoLLNewsBean);
//
Intent intentWidget = new Intent(context, APPNewsWidget.class); // Intent intentWidget = new Intent(context, APPNewsWidget.class);
intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT); // intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT);
context.sendBroadcast(intentWidget); // context.sendBroadcast(intentWidget);
} // }
//
//
} // }
} else { } else {
ToastUtils.show(szAction); ToastUtils.show(szAction);
} }

View File

@@ -17,13 +17,13 @@ public class MyBroadcastReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (context.getString(R.string.action_sos).equals(intent.getAction())) { // if (context.getString(R.string.action_sos).equals(intent.getAction())) {
String message = intent.getStringExtra("message"); // String message = intent.getStringExtra("message");
String sosPackage = intent.getStringExtra("sosPackage"); // String sosPackage = intent.getStringExtra("sosPackage");
//
// 处理接收到的广播消息 // // 处理接收到的广播消息
LogUtils.d(TAG, String.format("MyBroadcastReceiver action %s \n%s\n%s", intent.getAction(), sosPackage, message)); // LogUtils.d(TAG, String.format("MyBroadcastReceiver action %s \n%s\n%s", intent.getAction(), sosPackage, message));
} // }
} }
} }

View File

@@ -111,7 +111,7 @@ public class TestDemoBindService extends Service {
// 所以退出时检查本服务是否配置启用,如果启用就发送一个 SOS 信号。 // 所以退出时检查本服务是否配置启用,如果启用就发送一个 SOS 信号。
// 这样 APPBase 就会用组件方式启动本服务。 // 这样 APPBase 就会用组件方式启动本服务。
if (bean.isEnable()) { if (bean.isEnable()) {
if (App.isDebuging()) { if (App.isDebugging()) {
SOS.sosToAppBaseBeta(this, TestDemoBindService.class.getName()); SOS.sosToAppBaseBeta(this, TestDemoBindService.class.getName());
} else { } else {
SOS.sosToAppBase(this, TestDemoBindService.class.getName()); SOS.sosToAppBase(this, TestDemoBindService.class.getName());
@@ -156,7 +156,7 @@ public class TestDemoBindService extends Service {
isStarted = true; isStarted = true;
super.run(); super.run();
LogUtils.d(TAG, "run() start"); LogUtils.d(TAG, "run() start");
if (App.isDebuging()) { if (App.isDebugging()) {
WinBoLL.bindToAPPBaseBeta(mContext, TestDemoBindService.class.getName()); WinBoLL.bindToAPPBaseBeta(mContext, TestDemoBindService.class.getName());
} else { } else {
WinBoLL.bindToAPPBase(mContext, TestDemoBindService.class.getName()); WinBoLL.bindToAPPBase(mContext, TestDemoBindService.class.getName());

View File

@@ -0,0 +1,35 @@
package cc.winboll.studio.winboll.utils;
import android.app.ActivityManager;
import android.content.Context;
import java.util.List;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/11/27 10:25
* @Describe ServiceUtils
*/
public class ServiceUtils {
public static final String TAG = ServiceUtils.class.getSimpleName();
public static boolean isServiceAlive(Context context, String szServiceName) {
// 获取Activity管理者对象
ActivityManager manager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
// 获取正在运行的服务此处设置最多取1000个
List<ActivityManager.RunningServiceInfo> runningServices = manager
.getRunningServices(1000);
if (runningServices.size() <= 0) {
return false;
}
// 遍历若存在名字和传入的serviceName的一致则说明存在
for (ActivityManager.RunningServiceInfo runningServiceInfo : runningServices) {
if (runningServiceInfo.service.getClassName().equals(szServiceName)) {
return true;
}
}
return false;
}
}

View File

@@ -9,6 +9,8 @@ import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.winboll.models.ResponseData;
import cc.winboll.studio.winboll.models.UserInfoModel;
import com.google.gson.Gson; import com.google.gson.Gson;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -26,9 +28,6 @@ import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import cc.winboll.studio.winboll.models.UserInfoModel;
import cc.winboll.studio.winboll.models.ResponseData;
import cc.winboll.studio.libapputils.utils.FileUtils;
public class YunUtils { public class YunUtils {
public static final String TAG = "YunUtils"; public static final String TAG = "YunUtils";
@@ -138,62 +137,63 @@ public class YunUtils {
} }
UserInfoModel loadUserInfoModel() { UserInfoModel loadUserInfoModel() {
LogUtils.d(TAG, "loadUserInfoModel"); // LogUtils.d(TAG, "loadUserInfoModel");
if (new File(mUserInfoModelPath).exists()) { // if (new File(mUserInfoModelPath).exists()) {
try { // try {
// 加载加密后的模型数据 // // 加载加密后的模型数据
byte[] encryptedData = FileUtils.readByteArrayFromFile(mUserInfoModelPath); // byte[] encryptedData = FileUtils.readByteArrayFromFile(mUserInfoModelPath);
// 加载 RSA 工具 // // 加载 RSA 工具
RSAUtils utils = RSAUtils.getInstance(mContext); // RSAUtils utils = RSAUtils.getInstance(mContext);
KeyPair keyPair = utils.getOrGenerateKeys(); // KeyPair keyPair = utils.getOrGenerateKeys();
//PublicKey publicKey = keyPair.getPublic(); // //PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate(); // PrivateKey privateKey = keyPair.getPrivate();
// 私钥解密模型数据 // // 私钥解密模型数据
String szInfo = utils.decryptWithPrivateKey(encryptedData, keyPair.getPrivate()); // String szInfo = utils.decryptWithPrivateKey(encryptedData, keyPair.getPrivate());
LogUtils.d(TAG, String.format("szInfo %s", szInfo)); // LogUtils.d(TAG, String.format("szInfo %s", szInfo));
mUserInfoModel = UserInfoModel.parseStringToBean(szInfo, UserInfoModel.class); // mUserInfoModel = UserInfoModel.parseStringToBean(szInfo, UserInfoModel.class);
if (mUserInfoModel == null) { // if (mUserInfoModel == null) {
LogUtils.d(TAG, "模型数据解析为空数据。"); // LogUtils.d(TAG, "模型数据解析为空数据。");
} // }
LogUtils.d(TAG, "UserInfoModel 解密加载结束。"); // LogUtils.d(TAG, "UserInfoModel 解密加载结束。");
} catch (Exception e) { // } catch (Exception e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); // LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} // }
} else { // } else {
LogUtils.d(TAG, "云服务登录信息不存在。"); // LogUtils.d(TAG, "云服务登录信息不存在。");
mUserInfoModel = null; // mUserInfoModel = null;
} // }
return mUserInfoModel; // return mUserInfoModel;
return null;
} }
void saveUserInfoModel(UserInfoModel userInfoModel) { void saveUserInfoModel(UserInfoModel userInfoModel) {
LogUtils.d(TAG, "saveUserInfoModel"); // LogUtils.d(TAG, "saveUserInfoModel");
try { // try {
String szInfo = userInfoModel.toString(); // String szInfo = userInfoModel.toString();
LogUtils.d(TAG, "原始数据: " + szInfo); // LogUtils.d(TAG, "原始数据: " + szInfo);
//
RSAUtils utils = RSAUtils.getInstance(mContext); // RSAUtils utils = RSAUtils.getInstance(mContext);
KeyPair keyPair = utils.getOrGenerateKeys(); // KeyPair keyPair = utils.getOrGenerateKeys();
PublicKey publicKey = keyPair.getPublic(); // PublicKey publicKey = keyPair.getPublic();
//
// 公钥加密(传入字节数组,避免中间字符串转换) // // 公钥加密(传入字节数组,避免中间字符串转换)
byte[] encryptedData = utils.encryptWithPublicKey(szInfo, publicKey); // byte[] encryptedData = utils.encryptWithPublicKey(szInfo, publicKey);
//
// 保存加密字节数组到文件(直接操作字节,无需转字符串) // // 保存加密字节数组到文件(直接操作字节,无需转字符串)
FileUtils.writeByteArrayToFile(encryptedData, mUserInfoModelPath); // FileUtils.writeByteArrayToFile(encryptedData, mUserInfoModelPath);
LogUtils.d(TAG, "加密数据已保存"); // LogUtils.d(TAG, "加密数据已保存");
//
// 测试解密(仅调试用) // // 测试解密(仅调试用)
String szInfo2 = utils.decryptWithPrivateKey(encryptedData, keyPair.getPrivate()); // String szInfo2 = utils.decryptWithPrivateKey(encryptedData, keyPair.getPrivate());
LogUtils.d(TAG, "解密结果: " + szInfo2); // LogUtils.d(TAG, "解密结果: " + szInfo2);
//
mUserInfoModel = UserInfoModel.parseStringToBean(szInfo2, UserInfoModel.class); // mUserInfoModel = UserInfoModel.parseStringToBean(szInfo2, UserInfoModel.class);
if (mUserInfoModel == null) { // if (mUserInfoModel == null) {
LogUtils.d(TAG, "模型解析失败"); // LogUtils.d(TAG, "模型解析失败");
} // }
} catch (Exception e) { // } catch (Exception e) {
LogUtils.d(TAG, "加密/解密失败: " + e.getMessage()); // LogUtils.d(TAG, "加密/解密失败: " + e.getMessage());
} // }
} }
// 发送 POST 请求JSON 数据) // 发送 POST 请求JSON 数据)

View File

@@ -12,7 +12,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.utils.AppUtils;
import cc.winboll.studio.winboll.R; import cc.winboll.studio.winboll.R;
import cc.winboll.studio.winboll.WinBoLL; import cc.winboll.studio.winboll.WinBoLL;
import cc.winboll.studio.winboll.models.WinBoLLModel; import cc.winboll.studio.winboll.models.WinBoLLModel;
@@ -56,43 +55,43 @@ public class APPNewsWidget extends AppWidgetProvider {
updateAppWidget(context, appWidgetManager, appWidgetId); updateAppWidget(context, appWidgetManager, appWidgetId);
} }
}else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) { }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) {
LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE"); // LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE");
String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL); // String szWinBoLLModel = intent.getStringExtra(WinBoLL.EXTRA_WINBOLLMODEL);
LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel)); // LogUtils.d(TAG, String.format("szWinBoLLModel %s", szWinBoLLModel));
if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) { // if (szWinBoLLModel != null && !szWinBoLLModel.equals("")) {
try { // try {
WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class); // WinBoLLModel bean = WinBoLLModel.parseStringToBean(szWinBoLLModel, WinBoLLModel.class);
if (bean != null) { // if (bean != null) {
String szAppPackageName = bean.getAppPackageName(); // String szAppPackageName = bean.getAppPackageName();
LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName)); // LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
String szAppMainServiveName = bean.getAppMainServiveName(); // String szAppMainServiveName = bean.getAppMainServiveName();
LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName)); // LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
//
//
String appName = AppUtils.getAppNameByPackageName(context, szAppPackageName); // String appName = AppUtils.getAppNameByPackageName(context, szAppPackageName);
LogUtils.d(TAG, String.format("appName %s", appName)); // LogUtils.d(TAG, String.format("appName %s", appName));
WinBoLLNewsBean winBollNewsBean = new WinBoLLNewsBean(appName); // WinBoLLNewsBean winBollNewsBean = new WinBoLLNewsBean(appName);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currentTime = sdf.format(new Date()); // String currentTime = sdf.format(new Date());
StringBuilder sbLine = new StringBuilder(); // StringBuilder sbLine = new StringBuilder();
sbLine.append("["); // sbLine.append("[");
sbLine.append(currentTime); // sbLine.append(currentTime);
sbLine.append("] Wake up "); // sbLine.append("] Wake up ");
sbLine.append(appName); // sbLine.append(appName);
winBollNewsBean.setMessage(sbLine.toString()); // winBollNewsBean.setMessage(sbLine.toString());
//
addWinBoLLNewsBean(context, winBollNewsBean); // addWinBoLLNewsBean(context, winBollNewsBean);
//
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); // AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class)); // int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class));
for (int appWidgetId : appWidgetIds) { // for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId); // updateAppWidget(context, appWidgetManager, appWidgetId);
} // }
} // }
} catch (IOException e) { // } catch (IOException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); // LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} // }
} // }
} }
} }