<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                五、CLASS_ISPREVERIFIED 運行一下Demo,報以下錯誤。(AndroidStudio 2.0 可能不會報錯,需要打包的時候才會出現錯誤,這是Instant run 導致的) ![](https://img.kancloud.cn/8b/5d/8b5deb7fbaeecf430ffc6b7c20a44a0b_1056x393.jpg) dexElements 的length = 2,看來我們的patch_dex 已經成功添加進去了。 但是從黃色框框和黃色框上面那一段log 提示中可以看出,MainActivity 引用了Cat,但是發現他們在不同的Dex 中。 看到這里可能就會問: 為什么之前那么多項目都采用分包方案,但是卻不會出現這個錯誤呢? 我在這里總結了一個過程,想知道詳細分析過程的請看QQ 空間開發團隊的原文。 在apk 安裝的時候,虛擬機會將dex 優化成odex 后才拿去執行。在這個過程中會對所有class 一個校驗。 校驗方式:假設A 該類在它的static 方法,private 方法,構造函數,override方法中直接引用到B 類。如果A 類和B 類在同一個dex 中,那么A 類就會被打上CLASS_ISPREVERIFIED 標記 。 被打上這個標記的類不能引用其他dex 中的類,否則就會報圖中的錯誤在我們的Demo 中,MainActivity 和Cat 本身是在同一個dex 中的,所以MainActivity 被打上了CLASS_ISPREVERIFIED。而我們修復bug 的時候卻引用了另外一個dex 的Cat.class,所以這里就報錯了 。 而普通分包方案則不會出現這個錯誤,因為引用和被引用的兩個類一開始就不在同一個dex 中,所以校驗的時候并不會被打上CLASS_ISPREVERIFIED 。 補充一下第二條:A 類如果還引用了一個C 類,而C 類在其他dex 中,那么A類并不會被打上標記。換句話說,只要在static 方法,構造方法,private 方法,override 方法中直接引用了其他dex 中的類,那么這個類就不會被打上 CLASS_ISPREVERIFIED 標記。 5.1 解決方案 根據上面的第六條,我們只要讓所有類都引用其他dex 中的某個類就可以了。 下面是QQ 控件給出的解決方案 ![](https://img.kancloud.cn/e6/36/e636c4c70294cd2352510e7cd804b8cd_664x320.jpg) 在所有類的構造函數中插入這行代碼System.out.println(AntilazyLoad.class);這樣當安裝apk 的時候,classes.dex 內的類都會引用一個在不相同dex 中的AntilazyLoad 類,這樣就防止了類被打上CLASS_ISPREVERIFIED 的標志了,只要沒被打上這個標志的類都可以進行打補丁操作。 hack.dex 在應用啟動的時候就要先加載出來,不然AntilazyLoad 類會被標記為不存在,即使后面再加載hack.dex,AntilazyLoad 類還是會提示不存在。該類只要一次找不到,那么就會永遠被標上找不到的標記了。 我們一般在Application 中執行dex 的注入操作,所以在Application 的構造中不能加上`System.out.println(AntilazyLoad.class);`這行代碼,因為此時hack.dex 還沒有加載進來,AntilazyLoad 并不存在。 之所以選擇構造函數是因為他不增加方法數,一個類即使沒有顯式的構造函數,也會有一個隱式的默認構造函數。 5.2 插入代碼的難點 1.首先在源碼中手動插入不太可行,hack.dex 此時并沒有加載進來,AntilazyLoad.class 并不存在,編譯不通過。 2.所以我們需要在源碼編譯成字節碼之后,在字節碼中進行插入操作。對字節碼進行操作的框架有很多,但是比較常用的則是ASM 和javaassist 3.但AndroidStudio 是使用Gradle 構建項目,編譯-打包都是自動化的,我們怎么操作呢。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看