Android分包的最简单方式

诚信合作 7年前
   <h3>前言</h3>    <ul>     <li>世上本来没有分包,写的代码多了,便有了分包。</li>     <li>相信你肯定在项目中遇到过下面的问题:point_down: <pre>  <code class="language-java">Conversion to Dalvik format failed:Unable to execute dex: method  ID not in [0, 0xffff]: 65536</code></pre> </li>     <li>或者这样:point_down: <pre>  <code class="language-java">trouble writing output:Too many field references: 131000; max is     65536.You may try using --multi-dex option.</code></pre> </li>     <li>这两种问题出现的原因都是因为你的项目中的方法数超过65536。前者出现在低版本的手机中,后者出现在较高的版本之中。这里的版本以5.0来区分。</li>    </ul>    <h3>如何解决</h3>    <ul>     <li>开源的Android引发了一股技术狂潮,各种开源项目层出不穷,在分包的实现上也是拥有多个框架,其中不乏一些大公司提供的。但是,我们还是使用google官方提供的方式比较方便。</li>     <li>如果你的minSdkVersion设置成21及更高,你只需要在build.gradle设置multiDexEnabled为true就可以了: <pre>  <code class="language-java">android {        defaultConfig {            ...              minSdkVersion 21              targetSdkVersion 25              **multiDexEnabled true**       }    ...  }</code></pre> </li>     <li>如果你的minSdkVersion设置成20及以下,除了上述步骤外你还需要添加依赖库并进行相关配置:      <ul>       <li>引入依赖库 <pre>  <code class="language-java">android {        defaultConfig {            ...             minSdkVersion 15             targetSdkVersion 25            **multiDexEnabled true**        }        ...  }  dependencies {      **compile 'com.android.support:multidex:1.0.1'**  }</code></pre> </li>       <li>配置方式一        <ul>         <li>先在manifest中设置MultiDexApplication为启动的MultiDexApplication <pre>  <code class="language-java"><?xml version="1.0" encoding="utf-8"?>  <manifest   xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.myapp">        <application                       **android:name="android.support.multidex.MultiDexApplication"** >            ...        </application>  </manifest></code></pre> </li>         <li>然后将自以的application继承自MultiDexApplication <pre>  <code class="language-java">public class MyApplication extends MultiDexApplication { ... }</code></pre> </li>        </ul> </li>       <li>配置方式二 <pre>  <code class="language-java">public class MyApplication extends SomeOtherApplication {          @Override      protected void attachBaseContext(Context base) {                      super.attachBaseContext(context);           Multidex.install(this);    }}</code></pre> </li>      </ul> </li>     <li>上述配置方式一和配置方式二任选其一就可以了,这里还有个小细节,区分分包方式的是minSdkVersion而不是targetSdkVersion,博主刚开始的时候以为是targetSdkVersion,等到出现问题的时候,一直觉得google实在欺骗我的感情,后来查看官方文档才发现原来是自己没搞清。</li>    </ul>    <h3>结尾</h3>    <ul>     <li>做完上述配置后,就可以愉快的分包了,是不是很简单吖!!</li>     <li>最后贴出google官方关于分包的介绍,当然了,你需要KX上网。</li>     <li>Configure Apps with Over 64K Methods</li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/74445c9d52d1</p>    <p> </p>