修复一个匿名内部类中的内存溢出的问题 https://github.com/AriaLyy/Aria/issues/705

m3u8密钥下载地址转换器增加ts列表的url地址https://github.com/AriaLyy/Aria/issues/718
This commit is contained in:
laoyuyu
2020-07-27 19:19:38 +08:00
parent bebc9b926d
commit 9d8bf579b6
17 changed files with 317 additions and 252 deletions

View File

@@ -25,9 +25,10 @@ public interface IKeyUrlConverter extends IEventHandler {
/**
* 将被加密的密钥下载地址转换为可使用的http下载地址
*
* @param m3u8Url m3u8文件的下载地址
* @param m3u8Url m3u8的url地址
* @param tsListUrl m3u8切片列表url地址
* @param keyUrl 加密的url地址
* @return 可正常访问的http地址
*/
String convert(String m3u8Url, String keyUrl);
String convert(String m3u8Url, String tsListUrl, String keyUrl);
}

View File

@@ -78,7 +78,7 @@ public class AriaServiceLoader<S> {
private Class<S> service;
private ClassLoader loader;
private Enumeration<URL> configs = null;
private Iterator<String> pending = null;
private List<String> pending = null;
private LazyLoader(Class<S> service, ClassLoader loader) {
this.service = service;
@@ -103,7 +103,7 @@ public class AriaServiceLoader<S> {
// If an I/O error occurs while reading from the given URL, or
// if a configuration-file format error is detected
//
private Iterator<String> parse(Class<?> service, URL u) throws ServiceConfigurationError {
private List<String> parse(Class<?> service, URL u) throws ServiceConfigurationError {
InputStream in = null;
BufferedReader r = null;
ArrayList<String> names = new ArrayList<>();
@@ -122,7 +122,7 @@ public class AriaServiceLoader<S> {
fail(service, "Error closing configuration file", y);
}
}
return names.iterator();
return names;
}
private void fail(Class<?> service, String msg, Throwable cause)
@@ -177,8 +177,8 @@ public class AriaServiceLoader<S> {
}
private S loadService(String serviceName) {
while (pending.hasNext()) {
if (pending.next().equals(serviceName)) {
for (String s : pending) {
if (s.equals(serviceName)) {
Class<?> c = null;
try {
c = Class.forName(serviceName, false, loader);
@@ -224,7 +224,7 @@ public class AriaServiceLoader<S> {
fail(service, "Error locating configuration files", x);
}
}
while ((pending == null) || !pending.hasNext()) {
while ((pending == null) || pending.isEmpty()) {
if (!configs.hasMoreElements()) {
return;
}

View File

@@ -16,6 +16,7 @@
package com.arialyy.aria.util;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -23,6 +24,7 @@ import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.FtpUrlEntity;
import dalvik.system.DexFile;
@@ -34,6 +36,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
@@ -60,6 +64,101 @@ public class CommonUtil {
private static final String TAG = "CommonUtil";
public static final String SERVER_CHARSET = "ISO-8859-1";
private static long lastClickTime;
/**
* android、androidx、support的fragment、dialogFragment类名
*/
private static List<String> mFragmentClassName = new ArrayList<>();
private static List<String> mDialogFragmentClassName = new ArrayList<>();
static {
mFragmentClassName.add("androidx.fragment.app.Fragment");
mFragmentClassName.add("androidx.fragment.app.DialogFragment");
mFragmentClassName.add("android.app.Fragment");
mFragmentClassName.add("android.app.DialogFragment");
mFragmentClassName.add("android.support.v4.app.Fragment");
mFragmentClassName.add("android.support.v4.app.DialogFragment");
mDialogFragmentClassName.add("androidx.fragment.app.DialogFragment");
mDialogFragmentClassName.add("android.app.DialogFragment");
mDialogFragmentClassName.add("android.support.v4.app.DialogFragment");
}
/**
* 获取fragment的activityz
*
* @return 获取失败返回null
*/
public static Activity getFragmentActivity(Object obj) {
try {
Method method = obj.getClass().getMethod("getActivity");
return (Activity) method.invoke(obj);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
/**
* 判断注解对象是否是fragment
*
* @return true 对象是fragment
*/
public static boolean isFragment(Class subClazz) {
Class parentClass = subClazz.getSuperclass();
if (parentClass == null) {
return false;
} else {
String parentName = parentClass.getName();
if (mFragmentClassName.contains(parentName)) {
return true;
} else {
return isFragment(parentClass);
}
}
}
/**
* 判断对象是否是DialogFragment
*
* @return true 对象是DialogFragment
*/
public static boolean isDialogFragment(Class subClazz) {
Class parentClass = subClazz.getSuperclass();
if (parentClass == null) {
return false;
} else {
String parentName = parentClass.getName();
if (mDialogFragmentClassName.contains(parentName)) {
return true;
} else {
return isDialogFragment(parentClass);
}
}
}
public static boolean isLocalOrAnonymousClass(Class clazz) {
// JVM Spec 4.8.6: A class must have an EnclosingMethod
// attribute if and only if it is a local class or an
// anonymous class.
return clazz.isLocalClass() || clazz.isAnonymousClass();
}
public static String getTargetName(Object obj) {
String targetName;
if (isLocalOrAnonymousClass(obj.getClass())) {
Log.w(TAG, String.format("%s 是匿名内部类或局部类,将使用其主类的对象", obj.getClass().getName()));
String clsName = obj.getClass().getName();
int $Index = clsName.lastIndexOf("$");
targetName = clsName.substring(0, $Index);
} else {
targetName = obj.getClass().getName();
}
return targetName;
}
/**
* 获取线程名称命名规则md5(任务地址 + 线程id)

View File

@@ -106,7 +106,6 @@ public class ComponentUtil {
* @return 返回任务工具
*/
public synchronized IUtil buildUtil(AbsTaskWrapper wrapper, IEventListener listener) {
utilLoader.reload();
int requestType = wrapper.getRequestType();
String className = null;
switch (requestType) {