Compare commits
4 Commits
appbase-v1
...
appbase
| Author | SHA1 | Date | |
|---|---|---|---|
| e68098aa10 | |||
| d673ba46a1 | |||
| 5a1342156f | |||
| 4e1784d99f |
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Mon Apr 06 20:25:21 HKT 2026
|
#Fri Apr 10 05:38:18 HKT 2026
|
||||||
stageCount=17
|
stageCount=19
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.15
|
baseVersion=15.15
|
||||||
publishVersion=15.15.16
|
publishVersion=15.15.18
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.15.17
|
baseBetaVersion=15.15.19
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">AppBase+</string>
|
<string name="app_name">APPBase+</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class AboutActivity extends Activity {
|
|||||||
LogUtils.d(TAG, "genDefaultAppInfo() 调用");
|
LogUtils.d(TAG, "genDefaultAppInfo() 调用");
|
||||||
String branchName = "appbase";
|
String branchName = "appbase";
|
||||||
APPInfo appInfo = new APPInfo();
|
APPInfo appInfo = new APPInfo();
|
||||||
appInfo.setAppName(getString(R.string.app_name));
|
appInfo.setAppName("APPBase");
|
||||||
appInfo.setAppIcon(R.drawable.ic_winboll);
|
appInfo.setAppIcon(R.drawable.ic_winboll);
|
||||||
appInfo.setAppDescription(getString(R.string.app_description));
|
appInfo.setAppDescription(getString(R.string.app_description));
|
||||||
appInfo.setAppGitName("WinBoLL");
|
appInfo.setAppGitName("WinBoLL");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">AppBase</string>
|
<string name="app_name">APPBase</string>
|
||||||
<string name="app_description">WinBoLL 安卓手机端安卓应用开发基础类库。</string>
|
<string name="app_description">WinBoLL 安卓手机端安卓应用开发基础类库。</string>
|
||||||
<string name="app_normal">Click here is switch to Normal APP</string>
|
<string name="app_normal">Click here is switch to Normal APP</string>
|
||||||
<string name="app_debug">Click here is switch to APP DEBUG</string>
|
<string name="app_debug">Click here is switch to APP DEBUG</string>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Mon Apr 06 20:25:21 HKT 2026
|
#Fri Apr 10 05:38:18 HKT 2026
|
||||||
stageCount=17
|
stageCount=19
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.15
|
baseVersion=15.15
|
||||||
publishVersion=15.15.16
|
publishVersion=15.15.18
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.15.17
|
baseBetaVersion=15.15.19
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import cc.winboll.studio.libappbase.utils.ApkSignUtils;
|
|||||||
* @LastEditTime 2026-01-24 18:45:00
|
* @LastEditTime 2026-01-24 18:45:00
|
||||||
* @Describe 签名显示+正版校验对话框:展示应用签名字节位信息,调用网络接口完成正版合法性校验,实时返回校验结果
|
* @Describe 签名显示+正版校验对话框:展示应用签名字节位信息,调用网络接口完成正版合法性校验,实时返回校验结果
|
||||||
*/
|
*/
|
||||||
public class AppValidationDialog extends Dialog {
|
public class APPValidationDialog extends Dialog {
|
||||||
// ===================================== 全局常量 =====================================
|
// ===================================== 全局常量 =====================================
|
||||||
public static final String TAG = "AppValidationDialog";
|
public static final String TAG = "AppValidationDialog";
|
||||||
// 签名字节位分组大小
|
// 签名字节位分组大小
|
||||||
@@ -31,18 +31,18 @@ public class AppValidationDialog extends Dialog {
|
|||||||
private TextView tvAuthResult;
|
private TextView tvAuthResult;
|
||||||
|
|
||||||
// ===================================== 业务入参属性 =====================================
|
// ===================================== 业务入参属性 =====================================
|
||||||
private String projectName;
|
private String appName;
|
||||||
private String versionName;
|
private String versionName;
|
||||||
private String clientSign;
|
private String clientSign;
|
||||||
private String clientHash;
|
private String clientHash;
|
||||||
|
|
||||||
// ===================================== 构造方法 =====================================
|
// ===================================== 构造方法 =====================================
|
||||||
public AppValidationDialog(Context context, String projectName, String versionName) {
|
public APPValidationDialog(Context context, String appName, String versionName) {
|
||||||
super(context, R.style.DialogStyle);
|
super(context, R.style.DialogStyle);
|
||||||
this.mContext = context;
|
this.mContext = context;
|
||||||
this.projectName = projectName;
|
this.appName = appName;
|
||||||
this.versionName = versionName;
|
this.versionName = versionName;
|
||||||
LogUtils.d(TAG, "AppValidationDialog: 构造方法初始化,入参-> projectName=" + projectName + ", versionName=" + versionName);
|
LogUtils.d(TAG, "AppValidationDialog: 构造方法初始化,入参-> projectName=" + appName + ", versionName=" + versionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===================================== 生命周期方法 =====================================
|
// ===================================== 生命周期方法 =====================================
|
||||||
@@ -104,7 +104,7 @@ public class AppValidationDialog extends Dialog {
|
|||||||
// 调用网络校验接口
|
// 调用网络校验接口
|
||||||
new APPUtils().checkAPKValidation(
|
new APPUtils().checkAPKValidation(
|
||||||
mContext,
|
mContext,
|
||||||
projectName,
|
appName,
|
||||||
versionName,
|
versionName,
|
||||||
clientSign,
|
clientSign,
|
||||||
clientHash,
|
clientHash,
|
||||||
@@ -49,10 +49,10 @@ public class APPUtils {
|
|||||||
* @param clientHash 外部计算的APK SHA256哈希字符串(小写16进制)
|
* @param clientHash 外部计算的APK SHA256哈希字符串(小写16进制)
|
||||||
* @param callback 校验结果回调(主线程调用,返回是否合法+提示信息)
|
* @param callback 校验结果回调(主线程调用,返回是否合法+提示信息)
|
||||||
*/
|
*/
|
||||||
public void checkAPKValidation(Context context, String projectName, String versionName,
|
public void checkAPKValidation(Context context, String appName, String versionName,
|
||||||
String clientSign, String clientHash, final CheckResultCallback callback) {
|
String clientSign, String clientHash, final CheckResultCallback callback) {
|
||||||
// 方法调用+全量入参调试日志
|
// 方法调用+全量入参调试日志
|
||||||
LogUtils.d(TAG, "checkAPKValidation: 方法调用,入参-> projectName=" + projectName
|
LogUtils.d(TAG, "checkAPKValidation: 方法调用,入参-> appName=" + appName
|
||||||
+ ", versionName=" + versionName + ", clientSign=" + clientSign + ", clientHash=" + clientHash);
|
+ ", versionName=" + versionName + ", clientSign=" + clientSign + ", clientHash=" + clientHash);
|
||||||
|
|
||||||
// 1. 核心入参空值校验(快速失败)
|
// 1. 核心入参空值校验(快速失败)
|
||||||
@@ -61,7 +61,7 @@ public class APPUtils {
|
|||||||
callCallbackOnMainThread(callback, false, "上下文对象不能为空");
|
callCallbackOnMainThread(callback, false, "上下文对象不能为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (isStringEmpty(projectName)) {
|
if (isStringEmpty(appName)) {
|
||||||
LogUtils.w(TAG, "checkAPKValidation: 入参projectName为空/空白,直接返回校验失败");
|
LogUtils.w(TAG, "checkAPKValidation: 入参projectName为空/空白,直接返回校验失败");
|
||||||
callCallbackOnMainThread(callback, false, "项目名称不能为空");
|
callCallbackOnMainThread(callback, false, "项目名称不能为空");
|
||||||
return;
|
return;
|
||||||
@@ -85,7 +85,7 @@ public class APPUtils {
|
|||||||
|
|
||||||
// 2. 动态参数URL编码(避免特殊字符导致请求解析异常)
|
// 2. 动态参数URL编码(避免特殊字符导致请求解析异常)
|
||||||
LogUtils.d(TAG, "checkAPKValidation: 开始对动态参数进行UTF-8 URL编码");
|
LogUtils.d(TAG, "checkAPKValidation: 开始对动态参数进行UTF-8 URL编码");
|
||||||
String encodeProjectName = urlEncode(projectName);
|
String encodeProjectName = urlEncode(appName);
|
||||||
String encodeVersionName = urlEncode(versionName);
|
String encodeVersionName = urlEncode(versionName);
|
||||||
String encodeClientSign = urlEncode(clientSign);
|
String encodeClientSign = urlEncode(clientSign);
|
||||||
String encodeClientHash = urlEncode(clientHash);
|
String encodeClientHash = urlEncode(clientHash);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import cc.winboll.studio.libappbase.LogUtils;
|
|||||||
import cc.winboll.studio.libappbase.R;
|
import cc.winboll.studio.libappbase.R;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
import cc.winboll.studio.libappbase.dialogs.DebugHostDialog;
|
import cc.winboll.studio.libappbase.dialogs.DebugHostDialog;
|
||||||
import cc.winboll.studio.libappbase.dialogs.AppValidationDialog;
|
import cc.winboll.studio.libappbase.dialogs.APPValidationDialog;
|
||||||
import cc.winboll.studio.libappbase.models.APPInfo;
|
import cc.winboll.studio.libappbase.models.APPInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,14 +93,14 @@ public class AboutView extends LinearLayout {
|
|||||||
initViewFromXml();
|
initViewFromXml();
|
||||||
}
|
}
|
||||||
|
|
||||||
public AboutView(Context context, APPInfo appInfo) {
|
// public AboutView(Context context, APPInfo appInfo) {
|
||||||
super(context);
|
// super(context);
|
||||||
LogUtils.d(TAG, "AboutView(Context,APPInfo):传入应用信息,appName=" + (appInfo == null ? "null" : appInfo.getAppName()));
|
// LogUtils.d(TAG, "AboutView(Context,APPInfo):传入应用信息,appName=" + (appInfo == null ? "null" : appInfo.getAppName()));
|
||||||
this.mContext = context;
|
// this.mContext = context;
|
||||||
this.mAPPInfo = appInfo;
|
// this.mAPPInfo = appInfo;
|
||||||
initViewFromXml();
|
// initViewFromXml();
|
||||||
initAll();
|
// initAll();
|
||||||
}
|
// }
|
||||||
|
|
||||||
public AboutView(Context context, AttributeSet attrs) {
|
public AboutView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
@@ -129,10 +129,10 @@ public class AboutView extends LinearLayout {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
initDefaultParams();
|
initDefaultParams();
|
||||||
initAppBaseInfo();
|
initAPPBaseInfo();
|
||||||
initAppVersionInfo();
|
initAPPVersionInfo();
|
||||||
initServerConfig();
|
initServerConfig();
|
||||||
initAppLinkInfo();
|
initAPPLinkInfo();
|
||||||
initReleaseAPKInfo();
|
initReleaseAPKInfo();
|
||||||
initAboutPageView();
|
initAboutPageView();
|
||||||
LogUtils.d(TAG, "initAll():所有初始化流程执行完成");
|
LogUtils.d(TAG, "initAll():所有初始化流程执行完成");
|
||||||
@@ -142,13 +142,13 @@ public class AboutView extends LinearLayout {
|
|||||||
* 重置应用信息并重新初始化页面,支持动态更新关于页内容
|
* 重置应用信息并重新初始化页面,支持动态更新关于页内容
|
||||||
* @param appInfo 新的应用信息实体
|
* @param appInfo 新的应用信息实体
|
||||||
*/
|
*/
|
||||||
public void setAPPInfoAndInit(APPInfo appInfo) {
|
// public void setAPPInfoAndInit(APPInfo appInfo) {
|
||||||
LogUtils.d(TAG, "setAPPInfoAndInit():重置应用信息,appName=" + (appInfo == null ? "null" : appInfo.getAppName()));
|
// LogUtils.d(TAG, "setAPPInfoAndInit():重置应用信息,appName=" + (appInfo == null ? "null" : appInfo.getAppName()));
|
||||||
this.mAPPInfo = appInfo;
|
// this.mAPPInfo = appInfo;
|
||||||
if (llFunctionContainer != null) llFunctionContainer.removeAllViews();
|
// if (llFunctionContainer != null) llFunctionContainer.removeAllViews();
|
||||||
initAll();
|
// initAll();
|
||||||
LogUtils.d(TAG, "setAPPInfoAndInit():应用信息重置+页面重构完成");
|
// LogUtils.d(TAG, "setAPPInfoAndInit():应用信息重置+页面重构完成");
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置应用信息,兼容旧调用逻辑,设置后自动重构页面
|
* 设置应用信息,兼容旧调用逻辑,设置后自动重构页面
|
||||||
@@ -211,10 +211,10 @@ public class AboutView extends LinearLayout {
|
|||||||
/**
|
/**
|
||||||
* 从APPInfo实体读取应用基础核心配置,赋值到本地属性
|
* 从APPInfo实体读取应用基础核心配置,赋值到本地属性
|
||||||
*/
|
*/
|
||||||
private void initAppBaseInfo() {
|
private void initAPPBaseInfo() {
|
||||||
LogUtils.d(TAG, "initAppBaseInfo():开始读取APPInfo基础配置");
|
LogUtils.d(TAG, "initAPPBaseInfo():开始读取APPInfo基础配置");
|
||||||
if (mAPPInfo == null) {
|
if (mAPPInfo == null) {
|
||||||
LogUtils.w(TAG, "initAppBaseInfo():跳过执行,APPInfo为null");
|
LogUtils.w(TAG, "initAPPBaseInfo():跳过执行,APPInfo为null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mszAppName = mAPPInfo.getAppName() == null ? "" : mAPPInfo.getAppName();
|
mszAppName = mAPPInfo.getAppName() == null ? "" : mAPPInfo.getAppName();
|
||||||
@@ -224,22 +224,22 @@ public class AboutView extends LinearLayout {
|
|||||||
mszAppDescription = mAPPInfo.getAppDescription() == null ? "" : mAPPInfo.getAppDescription();
|
mszAppDescription = mAPPInfo.getAppDescription() == null ? "" : mAPPInfo.getAppDescription();
|
||||||
mnAppIcon = (mAPPInfo.getAppIcon() != 0) ? mAPPInfo.getAppIcon() : mnAppIcon;
|
mnAppIcon = (mAPPInfo.getAppIcon() != 0) ? mAPPInfo.getAppIcon() : mnAppIcon;
|
||||||
mIsAddDebugTools = mAPPInfo.isAddDebugTools();
|
mIsAddDebugTools = mAPPInfo.isAddDebugTools();
|
||||||
LogUtils.d(TAG, "initAppBaseInfo():基础配置读取完成,应用名=" + mszAppName + ",调试开关=" + mIsAddDebugTools);
|
LogUtils.d(TAG, "initAPPBaseInfo():基础配置读取完成,应用名=" + mszAppName + ",调试开关=" + mIsAddDebugTools);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从包管理中获取当前应用版本号,初始化版本相关信息
|
* 从包管理中获取当前应用版本号,初始化版本相关信息
|
||||||
*/
|
*/
|
||||||
private void initAppVersionInfo() {
|
private void initAPPVersionInfo() {
|
||||||
LogUtils.d(TAG, "initAppVersionInfo():开始初始化应用版本信息");
|
LogUtils.d(TAG, "initAPPVersionInfo():开始初始化应用版本信息");
|
||||||
try {
|
try {
|
||||||
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
|
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
LogUtils.e(TAG, "initAppVersionInfo():获取版本号失败,默认赋值unknown", e);
|
LogUtils.e(TAG, "initAPPVersionInfo():获取版本号失败,默认赋值unknown", e);
|
||||||
mszAppVersionName = "unknown";
|
mszAppVersionName = "unknown";
|
||||||
}
|
}
|
||||||
mszCurrentAppPackageName = String.format("%s_%s.apk", mszAppVersionName, mszAppVersionName);
|
mszCurrentAppPackageName = String.format("%s_%s.apk", mszAppVersionName, mszAppVersionName);
|
||||||
LogUtils.d(TAG, "initAppVersionInfo():版本信息初始化完成,版本号=" + mszAppVersionName + ",当前APK名=" + mszCurrentAppPackageName);
|
LogUtils.d(TAG, "initAPPVersionInfo():版本信息初始化完成,版本号=" + mszAppVersionName + ",当前APK名=" + mszCurrentAppPackageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -252,10 +252,10 @@ public class AboutView extends LinearLayout {
|
|||||||
/**
|
/**
|
||||||
* 初始化应用相关链接(主页+Git源码地址),根据分支配置动态拼接Git地址
|
* 初始化应用相关链接(主页+Git源码地址),根据分支配置动态拼接Git地址
|
||||||
*/
|
*/
|
||||||
private void initAppLinkInfo() {
|
private void initAPPLinkInfo() {
|
||||||
LogUtils.d(TAG, "initAppLinkInfo():开始初始化应用链接信息");
|
LogUtils.d(TAG, "initAPPLinkInfo():开始初始化应用链接信息");
|
||||||
if (mAPPInfo == null) {
|
if (mAPPInfo == null) {
|
||||||
LogUtils.w(TAG, "initAppLinkInfo():跳过执行,APPInfo为null");
|
LogUtils.w(TAG, "initAPPLinkInfo():跳过执行,APPInfo为null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mszHomePage = mAPPInfo.getAppHomePage() == null ? "" : mAPPInfo.getAppHomePage();
|
mszHomePage = mAPPInfo.getAppHomePage() == null ? "" : mAPPInfo.getAppHomePage();
|
||||||
@@ -267,7 +267,7 @@ public class AboutView extends LinearLayout {
|
|||||||
mAPPInfo.getAppGitOwner(), mszAppGitName,
|
mAPPInfo.getAppGitOwner(), mszAppGitName,
|
||||||
mAPPInfo.getAppGitAPPBranch(), mAPPInfo.getAppGitAPPSubProjectFolder());
|
mAPPInfo.getAppGitAPPBranch(), mAPPInfo.getAppGitAPPSubProjectFolder());
|
||||||
}
|
}
|
||||||
LogUtils.d(TAG, "initAppLinkInfo():链接信息初始化完成,应用主页=" + mszHomePage + ",Git地址=" + mszGitea);
|
LogUtils.d(TAG, "initAPPLinkInfo():链接信息初始化完成,应用主页=" + mszHomePage + ",Git地址=" + mszGitea);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -333,7 +333,7 @@ public class AboutView extends LinearLayout {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
LogUtils.d(TAG, "ibSigngetDialog onClick:唤起应用正版校验弹窗");
|
LogUtils.d(TAG, "ibSigngetDialog onClick:唤起应用正版校验弹窗");
|
||||||
new AppValidationDialog(mContext, mszAppGitName, mszAppVersionName).show();
|
new APPValidationDialog(mContext, mszAppName, mszAppVersionName).show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// 调试地址配置弹窗
|
// 调试地址配置弹窗
|
||||||
|
|||||||
Reference in New Issue
Block a user