android framework.jar 分包应对trouble writing output: Too many methods: 66641; max is 65536. By package:
2014-05-16 11:50
316 查看
原因是一个.jar包的函数数量不能超过65536。一.先引用其它人的解决方案,写的比较详细我就省略这一部分。看完这个再看第2部。
frameworks.jar is now hitting the maximum number of member classes (65535), resulting in the build failing with... trouble writing output: Too many methods: 65641; max is 65536. By package: 26 android 145 android.accessibilityservice 700 android.accounts 436 android.animation 8 android.annotation 3787 android.app As a workaround, split off some packages to a new jar. This will probably need reviewing, the wiggle room left by moving these packages is only about 1100 members
./framework/base/Android.mk
@@ -28,10 +28,25 @@ framework_res_source_path := APPS/framework-res_intermediates/src # the library # ============================================================ +# +# These will be included in framework2 to avoid issues with the limit +# on the number of classes/dex +SECONDARY_FRAMEWORKS_SUBDIRS := \ + core/java/android/test \ + core/java/android/gesture \ + core/java/android/speech/srec \ + media/java/android/media/videoeditor \ + media/java/android/media/audiofx \ + media/mca/effect/java/android/media/effect \ + media/mca/effect/java/android/media/effect/effects + include $(CLEAR_VARS) # FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk LOCAL_SRC_FILES := $(call find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS)) +SECONDARY_SRC_FILES := $(call find-other-java-files,$(SECONDARY_FRAMEWORKS_SUBDIRS)) + +LOCAL_SRC_FILES := $(filter-out $(SECONDARY_SRC_FILES),$(LOCAL_SRC_FILES)) # EventLogTags files. LOCAL_SRC_FILES += \ @@ -252,6 +267,7 @@ $(full_classes_compiled_jar): $(framework_res_R_stamp) $(LOCAL_INSTALLED_MODULE): | $(dir $(LOCAL_INSTALLED_MODULE))framework-res.apk framework_built := $(call java-lib-deps,framework) +framework_built += $(call java-lib-deps,framework2) # AIDL files to be preprocessed and included in the SDK, # relative to the root of the build tree. @@ -390,6 +406,7 @@ framework_docs_LOCAL_JAVA_LIBRARIES := \ core \ ext \ framework \ + framework2 \ framework_docs_LOCAL_MODULE_CLASS := JAVA_LIBRARIES framework_docs_LOCAL_DROIDDOC_HTML_DIR := docs/html @@ -664,7 +681,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:=$(framework_docs_LOCAL_SRC_FILES) LOCAL_INTERMEDIATE_SOURCES:=$(framework_docs_LOCAL_INTERMEDIATE_SOURCES) -LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES) framework +LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES) framework framework2 LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS) LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH) LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR) @@ -717,6 +734,26 @@ LOCAL_DX_FLAGS := --core-library include $(BUILD_JAVA_LIBRARY) +include $(CLEAR_VARS) + +# FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk +LOCAL_SRC_FILES := $(call find-other-java-files,$(SECONDARY_FRAMEWORKS_SUBDIRS)) + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := bouncycastle core core-junit ext framework + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := framework2 +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +LOCAL_NO_EMMA_INSTRUMENT := true +LOCAL_NO_EMMA_COMPILE := true + +#LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt + +LOCAL_DX_FLAGS := --core-library + +include $(BUILD_JAVA_LIBRARY) # Include subdirectory makefiles # ============================================================ @@ -726,3 +763,4 @@ include $(BUILD_JAVA_LIBRARY) ifeq (,$(ONE_SHOT_MAKEFILE)) include $(call first-makefiles-under,$(LOCAL_PATH)) endif +
test-runner/Android.mk:
@@ -20,7 +20,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_JAVA_LIBRARIES := core core-junit framework
+LOCAL_JAVA_LIBRARIES := core core-junit framework framework2
LOCAL_MODULE:= android.test.runner二。上面的解决方案只能腾出1000来个函数空间想要继续腾出来?如何疼?关键的地方是
+SECONDARY_FRAMEWORKS_SUBDIRS := \ + core/java/android/test \ + core/java/android/gesture \ + core/java/android/speech/srec \ + media/java/android/media/videoeditor \ + media/java/android/media/audiofx \ + media/mca/effect/java/android/media/effect \ + media/mca/effect/java/android/media/effect/effects
如何找出上面这些路径。
先找出framework.jar的源代码路径。从framework/base/Android.mk可以找到它的源代码路径是:
frameworks/base/core/javaframeworks/base/graphics/javaframeworks/base/location/javaframeworks/base/media/javaframeworks/base/media/mca/effect/javaframeworks/base/media/mca/filterfw/javaframeworks/base/media/mca/filterpacks/javaframeworks/base/drm/javaframeworks/base/opengl/javaframeworks/base/sax/javaframeworks/base/telephony/javaframeworks/base/wifi/javaframeworks/base/keystore/java
那我们在这些路径里面找出一些类,放到framework2.jar里面,这些类的要求是他们不能被framework.jar里面的函数引用,因为framework2.jar比framework.jar后编译。
java源码中使用package xxxx.xxxx.xxxx把类封装,使用import xxxx.xxxx.xxx引用类。
那么我们就使用这俩个思路,在framework.jar的源码路径中找出一些类,这些类不被framework.jar中的其它类引用,再把这些类组成新的framework2.jar。
寻找这些类的办法是:
创建一个temp文件,把上面的路径copy进去,
然后执行 cat temp | xargs grep -rn "package " | grep "android\." | awk '{print $2}' | sort | uniq > package_result
生成了一个文件package_result,这个文件里面包含了framework.jar所有的package包。
再在framework.jar中使用import xxxx.xxxx.xxxx搜索,如果其它的文件都没有引用该类,那么这个类就可以独立出来加到framework2.jar中去。具体方法是:cat temp | xargs grep -rn "import android.filterpacks.numeric"和cat temp | xargs grep -rn "package android.filterpacks.numeric"
生成的文件结果:
文件temp:
frameworks/base/core/javaframeworks/base/graphics/javaframeworks/base/location/javaframeworks/base/media/javaframeworks/base/media/mca/effect/javaframeworks/base/media/mca/filterfw/javaframeworks/base/media/mca/filterpacks/javaframeworks/base/drm/javaframeworks/base/opengl/javaframeworks/base/sax/javaframeworks/base/telephony/javaframeworks/base/wifi/javaframeworks/base/keystore/java
文件package_result:
android.accessibilityservice;android.accounts;android.animation;android.annotation;android.app;android.app.admin;android.app.backup;android.appwidget;android.bluetooth;android.content;android.content.pm;android.content.res;android.database;android.database.sqlite;android.ddm;android.debug;android.drm;android.drm.mobile1;android.emoji;android.filterfw;android.filterfw.core;android.filterfw.format;android.filterfw.geometry;android.filterfw.io;android.filterpacks.base;android.filterpacks.imageproc;android.filterpacks.numeric;android.filterpacks.performance;android.filterpacks.text;android.filterpacks.ui;android.filterpacks.videoproc;android.filterpacks.videosink;android.filterpacks.videosrc;android.gesture;android.graphics;android.graphics.drawable;android.graphics.drawable.shapes;android.hardware;android.hardware.display;android.hardware.input;android.hardware.location;android.hardware.usb;android.inputmethodservice;android.location;android.media;android.media.audiofx;android.media.effect;android.media.effect.effects;android.media.videoeditor;android.mtp;android.net;android.net.arp;android.net.dhcp;android.net.http;android.net.nsd;android.net.wifi;android.net.wifi.p2p;android.net.wifi.p2p.nsd;android.net.wifi.p2p.servicediscovery;android.net.wimax;android.nfc;android.nfc.tech;android.opengl;android.os;android.os.storage;android.preference;android.provider;android.renderscript;android.sax;android.security;android.service.dreams;android.service.notification;android.service.textservice;android.service.wallpaper;android.speech;android.speech.srec;android.speech.tts;android.telephony;android.telephony.cdma;android.telephony.gsm;android.test;android.test.suitebuilder.annotation;android.text;android.text.format;android.text.method;android.text.style;android.text.util;android.util;android.view;android.view.accessibility;android.view.animation;android.view.inputmethod;android.view.textservice;android.webkit;android.widget;com.android.internal.annotations;com.android.internal.app;com.android.internal.appwidget;com.android.internal.backup;com.android.internal.content;com.android.internal.database;com.android.internal.http;com.android.internal.http.multipart;com.android.internal.inputmethod;com.android.internal.location;com.android.internal.logging;com.android.internal.net;com.android.internal.os;com.android.internal.os.storage;com.android.internal.policy;com.android.internal.preference;com.android.internal.statusbar;com.android.internal.telephony;com.android.internal.telephony.msim;com.android.internal.textservice;com.android.internal.util;com.android.internal.view;com.android.internal.view.menu;com.android.internal.widget;com.android.internal.widget.multiwaveview;com.android.server;com.google.android.collect;com.google.android.gles_jni;com.google.android.util;
相关文章推荐
- 编译错误trouble writing output: Too many methods: 65544; max is 65536.
- 关于trouble writing output: Too many methods: xxxxx; max is 65536. By package:
- trouble writing output: Too many methods: 65641; max is 65536. By package:
- trouble writing output: Too many method references: 90356; max is 65536. You may try using --multi-d
- 【exception】Too many methods: 65641; max is 65536. By package:
- Android error Dx trouble writing output:already prepared
- android eclipse中导入framework.jar以及使用其隐藏类的方法
- android系统源码目录system/framework下各个jar包的用途
- com.android.ddmlib.SyncException: Too many open files
- android的framework.jar反编译,并重新编译
- android系统源码目录system/framework下各个jar包的用途
- android framework中调用第三方的jar包
- Dx trouble writing output: already prepared 解决办法
- android系统源码目录system/framework下各个jar包的用途
- 反编译与回编译android的framework.jar(其他jar文件也可参考)
- 关于android系统framework文件夹中jar与odex文件的合并
- android系统源码目录system/framework下各个jar包的用途
- hadoop 之生命在于折腾-----hadoop连接问题(Too many fetch-failures 、map reduce 卡住以及Error reading task outputhttp)
- android系统源码目录system/framework下各个jar包的用途
- android系统源码目录system/framework下各个jar包的用途