Отключить log4j JMX на Android - PullRequest
       6

Отключить log4j JMX на Android

1 голос
/ 25 февраля 2020

Я пытаюсь перенести Hyperledger Fabri c Java SDK v1.4 на Android (уровень API 26). SDK использует Log4j v2.13. Log4j не совсем оптимизирован для android. Я получаю следующую ошибку:

I/System.out: WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
I/icandroidsampl: Rejecting re-init on previously-failed class java.lang.Class<org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
        at void org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup.<clinit>() (JmxRuntimeInputArgumentsLookup.java:35)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.Class) (LoaderUtil.java:185)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.String) (LoaderUtil.java:207)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(java.lang.String, java.lang.Class) (LoaderUtil.java:228)
        at java.lang.Object org.apache.logging.log4j.core.util.Loader.newCheckedInstanceOf(java.lang.String, java.lang.Class) (Loader.java:311)
        at void org.apache.logging.log4j.core.lookup.Interpolator.<init>(java.util.Map) (Interpolator.java:120)
        at void org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(org.apache.logging.log4j.core.LoggerContext, org.apache.logging.log4j.core.config.ConfigurationSource) (AbstractConfiguration.java:129)
        at void org.apache.logging.log4j.core.config.NullConfiguration.<init>() (NullConfiguration.java:32)
        at void org.apache.logging.log4j.core.LoggerContext.<clinit>() (LoggerContext.java:86)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(java.lang.String, java.net.URI) (ClassLoaderContextSelector.java:229)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(java.lang.ClassLoader, java.net.URI) (ClassLoaderContextSelector.java:203)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean, java.net.URI) (ClassLoaderContextSelector.java:128)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean) (ClassLoaderContextSelector.java:115)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:148)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:45)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.LogManager.getContext(java.lang.ClassLoader, boolean) (LogManager.java:194)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(java.lang.Class) (AbstractLoggerAdapter.java:138)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.jcl.LogAdapter.getContext() (LogAdapter.java:39)
        at java.lang.Object org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(java.lang.String) (AbstractLoggerAdapter.java:48)
        at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.String) (LogFactoryImpl.java:40)
        at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.Class) (LogFactoryImpl.java:55)
        at org.apache.commons.logging.Log org.apache.commons.logging.LogFactory.getLog(java.lang.Class) (LogFactory.java:655)
        at void org.hyperledger.fabric.gateway.impl.GatewayImpl.<clinit>() (GatewayImpl.java:55)
        at java.util.concurrent.TimeUnit org.hyperledger.fabric.gateway.impl.GatewayImpl.access$000() (GatewayImpl.java:54)
        at void org.hyperledger.fabric.gateway.impl.GatewayImpl$Builder.<init>() (GatewayImpl.java:71)
        at org.hyperledger.fabric.gateway.Gateway$Builder org.hyperledger.fabric.gateway.Gateway.createBuilder() (Gateway.java:87)
        at java.lang.String tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:78)
        at java.lang.Object tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:70)
        at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:333)
        at void java.util.concurrent.FutureTask.run() (FutureTask.java:266)
        at void android.os.AsyncTask$SerialExecutor$1.run() (AsyncTask.java:245)
        at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1167)
        at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:641)
I/icandroidsampl:     at void java.lang.Thread.run() (Thread.java:764)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/data/app/tubs.ibr.fabricandroidsample-48U2GXMv9D0UPIKFDpmpOA==/base.apk"],nativeLibraryDirectories=[/data/app/tubs.ibr.fabricandroidsample-48U2GXMv9D0UPIKFDpmpOA==/lib/x86, /system/lib]]
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup.<clinit>() (JmxRuntimeInputArgumentsLookup.java:35)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.Class) (LoaderUtil.java:185)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.String) (LoaderUtil.java:207)
        at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(java.lang.String, java.lang.Class) (LoaderUtil.java:228)
        at java.lang.Object org.apache.logging.log4j.core.util.Loader.newCheckedInstanceOf(java.lang.String, java.lang.Class) (Loader.java:311)
        at void org.apache.logging.log4j.core.lookup.Interpolator.<init>(java.util.Map) (Interpolator.java:120)
        at void org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(org.apache.logging.log4j.core.LoggerContext, org.apache.logging.log4j.core.config.ConfigurationSource) (AbstractConfiguration.java:129)
        at void org.apache.logging.log4j.core.config.NullConfiguration.<init>() (NullConfiguration.java:32)
        at void org.apache.logging.log4j.core.LoggerContext.<clinit>() (LoggerContext.java:86)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(java.lang.String, java.net.URI) (ClassLoaderContextSelector.java:229)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(java.lang.ClassLoader, java.net.URI) (ClassLoaderContextSelector.java:203)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean, java.net.URI) (ClassLoaderContextSelector.java:128)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean) (ClassLoaderContextSelector.java:115)
        at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:148)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:45)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.LogManager.getContext(java.lang.ClassLoader, boolean) (LogManager.java:194)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(java.lang.Class) (AbstractLoggerAdapter.java:138)
        at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.jcl.LogAdapter.getContext() (LogAdapter.java:39)
        at java.lang.Object org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(java.lang.String) (AbstractLoggerAdapter.java:48)
I/icandroidsampl:     at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.String) (LogFactoryImpl.java:40)
        at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.Class) (LogFactoryImpl.java:55)
        at org.apache.commons.logging.Log org.apache.commons.logging.LogFactory.getLog(java.lang.Class) (LogFactory.java:655)
        at void org.hyperledger.fabric.gateway.impl.GatewayImpl.<clinit>() (GatewayImpl.java:55)
        at java.util.concurrent.TimeUnit org.hyperledger.fabric.gateway.impl.GatewayImpl.access$000() (GatewayImpl.java:54)
        at void org.hyperledger.fabric.gateway.impl.GatewayImpl$Builder.<init>() (GatewayImpl.java:71)
        at org.hyperledger.fabric.gateway.Gateway$Builder org.hyperledger.fabric.gateway.Gateway.createBuilder() (Gateway.java:87)
        at java.lang.String tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:78)
        at java.lang.Object tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:70)
        at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:333)
        at void java.util.concurrent.FutureTask.run() (FutureTask.java:266)
        at void android.os.AsyncTask$SerialExecutor$1.run() (AsyncTask.java:245)
        at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1167)
        at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:641)
        at void java.lang.Thread.run() (Thread.java:764)

Это происходит потому, что java .lang.management.ManagementFactory не включен в Android Runtime.

Итак, я попытался отключить JMX. Нет успеха Та же ошибка. Швы, как системное свойство не находится в «области видимости» библиотеки? Как это возможно?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        System.setProperty("log4j2.disable.jmx","true");

        [...]
    }
[...]
}

Я тоже пробовал это: https://loune.net/2016/05/using-log4j2-2-3-with-android/. Нет успеха Та же ошибка.

Проблема в том, что Log4j используется в используемой мной библиотеке. Поэтому я не ищу способ использовать вход в систему в Android, а способ настроить Log4j в Android, чтобы он не выдавал исключения.

Код на самом деле выполняется, хотя исключения.

1 Ответ

1 голос
/ 26 февраля 2020

Log4j 2 официально не поддерживает Android. Это связано прежде всего с тем, что ни один из коммиттеров Log4j не разрабатывается для Android. Тем не менее, мы будем открыты, чтобы заставить его работать, если у нас есть участники, которые могут помочь заставить его работать и проверять новые выпуски. Я бы посоветовал вам принять участие в списке разработчиков Log4j и предложить любую возможную помощь. Это в основном состоит из сообщений об ошибках, подобных описанной выше, возможной отправки запросов на исправления и тестирования исправлений. С учетом сказанного, из-за ограничений Android мест в классах в JDK, я не могу гарантировать, что все проблемы могут быть решены, но мы будем рады попробовать.

После того, как все что при просмотре текущего кода вы просто должны получить предупреждение о том, что JMX недоступен, и инициализация должна продолжаться. Вы не сказали, с какой версией Log4j вы пробовали, но то, что вы испытывали, не должно быть текущим поведением.

И последнее замечание. При взгляде на трассировку стека выше, рассматриваемый код не зависит от Log4j. Он использует Apache Commons Logging. Предположительно у вас есть jar log4j-jcl в проекте, именно поэтому Log4j принимает участие. Вместо этого вы можете перенаправить вызовы Commons Logging на что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...