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

原因是一个.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;
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值