三方AAR的抗?fàn)?/h2>
背景
公司有一個項目需要用到華為推送,國家和我們普通用戶對應(yīng)用申請的權(quán)限越來越關(guān)注,同時公司內(nèi)部也開始重視自家APP依賴的第三方sdk是否安全以及存在某些潛在隱患。
這時候恰逢華為為了打通任督二脈而強(qiáng)制所有華為應(yīng)用市場的應(yīng)用都必須集成華為服務(wù),那我們之前的華為push因為版本過低,這時候也跟著集成大軍一起升級了。
但是發(fā)現(xiàn)一個問題:華為push SDK內(nèi)一個base的aar依賴了一個隱私權(quán)限(外部存儲權(quán)限)。
外部存儲權(quán)限為啥子是隱私權(quán)限呢,如果一個SDK申明了這種權(quán)限,極有可能就會在某個時機(jī)觸發(fā)某種case,在用戶的外部存儲做很多事情,當(dāng)然這并不是宿主APP期望的。也不該是一個推送SDK該有的。
后來溝通得知,華為是為了下載自家的華為底層服務(wù),檢測用戶設(shè)備上是否具備自家的底層服務(wù),如果沒有就幫用戶下載。因為華為推送依賴這個服務(wù)。
不得不說華為雖然是一代梟雄,但是公司里面并不是每個產(chǎn)品都是梟雄。
歷程
如何解決?
- 項目急著上線
- 隱私權(quán)限公司審核不通過
- 不升級華為推送SDK,我們又不能不升級,不升級華為應(yīng)用市場又不給上。
方案1:重新打包SDK
* 解壓`.aar`文件
* 使用`jd-gui`查看源碼并定位到代碼再修改
* 解壓`.aar`文件解壓后產(chǎn)生的`classes.jar`文件
* 打包源碼為`classes.jar`
* 打包所有文件(`res文件、classes.jar、AndroidManifest.xml`等)為`xxx.aar`
解壓.aar文件命令
`$ unzip HUAWEI***base.aar -d huaweiUNZIP`
使用jd-gui查看源碼并定位到代碼再修改
1. 進(jìn)入`huaweiUNZIP`把里面的`classes.jar`復(fù)制出來
2. 再使用jd-gui(mac版下載地址:[https://github.com/parcool/resources/blob/master/jd-gui-1.4.0.jar](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fparcool%2Fresources%2Fblob%2Fmaster%2Fjd-gui-1.4.0.jar) windows自行下載)打開`classes.jar`找到需要修改的地方,把這個類的代碼copy出來,在android studio中新建項目,把這個`.aar`放到新建`libs`文件夾里再引用它,把之前copy出來的代碼新建一個`.java`后粘貼到里面(注意包名也得一樣,部分報錯的代碼需要手動修改一下。比如:`this`關(guān)鍵字之類的刪掉),改好后build一下,從`/build/intermediates/classes/debug/對應(yīng)包名`找到修改的`.class`文件。
解壓.aar文件解壓后產(chǎn)生的classes.jar文件
1. 解壓`classes.jar`。命令:`$ unzip classes.jar -d huaweiUNZIPClasses`
2. 把第二步生成的`.class`文件放到`tempFolderClasses`文件夾下對應(yīng)的地方替換掉以前的`.class`文件(大功即將告成)
打包源碼為classes.jar
`$ jar cvf newClasses.jar -C huaweiUNZIPClasses/ .`(注意斜杠后面加空格與.)
再把這個`newClasses.jar`放回`huaweiUNZIP`并刪除之前的,修改文件名為`classes.jar`
打包所有文件(res文件、classes.jar、AndroidManifest.xml等)為xxx.aar
`$ jar cvf huaweiSDK.aar -C huaweiUNZIP/ .`