您的位置:首页 > 移动开发 > Android开发

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;

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息