/*
* Tencent is pleased to support the open source community by making Tinker available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.tencent.tinker.lib.util;
import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.util.Log;
import com.tencent.tinker.lib.service.TinkerPatchService;
import com.tencent.tinker.loader.shareutil.ShareTinkerInternals;
import java.util.List;
/**
* Created by zhangshaowen on 16/3/10.
*/
public class TinkerServiceInternals extends ShareTinkerInternals {
private static final String TAG = "Tinker.ServiceInternals";
/**
* or you may just hardcode them in your app
*/
private static String patchServiceProcessName = null;
public static void killTinkerPatchServiceProcess(Context context) {
String serverProcessName = getTinkerPatchServiceName(context);
if (serverProcessName == null) {
return;
}
final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// ActivityManager getRunningAppProcesses()
List<ActivityManager.RunningAppProcessInfo> appProcessList = am
.getRunningAppProcesses();
if (appProcessList == null) {
return;
}
for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {
String processName = appProcess.processName;
if (processName.equals(serverProcessName)) {
android.os.Process.killProcess(appProcess.pid);
}
}
}
public static boolean isTinkerPatchServiceRunning(Context context) {
final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String serverName = getTinkerPatchServiceName(context);
if (serverName == null) {
return false;
}
try {
// ActivityManager getRunningAppProcesses()
List<ActivityManager.RunningAppProcessInfo> appProcessList = am
.getRunningAppProcesses();
if (appProcessList == null) {
return false;
}
for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {
String processName = appProcess.processName;
if (processName.equals(serverName)) {
return true;
}
}
} catch (Exception e) {
Log.e(TAG, "isTinkerPatchServiceRunning Exception: " + e.toString());
return false;
} catch (Error e) {
Log.e(TAG, "isTinkerPatchServiceRunning Error: " + e.toString());
return false;
}
return false;
}
public static String getTinkerPatchServiceName(final Context context) {
if (patchServiceProcessName != null) {
return patchServiceProcessName;
}
//may be null, and you may like to hardcode instead
String serviceName = TinkerServiceInternals.getServiceProcessName(context, TinkerPatchService.class);
if (serviceName == null) {
return null;
}
patchServiceProcessName = serviceName;
return patchServiceProcessName;
}
/**
* add service cache
*
* @param context
* @return boolean
*/
public static boolean isInTinkerPatchServiceProcess(Context context) {
String process = getProcessName(context);
String service = TinkerServiceInternals.getTinkerPatchServiceName(context);
if (service == null || service.length() == 0) {
return false;
}
return process.equals(service);
}
private static String getServiceProcessName(Context context, Class<? extends Service> serviceClass) {
PackageManager packageManager = context.getPackageManager();
ComponentName component = new ComponentName(context, serviceClass);
ServiceInfo serviceInfo;
try {
serviceInfo = packageManager.getServiceInfo(component, 0);
} catch (Throwable ignored) {
// Service is disabled.
return null;
}
return serviceInfo.processName;
}
}