Base64編碼使用commons-codec-1.11.jar,在Android中出現編譯通過,運行崩潰的問題。


前言:

1 在對接加密解密的時候,相同文本Base64編碼后,安卓端與java服務端出現不一樣的密文。

安卓端導入的包是:android.util.Base64

java服務端導入的包是:org.apache.commons.codec.binary.Base64

 

2 果斷使用服務端一樣的jar包 commons-codec-1.11.jar,編譯通過運行卻崩潰了,出現錯誤:java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.<init>

what?一臉懵逼,兩臉懵逼,三臉懵逼???

好吧,經過一頓操作猛如虎的折騰度娘之后,找到原因是:

android 系統 framework 層也使用了org.apache.commons.codec 庫,運行時調用的是 framework 層的庫,根本沒調我們添加到 lib 里的 jar 包。 錯誤應該是 framework 使用的庫對應的 Base64 沒有對應的靜態方法。
 
既如此,那如果我把我添加的jar里面的包名給修改了,在引用修改后的包名,這樣就不會沖突了。
 
 
如何修改jar包里面的包名?
 
1.下載jarjar.jar工具

鏈接:https://pan.baidu.com/s/1VXOII_HKUPGjYioPuMY2jA
提取碼:ceiv

 

2.把jarjar.jar和要修改的jar包(比如:commons-codec-1.11.jar)放在同一目錄下
 
3.新建rule.txt文件(同步驟2放同一目錄下):
  rule.txt有三種指令,分別如下:

    1. rule用來取代Package的名稱。

               rule pattern result 

       2.zap用來移除符合名稱的Package。

           zap pattern

       3.keep只會保留符合的Package的名稱,其他的則會刪除。如果和zap一起使用,將會在zap執行完之后才執行。

                 keep pattern

          備注: pattern為要比對的字串,可以使用「*」和「**」來表示任意的Package名稱。「*」可以代表一層的Package,「**」可以代表多層的Package。

          result為要取代成的字串,可以使用「@1」、「@2」這類的符號表示要使用第幾個pattern的「*」或「**」所代表的字串。

          如果要將Jar包內的「org.apache.commons.codec」名稱全都替換成「changed.org.apache.commons.codec」,可以編寫以下的rules.txt:

     rule pattern result
     zap pattern
     rule org.apache.commons.codec.** changed.org.apache.commons.codec.@1

 

4.打開cmd,輸入以下命令,即可得到一個修改過包名的jar包:

 java -jar jarjar.jar process ./rule.txt commons-codec-1.11.jar ./changed-commons-codec-1.11.jar

   備注:commons-codec-1.11.jar 是想要修改包名的jar包,changed-commons-codec-1.11.jar是修改包名后的jar包

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM