Building Apps with Over 65K Methods(解決APP引用方法總數超過65536)

来源:http://www.cnblogs.com/chenkailw/archive/2016/01/04/5099419.html
-Advertisement-
Play Games

本文翻譯自http://developer.android.com/intl/zh-cn/tools/building/multidex.html#about。主要介紹當我們Android App中函數超過65536時構建失敗的原因及解決辦法! ------------------------...


      本文翻譯自http://developer.android.com/intl/zh-cn/tools/building/multidex.html#about。主要介紹當我們Android App中函數超過65536時構建失敗的原因及解決辦法!

   -------------------------分割線--------------------------------------------------

      隨著android platform的持續增長,android apps的大小也在增長。當你的應用程式包括其所引用的庫達到一定的規模,你將遇到構建錯誤,這表明你的程式已經達到到了android 應用框架的限制。在早期的構建系統會報告如下錯誤信息:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

      最近版本的構建系統會顯示不同的錯誤,這是同一個問題的提示信息:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

      這兩種錯誤情況顯示了一個共同的數字:65536。這個數字代表的是單個Dalvik可執行的(DEX)位元組碼文件的可以調用方法總數。如果你已經創建了android應用,並且收到了這個錯誤,那麼恭喜你,你的代碼太多了!本文檔將介紹如何突破這個限制,繼續構建你的app

 About the 65K Reference Limit

      APK文件包含用於運行你的應用程式編譯代碼形式的可執行位元組碼文件(Dalvik Executable DEX)。Dalvik可執行的規範限制了在一個單一的DEX文件中引用到包括Android框架方法,庫方法等方法的總數為65,536。想要突破此限制,您需要配置您的應用程式的構建過程,生成多個DEX文件,被稱為multidex配置。

 Multidex support prior to Android 5.0

      Android5.0之前的版本使用的Dalvik運行時執行應用程式代碼。預設情況下,Dalvik的限制的應用程式,每APK一個classes.dex位元組碼文件。為瞭解決這個限制,可以使用multidex support library,成為您的應用程式的主DEX文件的一部分,然後設法獲得了額外的DEX文件和它們所包含的代碼。

 Multidex support for Android 5.0 and higher

     Android5.0以及更高版本使用的是ART runtime,可以支持原生從APK文件中載入多個dex文件。ART進行預編譯的應用程式安裝時它會掃描類(.. N.dex文件,並通過Android設備編譯成一個單一的.oat文件執行。對於在Android5.0運行時的詳細信息,請參考 Introducing ART

 Avoiding the 65K Limit

     在配置您的應用程式能夠使用65K+方法個數之前,您應該採取措施來減少您的應用程式代碼調用引用的總數,包括您的應用程式代碼中的方法和庫定義的方法。以下策略可以幫助您避免超過DEX參考限值:

     看您的應用程式的直接和間接性依賴:確保在你的app中包含的library的用途要和其代碼量匹配。一個比較常見的反例就是包含巨大的代碼量,用途卻很小。減少你的applibrary依賴往往可以幫你避免dex reference限制。

     刪除未使用的代碼混淆(code with ProGuard配置可以運行你的appProGuard並確保可以在正式構建程式的時候為你的程式瘦身。 

     使用這些技術可以幫助你避免更改程式構建配置時需要啟用更多的方法引用。對於寬頻成本很高的市場來說,這些步驟很重要。

 Configuring Your App for Multidex with Gradle

      Android插件Gradle Android SDK Build Tools 21.1和更高版本中支持multidex作為構建配置的一部分。在為你app配置multidex之前,請先使用SDK ManagerAndroid SDKBuild Tools Android Support Repository更新到最新版本。

      在你的app中使用multidex配置之前,需要對你的程式開發做一些相應修改。你需要執行以下步驟:

      1.修改你的 Gradle構建配置以啟用multidex

      2.修改你的AndroidManifest 去引用MultiDexApplication class。

修改build.gradle配置去引用support library和啟用multidex輸出,如以下所示build.gradle片段

 

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

 

      Note:你可以在build.gradle文件的defaultConfig,buildType,或者productFlavor中設置multiDexEnable。

      在你的AndroidManifestapplication元素中添加MultiDexApplication class:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

      當這些配置添加到一個應用程式中,Android構建工具會構建一個dex(classes.dex),根據需要會繼續構建(classes2.dex, classes3.dex)。然後構建系統將他們打包進同一個apk中。

      Note: 如果你的app使用了自己定義的Application class,你可以重寫attachBaseContext()方法併在其中調用MultiDex.install(this)去實現multidex。更多信息請參考MultiDexApplication 

 Limitations of the multidex support library

      你應該意識到multidex support library有一些已知的限制,所以當你在將他合併到你的應用程式中時需要測試一下:

      1..dex文件的安裝在啟動設備的數據分區很複雜,如果二級dex文件太大可能導致程式沒有響應(ANR)。在這種情況下,您應與混淆器(ProGuard)應用代碼縮減技術,減少.dex文件的大小和刪除未使用的部分代碼。

      2.程式不能在在早已Android4.0API level 14)之前的版本上使用multidex由於a Dalvik linearAlloc bugIssue 22586)(http://b.android.com/22586)如果你使用API Level 14之前的版本,確保執行您的應用程式在啟動時或者裝載特定的類時,測試你的程式是否會出現問題。代碼縮減可以消除這些潛在問題。

      3.應用程式使用multidex配置會發出非常大的記憶體分配請求,這可能會導致運行時崩潰,由於a Dalvik linearAlloc bugIssue 78035)(http://b.android.com/78035)。

      4.Dalvik runtime執行時the primary dex文件可能需要複雜的請求。Android build tooling 更新處理Android需求,但是其他included libraries可能有額外的依賴需要,包括調用本地的java代碼。一些library可能無法使用,直到multidex build tools更新後允許您指定必須包含在主dex文件的類。 

 Optimizing Multidex Development Builds

      multidex配置需要顯著增加構建處理時間,因為構建系統必須做出複雜決定,來確定哪些類必須包含在主dex文件以及哪些類可以包含在第二級dex文件中。這意味著常規構建執行與multidex作為開發過程的一部分,通常需要更長的時間,這可能減緩你的程式開發進度。

      為了減少multidex輸出構建時間,你應該創建兩個變數來使用Android構建輸出插件Gradle productFlavors: a development flavor and a production flavor

a development flavor,設定一個最低21SDK版本。這個設置生成multidex輸出比使用ART-supported格式要快得多。the release flavor,設定一個最低SDK版本匹配你的項目最低支持版本。這個設置生成一個multidex APK,與更多的設備相容,但需要更長的時間來構建。

      以下構建配置示例演示瞭如何在Gradle構建文件設置這些 flavors :

android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
View Code

      完成了這個配置更改後,您可以使用與appdevDebug變數相結合的屬性dev productFlavordebug buildType。利用這個去創建一個minSdkVersionAndroid API Level 21不使用proguard,啟用multidexdebug app 。這些設置使Android gradle插件執行以下操作:

     1.構建應用程式的每個模塊(包括依賴庫)作為單獨的dex文件。這通常被稱為pre-dexing

     2.包括每個dex文件沒有修改APK文件

     3.最重要的是,dex的模塊文件不會被結合,所以可以避免來確定主dex文件內容的長時間運行的計算。

      這些設置導致快速、增量構建,因為只有dex文件修改模塊的會重新計算,重新包裝成APK文件。這些設置構建APK只能用於測試Android 5.0及以上設備。然而,通過實現配置的flavors,你能夠執行正常構建release-appropriate最低SDKproguard設置

還可以建立其他變數,包括構建prodDebug變數,這需要更長的時間來構建,但可以用於測試外的開發。如果你從命令行執行gradle任務,您可以使用標準命令在結束的位置附加DevDebug(./ gradlew installDevDebug) 

      關於使用flavorsGradle任務的更多信息,參考Gradle Plugin User Guidehttp://tools.android.com/tech-docs/new-build-system/user-guide

      Tip您也可以提供一個自定義清單,或者為每個flavor自定義一個應用程式類,允許你在變數需要的時候使用MultiDexApplication應用程式類庫或者調用 MultiDex.install()    

 Using Build Variants in Android Studio

      Build variants對管理multidex構建過程是非常有用的,Android Studio可以使用可視化操作來選擇這些變數。

      1.打開位於 left-sidebarBuild Variants 視窗(一般是在Android studio的左下)

      2.點擊Build Variants的名稱來選擇不同的變數,,如圖1所示

 

 

 

 

 

 

 

 

 

 Testing Multidex Apps

      當multidex應用程式中使用instrumentation tests,需要進行額外的配置。因為代碼在multidex應用程式中不是位於單一DEX文件。所以instrumentation tests能正常運行,除非程式為multidex配置

      為了使用instrumentation tests測試multidex app,需要配置MultiDexTestRunner

      下麵build.gradle文件演示瞭如何配置來使用這個測試運行器: 

android {
  defaultConfig {
      ...
      testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
  }
}

     Note: With Android Plugin for Gradle versions lower than 1.1, you need to add the following dependency for multidex-instrumentation:

dependencies {
    androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
         exclude group: 'com.android.support', module: 'multidex'
    }       
}

     你可以用instrumentation tests runner class直接或擴展它來適應您的測試需求。或者,您可以在現有的instrumentation中覆蓋onCreate

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

     Note: Use of multidex for creating a test APK is not currently supported.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、壓縮資料庫dbcc shrinkdatabase(dbname)2、轉移資料庫給新用戶已存在用戶許可權exec sp_change_users_login'update_one','newgame','oldname'go3、檢查備份集RESTORE VERIFYONLY from disk='E...
  • 又是想到什麼寫什麼系列……上次http://www.cnblogs.com/Gin-23333/p/5096638.html 寫了一下,今天補充點其它的1、在事務裡面的影響,臨時表可以被回滾 而表變數是不能回滾的。簡單的例子DECLARE @T AS TABLE(ID INT,Name NVARCH...
  • 不行,基本一重啟就不能再次訪問了,每次都要查問題,可以放棄Oracle麽,太垃圾了。1.操作系統版本用於安裝資料庫的操作系統鏡像文件名為:cn_windows_server_2012_r2_vl_with_update_x64_dvd_6052729.iso安裝DataCenter(帶GUI)版本虛...
  • 總結 View的z值由兩部分組成,elevation和translationZ. eleavation是靜態的成員,translationZ是用來做動畫。 Z = elevation + translationZ 在佈局中使用 android:elevation屬性去定義 在代碼中使用 View.s...
  • 看完過後,你會學到:1學習IOS開發中的分類實現,2以及類方法的書寫,3以及字元串的MD5加密/解密.---------------------------wolfhous------------------[1]新建工程,新建分類[2]分類的命名方式以及類的選擇[3]書寫NSString分類的類方...
  • 1、錯誤代碼:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s)build 這個target的時候命令行報錯。可以在 build setting 中,...
  • 在上一節中,我們通過探討應用的系統設置的基本功能,瞭解運用bundle捆綁包以及plist文件的基本開發。用戶能夠使用設置應用來聲明他們的偏好設置,那麼我們怎樣去調用用戶所設置的參數呢,上節我們只創建了Setting.bundle捆綁包,在這個基礎上,這一節,我們將繼續討論,關於如何讀取應用中...
  • ViewPager類來自於支持庫。與fragment類不同,ViewPager只存在於支持庫中。而且,可以預見,即使在SDK的後續版本中,並不存在標準的ViewPager類。 《...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...