看板 AndroidDev 關於我們 聯絡資訊
再出AAR時把混淆開啟後,得到的AAR內確有class都不見的狀況 想再確認下面幾點疑問 1.爬文後知道應該可以從ProGuard設定混淆規則來修改一些類要不要混淆? 2.為什麼class會不見,爬文有看到似乎可能是該class內的code關聯性不高?被混淆優化掉? 需要麻煩各位前輩幫忙 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.32.32 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1505275785.A.C58.html
ssccg: 從要保留的class/method開始找,有被用到的就會加入要保留 09/13 12:53
ssccg: 的,到最後都不需要保留的(=沒用的)就刪除 09/13 12:54
ssccg: 包library通常是把所有要公開的API設為保留 09/13 12:55
goodsheng: 但設保留的為什麼就沒有混淆到呢 09/13 15:34
goodsheng: 不太了解。是否設"保留(保護)"就等於"不會混淆"? 09/13 15:47
goodsheng: 應該說我最初的用意就是想要混淆,可是得到的結果是 09/13 15:48
goodsheng: class不見.. 09/13 15:49
謝謝ssccg大,後來聽您說明我試了這個可以混淆且不會不見.. -keep public class com.example.mylibrary.classA{*;} 想再請教如何 在同一class內讓public的method有保護但private的method不保護呢? 關於寫法 ※ 編輯: goodsheng (114.42.32.32), 09/13/2017 17:20:50
ssccg: 直接指定keep的會被保留且不會混淆,由proguard找到會被用 09/13 17:24
ssccg: 到但不是直接指定keep的,就會留下來但會被混淆 09/13 17:24
ssccg: 用-dontshrink就會一律保留,但混不混淆還是看keep 09/13 17:27
goodsheng: 但一開始我沒有指定keep時,class卻會不見 09/13 17:28
ssccg: proguard其實主要是個瘦身工具而不是保護工具 09/13 17:28
ssccg: 沒指定keep又沒被別的keep的class用到的當然會不見啊 09/13 17:29
ssccg: 留下public member可以寫 { public *; } 09/13 17:30
goodsheng: 聊解!!原來是因為"沒被別的keep的class用到"這樣 09/13 17:30
ssccg: 各種用法可以看 https://goo.gl/bpuiMv 09/13 17:30
有試成功了,謝謝ssccg大! -keep public class com.example.mylibrary.classA{ public *;} public int cfunction3() { int var1 = this.a(); byte var2 = 5; return var2; } private int a() { byte var1 = 5; return var1; } 另外剛試了,想額外確認一下。是不是假如這樣定義其實是不太有意義的? -keep public class com.example.mylibrary.classB{ private *;} 因為假如classB內的public method沒被別的class用到的話,那就會不見了。 會造成包成jar後要用時,卻沒辦法給拉public method。自己這樣想不知是否是這樣呢? ※ 編輯: goodsheng (114.42.32.32), 09/13/2017 18:08:06