├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── sample │ │ ├── App.java │ │ └── MainActivity.java │ ├── res │ ├── layout │ │ └── activity_main.xml │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ ├── values-w820dp │ │ └── dimens.xml │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── resources │ ├── classes2.dex │ └── classes3.dex ├── build.gradle ├── dexlibrary ├── .gitignore ├── build.gradle ├── classes.jar ├── classes3.dex ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ ├── alibaba │ └── fastjson │ │ ├── JSON.java │ │ ├── JSONArray.java │ │ ├── JSONAware.java │ │ ├── JSONException.java │ │ ├── JSONObject.java │ │ ├── JSONReader.java │ │ ├── JSONStreamAware.java │ │ ├── JSONStreamContext.java │ │ ├── JSONWriter.java │ │ ├── TypeReference.java │ │ ├── annotation │ │ ├── JSONCreator.java │ │ ├── JSONField.java │ │ └── JSONType.java │ │ ├── parser │ │ ├── AbstractJSONParser.java │ │ ├── DefaultJSONParser.java │ │ ├── Feature.java │ │ ├── JSONLexer.java │ │ ├── JSONLexerBase.java │ │ ├── JSONReaderScanner.java │ │ ├── JSONScanner.java │ │ ├── JSONToken.java │ │ ├── ParseContext.java │ │ ├── ParserConfig.java │ │ ├── SymbolTable.java │ │ └── deserializer │ │ │ ├── AbstractDateDeserializer.java │ │ │ ├── ArrayDeserializer.java │ │ │ ├── ArrayListTypeFieldDeserializer.java │ │ │ ├── BooleanFieldDeserializer.java │ │ │ ├── CharArrayDeserializer.java │ │ │ ├── ClassDerializer.java │ │ │ ├── CollectionDeserializer.java │ │ │ ├── CollectionResolveFieldDeserializer.java │ │ │ ├── DateDeserializer.java │ │ │ ├── DateFormatDeserializer.java │ │ │ ├── DefaultFieldDeserializer.java │ │ │ ├── EnumDeserializer.java │ │ │ ├── ExtraProcessor.java │ │ │ ├── ExtraTypeProvider.java │ │ │ ├── FieldDeserializer.java │ │ │ ├── IntegerFieldDeserializer.java │ │ │ ├── JSONArrayDeserializer.java │ │ │ ├── JSONObjectDeserializer.java │ │ │ ├── JavaBeanDeserializer.java │ │ │ ├── JavaObjectDeserializer.java │ │ │ ├── ListResolveFieldDeserializer.java │ │ │ ├── LongFieldDeserializer.java │ │ │ ├── MapDeserializer.java │ │ │ ├── MapResolveFieldDeserializer.java │ │ │ ├── NumberDeserializer.java │ │ │ ├── ObjectDeserializer.java │ │ │ ├── ParseProcess.java │ │ │ ├── SqlDateDeserializer.java │ │ │ ├── StackTraceElementDeserializer.java │ │ │ ├── StringFieldDeserializer.java │ │ │ ├── ThrowableDeserializer.java │ │ │ ├── TimeDeserializer.java │ │ │ └── TimestampDeserializer.java │ │ ├── serializer │ │ ├── AfterFilter.java │ │ ├── ArraySerializer.java │ │ ├── BeforeFilter.java │ │ ├── BigDecimalCodec.java │ │ ├── BigIntegerCodec.java │ │ ├── BooleanArraySerializer.java │ │ ├── BooleanCodec.java │ │ ├── ByteArraySerializer.java │ │ ├── CalendarCodec.java │ │ ├── CharArraySerializer.java │ │ ├── CharacterCodec.java │ │ ├── CharsetCodec.java │ │ ├── ClassSerializer.java │ │ ├── CollectionSerializer.java │ │ ├── CurrencyCodec.java │ │ ├── DateFormatSerializer.java │ │ ├── DateSerializer.java │ │ ├── DoubleArraySerializer.java │ │ ├── DoubleSerializer.java │ │ ├── EnumSerializer.java │ │ ├── EnumerationSeriliazer.java │ │ ├── ExceptionSerializer.java │ │ ├── FieldSerializer.java │ │ ├── FilterUtils.java │ │ ├── FloatArraySerializer.java │ │ ├── FloatCodec.java │ │ ├── InetAddressCodec.java │ │ ├── InetSocketAddressCodec.java │ │ ├── IntArraySerializer.java │ │ ├── IntegerCodec.java │ │ ├── JSONAwareSerializer.java │ │ ├── JSONLibDataFormatSerializer.java │ │ ├── JSONSerializable.java │ │ ├── JSONSerializableSerializer.java │ │ ├── JSONSerializer.java │ │ ├── JSONSerializerContext.java │ │ ├── JSONStreamAwareSerializer.java │ │ ├── JavaBeanSerializer.java │ │ ├── ListSerializer.java │ │ ├── LocaleCodec.java │ │ ├── LongArraySerializer.java │ │ ├── LongCodec.java │ │ ├── MapSerializer.java │ │ ├── NameFilter.java │ │ ├── NumberFieldSerializer.java │ │ ├── ObjectArraySerializer.java │ │ ├── ObjectFieldSerializer.java │ │ ├── ObjectSerializer.java │ │ ├── PascalNameFilter.java │ │ ├── PatternCodec.java │ │ ├── PropertyFilter.java │ │ ├── PropertyPreFilter.java │ │ ├── SerialContext.java │ │ ├── SerializeConfig.java │ │ ├── SerializeFilter.java │ │ ├── SerializeWriter.java │ │ ├── SerializerFeature.java │ │ ├── ShortArraySerializer.java │ │ ├── SimpleDateFormatSerializer.java │ │ ├── SimplePropertyPreFilter.java │ │ ├── StringCodec.java │ │ ├── TimeZoneCodec.java │ │ ├── URICodec.java │ │ ├── URLCodec.java │ │ ├── UUIDCodec.java │ │ └── ValueFilter.java │ │ └── util │ │ ├── Base64.java │ │ ├── DeserializeBeanInfo.java │ │ ├── FieldInfo.java │ │ ├── IOUtils.java │ │ ├── IdentityHashMap.java │ │ ├── ParameterizedTypeImpl.java │ │ └── TypeUtils.java │ └── sample │ └── Core.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── cpp │ ├── CMakeLists.txt │ ├── include │ │ └── log.h │ └── multidex.c │ └── java │ └── com │ └── android │ └── quickmultidex │ ├── IncrementalClassLoader.java │ └── Multidex.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuickMultidex 2 | 一种在Dalvik虚拟机上多Dex首次加载的优化方案,支持4.1~4.4 3 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | buildToolsVersion "28.0.3" 6 | defaultConfig { 7 | applicationId "com.vdian.android.sample" 8 | minSdkVersion 14 9 | targetSdkVersion 23 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | ndk { 14 | abiFilters 'armeabi', 'x86' 15 | } 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | 23 | } 24 | 25 | } 26 | 27 | dependencies { 28 | compile fileTree(include: ['*.jar'], dir: 'libs') 29 | compile 'com.android.support:appcompat-v7:23.0.1' 30 | compile project(':library') 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/lizhangqu/AndroidSDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/sample/App.java: -------------------------------------------------------------------------------- 1 | package com.sample; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.android.quickmultidex.Multidex; 7 | 8 | 9 | /** 10 | * @version V1.0 11 | * @author: lizhangqu 12 | * @date: 2016-11-25 20:59 13 | */ 14 | public class App extends Application { 15 | 16 | @Override 17 | protected final void attachBaseContext(Context context) { 18 | super.attachBaseContext(context); 19 | boolean install = Multidex.install(context); 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/sample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.sample; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.view.View; 7 | import android.widget.Button; 8 | 9 | 10 | 11 | import java.lang.reflect.Method; 12 | 13 | public class MainActivity extends AppCompatActivity { 14 | 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_main); 20 | 21 | 22 | try { 23 | Class hello = Class.forName("Hello"); 24 | Method main = hello.getDeclaredMethod("main", String[].class); 25 | main.setAccessible(true); 26 | Log.e("TAG", "method:" + main); 27 | Object args = new String[]{"a", "b", "c"}; 28 | main.invoke(null, args); 29 | } catch (Throwable e) { 30 | e.printStackTrace(); 31 | } 32 | 33 | Button btn = (Button) findViewById(R.id.btn); 34 | btn.setOnClickListener(new View.OnClickListener() { 35 | @Override 36 | public void onClick(View v) { 37 | //以下代码在4.4上如果不调用 dexOrJar->pRawDexFile->pDvmDex->dex_object = dex_object; 会奔溃 38 | try { 39 | Class hello = Class.forName("com.sample.Core"); 40 | Method parse = hello.getDeclaredMethod("parse"); 41 | parse.setAccessible(true); 42 | Log.e("TAG", "method:" + parse); 43 | parse.invoke(null); 44 | } catch (Throwable e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | }); 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 |