android framework.jar 分包应对trouble writing output: Too many methods: 66641; max is 65536. By package:

来源:互联网 发布:李兴华java视频教程 编辑:程序博客网 时间:2024/05/16 16:14

原因是一个.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.appAs a workaround, split off some packages to a new jar.This will probably need reviewing, the wiggle room left by movingthese 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;

0 0