У нас есть большое приложение, которое всегда работает в пределе счета метода ужаса. Меня попросили придумать способ сделать это намного больше, включая поддержку плагинов. Ищете способы разгрузить код, я наткнулся на Советы JNI, в котором говорится
Классы только выгружаются, если все классы, связанные с ClassLoader может быть собрано мусор, что редко, но не будет невозможным в Android.
Это означало, что плагин можно выгрузить, если вы, скажем,
- используйте новый
DexClassLoader
для каждого .jar файла, - только ссылаться на плагин через ссылку на интерфейс, а
- При завершении копирования любых копий этой ссылки интерфейса.
Итак, я создал тестовый пример:
- Я создал несколько тривиальных плагинов, используя для каждого из них уникальный загрузчик.
- Я создал
ReferenceQueue<ClassLoader>
и создал слабые ссылки на мои два загрузчика, используя эту очередь; Я создал/запустил поток, который бесконечно петлиет, делая очередь.remove()
и сообщает. - Я также создал
ReferenceQueue<Class<?>>
и создал слабые ссылки на каждый плагинgetClass()
, используя очередь; Я создал/начал другой поток, контролирующий очередь ссылок класса. - Я создаю тысячу 1000x1000xARGB_8888 растровых изображений, чтобы полностью заставить gc.
Мои потоки мониторинга, похоже, работают - я видел loader2
get gc-ed, когда я использовал loader1
для загрузки обоих плагинов по ошибке;-) - но в остальном мои потоки остаются тихими даже в 4.3. Возможно, мне не хватает чего-то очевидного в этом случае, или это все еще так, что
Dalvik VM в настоящее время не выгружает классы
как сотрудник Google fadden говорит в Android: Когда классы разгружаются системой?