原因是一个.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/java frameworks/base/graphics/java frameworks/base/location/java frameworks/base/media/java frameworks/base/media/mca/effect/java frameworks/base/media/mca/filterfw/java frameworks/base/media/mca/filterpacks/java frameworks/base/drm/java frameworks/base/opengl/java frameworks/base/sax/java frameworks/base/telephony/java frameworks/base/wifi/java frameworks/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/java frameworks/base/graphics/java frameworks/base/location/java frameworks/base/media/java frameworks/base/media/mca/effect/java frameworks/base/media/mca/filterfw/java frameworks/base/media/mca/filterpacks/java frameworks/base/drm/java frameworks/base/opengl/java frameworks/base/sax/java frameworks/base/telephony/java frameworks/base/wifi/java frameworks/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;