作者goodsheng (恩哈哈)
看板AndroidDev
標題[問題] AS混淆後class不見
時間Wed Sep 13 12:09:42 2017
再出AAR時把混淆開啟後,得到的AAR內確有class都不見的狀況
想再確認下面幾點疑問
1.爬文後知道應該可以從ProGuard設定混淆規則來修改一些類要不要混淆?
2.為什麼class會不見,爬文有看到似乎可能是該class內的code關聯性不高?被混淆優化掉?
需要麻煩各位前輩幫忙 謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.32.32
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AndroidDev/M.1505275785.A.C58.html
1F:→ ssccg: 從要保留的class/method開始找,有被用到的就會加入要保留 09/13 12:53
2F:→ ssccg: 的,到最後都不需要保留的(=沒用的)就刪除 09/13 12:54
3F:→ ssccg: 包library通常是把所有要公開的API設為保留 09/13 12:55
4F:→ goodsheng: 但設保留的為什麼就沒有混淆到呢 09/13 15:34
5F:→ goodsheng: 不太了解。是否設"保留(保護)"就等於"不會混淆"? 09/13 15:47
6F:→ goodsheng: 應該說我最初的用意就是想要混淆,可是得到的結果是 09/13 15:48
7F:→ 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
8F:→ ssccg: 直接指定keep的會被保留且不會混淆,由proguard找到會被用 09/13 17:24
9F:→ ssccg: 到但不是直接指定keep的,就會留下來但會被混淆 09/13 17:24
10F:→ ssccg: 用-dontshrink就會一律保留,但混不混淆還是看keep 09/13 17:27
11F:→ goodsheng: 但一開始我沒有指定keep時,class卻會不見 09/13 17:28
12F:→ ssccg: proguard其實主要是個瘦身工具而不是保護工具 09/13 17:28
13F:→ ssccg: 沒指定keep又沒被別的keep的class用到的當然會不見啊 09/13 17:29
14F:→ ssccg: 留下public member可以寫 { public *; } 09/13 17:30
15F:→ goodsheng: 聊解!!原來是因為"沒被別的keep的class用到"這樣 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