Compare commits

...

17 Commits

Author SHA1 Message Date
1040f5ff4d Merge branch 'sentry/407275' into 'release'
fix: Sentry 407275 修复Z10机型报BadTokenException的异常

See merge request halo/android/assistant-android!1915
2024-10-09 14:56:18 +08:00
97be320529 fix: Sentry 407275 修复Z10机型报BadTokenException的异常 2024-10-09 14:56:18 +08:00
59cde4e2bf Merge branch 'hotfix/v5.37.5-1095/privacy-policy' into 'release'
feat: 优化获取进程名的方式 https://jira.shanqu.cc/browse/GHZSCY-6690

See merge request halo/android/assistant-android!1898
2024-09-20 10:56:40 +08:00
cc0c7c7fae feat: 优化获取进程名的方式 https://jira.shanqu.cc/browse/GHZSCY-6690 2024-09-20 10:32:29 +08:00
9e9ce6a84f Merge branch 'hotfix/v5.37.5-1095/download_ad_crash' into 'release'
fix: 修复下载管理展示第三方广告失败回落展示自有广告时出现的闪退问题...

See merge request halo/android/assistant-android!1895
2024-09-14 17:23:26 +08:00
7d0b500ff9 fix: 修复下载管理展示第三方广告失败回落展示自有广告时出现的闪退问题 https://sentry.shanqu.cc/organizations/lightgame/issues/409586/?project=22 2024-09-14 17:13:23 +08:00
425456b263 Merge branch 'feat/v5.37.5-1095/va-2.0.5' into 'release'
Feat/v5.37.5 1095/va 2.0.5

See merge request halo/android/assistant-android!1890
2024-09-11 17:08:07 +08:00
f6abab9a2d Revert "chore: 组件升级 2.0.5-debug" 2024-09-11 17:05:56 +08:00
d194f969e4 chore: va组件2.0.5-debug 2024-09-10 16:43:57 +08:00
95f66344fb chore: va组件2.0.5 2024-09-10 13:46:15 +08:00
570e2fa9bc Revert "feat:同步商业版代码至:dbc3b8ecaca3e774b1e63f41e70b651f4acfaee1"
This reverts commit 811d42457c.
2024-09-05 15:22:32 +08:00
9e07080043 feat: 调整依赖源顺序 2024-09-04 17:03:37 +08:00
e10a329159 chore: 版本更新至 5.37.5 2024-09-04 16:00:00 +08:00
b3bc7b43f7 Merge branch 'feat/v5.37.5-1095/update-va' into 'release'
feat:同步商业版代码至:dbc3b8ecaca3e774b1e63f41e70b651f4acfaee1

See merge request halo/android/assistant-android!1875
2024-09-04 15:54:34 +08:00
811d42457c feat:同步商业版代码至:dbc3b8ecaca3e774b1e63f41e70b651f4acfaee1 2024-09-04 15:52:46 +08:00
ac0b819ea9 Merge branch 'feat/GHZSCY-6644' into 'release'
feat: 【光环助手】安装相关优化功能埋点事件的属性字段英文错误的问题 https://jira.shanqu.cc/browse/GHZSCY-6644

See merge request halo/android/assistant-android!1874
2024-09-04 15:43:47 +08:00
d931fb5940 feat: 【光环助手】安装相关优化功能埋点事件的属性字段英文错误的问题 https://jira.shanqu.cc/browse/GHZSCY-6644 2024-09-04 14:42:17 +08:00
12 changed files with 117 additions and 47 deletions

View File

@ -72,7 +72,7 @@ android_build:
only:
- dev
- release
- feat/GHZSCY-6578
- feat/GHZSCY-6644
# 代码检查
sonarqube_analysis:
@ -158,4 +158,4 @@ oss-upload&send-email:
only:
- dev
- release
- feat/GHZSCY-6578
- feat/GHZSCY-6644

View File

@ -161,6 +161,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
val showOnFailed = downloadManagerAd?.displayRule?.onFailedAction == "show"
if ((showThirdPartyAd && thirdPartyAd != null) || (!showThirdPartyAd && thirdPartyAd != null && ownerAd == null)) {
initThirdPartyAd(thirdPartyAd) { isSuccess ->
if (!isAdded) return@initThirdPartyAd
mBinding.maskView.goneIf(!isSuccess)
if (!isSuccess && ownerAd != null && showOnFailed) {
mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1
@ -193,7 +194,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
}
private fun initOwnerAd(adConfig: AdConfig) {
if (adConfig.id.isEmpty()) return
if (!isAdded || adConfig.id.isEmpty()) return
mAdGameViewModel = viewModelProvider(AdGameViewModel.Factory(adConfig))
initAdGameBanner(adConfig)
mBinding.closeAdIv.setOnClickListener {
@ -227,6 +228,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
adConfig.displayRule.onFailedAction == "show" && adConfig.thirdPartyAd != null) {
// 自有广告游戏为空时,显示第三方广告
initThirdPartyAd(adConfig.thirdPartyAd) { isSuccess ->
if (!isAdded) return@initThirdPartyAd
mBinding.maskView.goneIf(!isSuccess)
if (isSuccess) {
SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis())

View File

@ -394,7 +394,7 @@ class SpecialDownloadDialogFragment : BaseDraggableDialogFragment() {
SensorsBridge.trackDownloadComponentsContentClick(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "unknown",
gameSchemeType = gameEntity.gameBitChinese,
gameSchemaType = gameEntity.gameBitChinese,
downloadStatus = gameEntity.downloadStatusChinese,
gameType = gameEntity.categoryChinese,
downloadType = if (asVGame) "畅玩下载" else "本地下载",
@ -405,7 +405,7 @@ class SpecialDownloadDialogFragment : BaseDraggableDialogFragment() {
SensorsBridge.trackDownloadComponentsShow(
gameId = gameEntity.id,
gameName = gameEntity.name ?: "unknown",
gameSchemeType = gameEntity.gameBitChinese,
gameSchemaType = gameEntity.gameBitChinese,
downloadStatus = gameEntity.downloadStatusChinese,
gameType = gameEntity.categoryChinese,
downloadType = if (asVGame) "畅玩下载" else "本地下载",

View File

@ -13,7 +13,7 @@ object HeadUpDisplayLogHelper {
source = source,
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
gameId = downloadEntity.gameId,
gameName = downloadEntity.name
@ -25,7 +25,7 @@ object HeadUpDisplayLogHelper {
source = source,
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
gameId = downloadEntity.gameId,
gameName = downloadEntity.name
@ -36,7 +36,7 @@ object HeadUpDisplayLogHelper {
SensorsBridge.trackAutomaticInstallationPromptBarShow(
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
gameId = downloadEntity.gameId,
gameName = downloadEntity.name
@ -47,7 +47,7 @@ object HeadUpDisplayLogHelper {
SensorsBridge.trackAutomaticInstallationPromptBarClick(
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
gameId = downloadEntity.gameId,
gameName = downloadEntity.name

View File

@ -3,7 +3,6 @@ package com.gh.ndownload.suspendwindow
import android.app.Activity
import android.app.Application
import android.app.Application.ActivityLifecycleCallbacks
import android.os.Build
import android.os.Bundle
import androidx.core.view.ViewCompat
import com.gh.gamecenter.common.constant.Constants
@ -128,7 +127,7 @@ class NDownloadDrawOverlayPermissionWindowController(val application: Applicatio
SensorsBridge.trackDownloadSuspendedWindowGuideShow(
gameId = downloadEntity.gameId,
gameName = downloadEntity.name,
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
gameType = downloadEntity.categoryChinese,
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载"

View File

@ -48,10 +48,17 @@ abstract class NDownloadSuspendWindow<T : View>(
fun attach() {
if (!isAttached) {
_isAttached = true
windowManager.addView(root, layoutParams)
context.registerComponentCallbacks(this)
onAttach()
try {
_isAttached = true
windowManager.addView(root, layoutParams)
context.registerComponentCallbacks(this)
onAttach()
} catch (e: Throwable) {
// 处理“Unable to add window android.view.ViewRootImpl$W@7bc9502 -- permission denied for window type 2038”的异常
// 目前Sentry上仅Z10型号的手机报这个错误Android 8.1.0这里明明已经授予了SYSTEM_ALERT_WINDOW权限但是就是会抛异常= =,只能暴力捕获处理了。。。
// 相关异常的链接https://sentry.shanqu.cc/organizations/lightgame/issues/407275/?project=22
_isAttached = false
}
}
}

View File

@ -17,8 +17,8 @@ buildscript {
password("u9gZYH4MQEwLLQZK")
}
}
maven { url 'https://jitpack.io' }
maven { url "https://maven.google.com" }
maven { url 'https://jitpack.io' }
}
dependencies {
@ -41,7 +41,6 @@ allprojects {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/central'}
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases/' }
@ -55,6 +54,7 @@ allprojects {
// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://developer.hihonor.com/repo' }
maven { url 'https://jitpack.io' }
}
}
task clean(type: Delete) {

View File

@ -7,8 +7,8 @@ ext {
targetSdkVersion = 30
// application info (每个大版本之间的 versionCode 增加 20)
versionCode = 1094
versionName = "5.37.4"
versionCode = 1095
versionName = "5.37.5"
applicationId = "com.gh.gamecenter"
applicationIdGat = "com.gh.gamecenter.intl"

View File

@ -1,5 +1,5 @@
ext {
vaCompileSdkVersion = 33
vaCompileSdkVersion = 34
vaMinSdkVersion = 21
vaTargetSdkVersion = 28
}

View File

@ -26,7 +26,7 @@ object SensorsBridge {
private const val KEY_LAST_PAGE_BUSINESS_ID = "last_page_business_id"
private const val KEY_DOWNLOAD_STATUS = "download_status"
private const val KEY_DOWNLOAD_TYPE = "download_type"
private const val KEY_GAME_SCHEME_TYPE = "game_scheme_type"
private const val KEY_GAME_SCHEMA_TYPE = "game_schema_type"
private const val KEY_GAME_TYPE = "game_type"
const val KEY_POSITION = "position"
const val KEY_TAB_CONTENT = "tab_content"
@ -4070,7 +4070,7 @@ object SensorsBridge {
* 触发时机:当下载悬浮窗引导图展示时触发上报
* @param gameId 游戏ID
* @param gameName 游戏名称
* @param gameSchemeType 游戏架构类型64位/32位
* @param gameSchemaType 游戏架构类型64位/32位
* @param downloadStatus 游戏下载状态
* @param gameType 游戏的类型:单机、网游等
* @param downloadType 实际下载方式:本地下载/畅玩下载
@ -4079,7 +4079,7 @@ object SensorsBridge {
fun trackDownloadSuspendedWindowGuideShow(
gameId: String,
gameName: String,
gameSchemeType: String,
gameSchemaType: String,
downloadStatus: String,
gameType: String,
downloadType: String
@ -4087,7 +4087,7 @@ object SensorsBridge {
val json = json {
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_TYPE to gameType
KEY_DOWNLOAD_TYPE to downloadType
@ -4126,7 +4126,7 @@ object SensorsBridge {
* @param source 来源:游戏下载\重启APP
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
* @param downloadStatus 所上报游戏下载状态
* @param gameSchemeType 所上报游戏架构类型64位/32位
* @param gameSchemaType 所上报游戏架构类型64位/32位
* @param gameType 游戏的类型:单机、网游等
* @param gameId 游戏ID
* @param gameName 游戏名称
@ -4135,7 +4135,7 @@ object SensorsBridge {
source: String,
downloadType: String,
downloadStatus: String,
gameSchemeType: String,
gameSchemaType: String,
gameType: String,
gameId: String,
gameName: String
@ -4144,7 +4144,7 @@ object SensorsBridge {
KEY_SOURCE to source
KEY_DOWNLOAD_TYPE to downloadType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_GAME_TYPE to gameType
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
@ -4159,7 +4159,7 @@ object SensorsBridge {
* @param source 来源:游戏下载\重启APP
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
* @param downloadStatus 所上报游戏下载状态
* @param gameSchemeType 所上报游戏架构类型64位/32位
* @param gameSchemaType 所上报游戏架构类型64位/32位
* @param gameType 游戏的类型:单机、网游等
* @param gameId 游戏ID
* @param gameName 游戏名称
@ -4168,7 +4168,7 @@ object SensorsBridge {
source: String,
downloadType: String,
downloadStatus: String,
gameSchemeType: String,
gameSchemaType: String,
gameType: String,
gameId: String,
gameName: String
@ -4177,7 +4177,7 @@ object SensorsBridge {
KEY_SOURCE to source
KEY_DOWNLOAD_TYPE to downloadType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_GAME_TYPE to gameType
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
@ -4191,7 +4191,7 @@ object SensorsBridge {
* 触发时机:触发自动下载提示条展示时上报
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
* @param downloadStatus 所上报游戏下载状态
* @param gameSchemeType 所上报游戏架构类型64位/32位
* @param gameSchemaType 所上报游戏架构类型64位/32位
* @param gameType 游戏的类型:单机、网游等
* @param gameId 游戏ID
* @param gameName 游戏名称
@ -4199,7 +4199,7 @@ object SensorsBridge {
fun trackAutomaticInstallationPromptBarShow(
downloadType: String,
downloadStatus: String,
gameSchemeType: String,
gameSchemaType: String,
gameType: String,
gameId: String,
gameName: String
@ -4207,7 +4207,7 @@ object SensorsBridge {
val json = json {
KEY_DOWNLOAD_TYPE to downloadType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_GAME_TYPE to gameType
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
@ -4221,7 +4221,7 @@ object SensorsBridge {
* 触发时机:触发自动下载提示条点击时上报
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
* @param downloadStatus 所上报游戏下载状态
* @param gameSchemeType 所上报游戏架构类型64位/32位
* @param gameSchemaType 所上报游戏架构类型64位/32位
* @param gameType 游戏的类型:单机、网游等
* @param gameId 游戏ID
* @param gameName 游戏名称
@ -4229,7 +4229,7 @@ object SensorsBridge {
fun trackAutomaticInstallationPromptBarClick(
downloadType: String,
downloadStatus: String,
gameSchemeType: String,
gameSchemaType: String,
gameType: String,
gameId: String,
gameName: String
@ -4237,7 +4237,7 @@ object SensorsBridge {
val json = json {
KEY_DOWNLOAD_TYPE to downloadType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_GAME_TYPE to gameType
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
@ -4251,7 +4251,7 @@ object SensorsBridge {
* 触发时机:下载组件展示时上报
* @param gameId 游戏ID
* @param gameName 游戏名称
* @param gameSchemeType 游戏架构类型64位/32位
* @param gameSchemaType 游戏架构类型64位/32位
* @param downloadStatus 所上报游戏下载状态
* @param gameType 游戏的类型:单机、网游等
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
@ -4259,7 +4259,7 @@ object SensorsBridge {
fun trackDownloadComponentsShow(
gameId: String,
gameName: String,
gameSchemeType: String,
gameSchemaType: String,
downloadStatus: String,
gameType: String,
downloadType: String,
@ -4267,7 +4267,7 @@ object SensorsBridge {
val json = json {
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_TYPE to gameType
KEY_DOWNLOAD_TYPE to downloadType
@ -4281,7 +4281,7 @@ object SensorsBridge {
* 触发时机:下载组件点击时上报
* @param gameId 游戏ID
* @param gameName 游戏名称
* @param gameSchemeType 游戏架构类型64位/32位
* @param gameSchemaType 游戏架构类型64位/32位
* @param downloadStatus 所上报游戏下载状态
* @param gameType 游戏的类型:单机、网游等
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
@ -4291,7 +4291,7 @@ object SensorsBridge {
fun trackDownloadComponentsContentClick(
gameId: String,
gameName: String,
gameSchemeType: String,
gameSchemaType: String,
downloadStatus: String,
gameType: String,
downloadType: String,
@ -4301,7 +4301,7 @@ object SensorsBridge {
val json = json {
KEY_GAME_ID to gameId
KEY_GAME_NAME to gameName
KEY_GAME_SCHEME_TYPE to gameSchemeType
KEY_GAME_SCHEMA_TYPE to gameSchemaType
KEY_DOWNLOAD_STATUS to downloadStatus
KEY_GAME_TYPE to gameType
KEY_DOWNLOAD_TYPE to downloadType

View File

@ -6,6 +6,8 @@ import android.text.TextUtils;
import androidx.annotation.Nullable;
import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Method;
public class ProcessUtil {
@ -20,13 +22,25 @@ public class ProcessUtil {
return currentProcessName;
}
//1)通过Application的API获取当前进程名
//0)通过反射 ActivityThread 获取实例再获取当前进程名
currentProcessName = getCurrentProcessNameByActivityThreadInstance();
if (!TextUtils.isEmpty(currentProcessName)) {
return currentProcessName;
}
//1)通过 CMD 获取当前进程名
currentProcessName = getCurrentProcessNameByCMD(android.os.Process.myPid());
if (!TextUtils.isEmpty(currentProcessName)) {
return currentProcessName;
}
//2)通过 Application 的 API 获取当前进程名
currentProcessName = getCurrentProcessNameByApplication();
if (!TextUtils.isEmpty(currentProcessName)) {
return currentProcessName;
}
//2)通过反射ActivityThread获取当前进程名
//3)通过反射 ActivityThread 获取当前进程名
currentProcessName = getCurrentProcessNameByActivityThread();
if (!TextUtils.isEmpty(currentProcessName)) {
return currentProcessName;
@ -38,7 +52,7 @@ public class ProcessUtil {
/**
* 通过Application新的API获取进程名无需反射无需IPC效率最高。
*/
public static String getCurrentProcessNameByApplication() {
private static String getCurrentProcessNameByApplication() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
return Application.getProcessName();
}
@ -48,7 +62,7 @@ public class ProcessUtil {
/**
* 通过反射ActivityThread获取进程名避免了ipc
*/
public static String getCurrentProcessNameByActivityThread() {
private static String getCurrentProcessNameByActivityThread() {
String processName = null;
try {
final Method declaredMethod = Class.forName("android.app.ActivityThread", false, Application.class.getClassLoader())
@ -64,4 +78,52 @@ public class ProcessUtil {
return processName;
}
private static String getCurrentProcessNameByActivityThreadInstance() {
try {
// Get ActivityThread class
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread",false, Application.class.getClassLoader());
// Get the current ActivityThread instance
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
currentActivityThreadMethod.setAccessible(true);
Object activityThread = currentActivityThreadMethod.invoke(null);
// Get the getProcessName method
Method getProcessNameMethod = activityThreadClass.getDeclaredMethod("getProcessName");
getProcessNameMethod.setAccessible(true);
// Call the getProcessName method
return (String) getProcessNameMethod.invoke(activityThread);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static String getCurrentProcessNameByCMD(int pid) {
//get from /proc/PID/cmdline
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
String processName = br.readLine();
if (!TextUtils.isEmpty(processName)) {
processName = processName.trim();
if (!TextUtils.isEmpty(processName)) {
return processName; //OK
}
}
} catch (Exception ignored) {
} finally {
try {
if (br != null) {
br.close();
}
} catch (Exception ignored) {
}
}
//failed
return null;
}
}

2
vasdk

Submodule vasdk updated: 7ec45b5a7d...ff118306e4