├── AndroidProguard ├── MyProguard.jar ├── README.md ├── resources └── META-INF │ └── plugin.xml └── src └── com └── peng └── proguard ├── ProguardGenerate.java ├── ProguardSetting.java └── Setting.java /AndroidProguard: -------------------------------------------------------------------------------- 1 | #-------------------------------------------自定义区域---------------------------------------------- 2 | #---------------------------------1.解析相关实体类--------------------------------- 3 | FastJson或者Gson解析的实体类 4 | 5 | 6 | 7 | 8 | 9 | #---------------------------------2.与js互相调用的类------------------------ 10 | -keepattributes *JavascriptInterface* 11 | 12 | #eg:如果你在WebViewActivity定义一个和Js交互的接口JsCallback,那么可以按照下面的格式写 13 | #-keepclassmembers class cn.xx.xx.WebViewActivity$JsCallback { 14 | # public *; 15 | #} 16 | 17 | 18 | 19 | 20 | 21 | #---------------------------------3.自定义View的类---------------------------- 22 | 23 | 24 | 25 | #---------------------------------4.反射相关的类和方法----------------------- 26 | 检查一下有没有通过类名反射的类和方法,否则混淆后,将无法操作 27 | 28 | 29 | 30 | 31 | 32 | #---------------------------------5.第三方包------------------------------- 33 | #如果报The same input jar is specified twice异常,把-libraryjars注释掉,在AndroidStudio可以不需要,直接对jar里面的类进行混淆操作 34 | #-libraryjars libs/xxxxxxx.jar 35 | 36 | 37 | 38 | 39 | 40 | #-------------------------------------------基本不用动区域-------------------------------------------- 41 | #---------------------------------基本指令区---------------------------------- 42 | -optimizationpasses 5 43 | -dontskipnonpubliclibraryclassmembers 44 | -printmapping proguardMapping.txt 45 | -optimizations !code/simplification/cast,!field/*,!class/merging/* 46 | -keepattributes *Annotation*,InnerClasses 47 | -keepattributes Signature 48 | -keepattributes SourceFile,LineNumberTable 49 | 50 | 51 | #----------------------------手动启用support keep注解------------------------ 52 | -dontskipnonpubliclibraryclassmembers 53 | -printconfiguration 54 | -keep,allowobfuscation @interface android.support.annotation.Keep 55 | -keep @android.support.annotation.Keep class * 56 | -keepclassmembers class * { 57 | @android.support.annotation.Keep *; 58 | } 59 | 60 | 61 | 62 | #---------------------------------默认保留区--------------------------------- 63 | -keep public class * extends android.app.Activity 64 | -keep public class * extends android.app.Application 65 | -keep public class * extends android.support.multidex.MultiDexApplication 66 | -keep public class * extends android.app.Service 67 | -keep public class * extends android.content.BroadcastReceiver 68 | -keep public class * extends android.content.ContentProvider 69 | -keep public class * extends android.app.backup.BackupAgentHelper 70 | -keep public class * extends android.preference.Preference 71 | -keep public class * extends android.view.View 72 | -keep public class com.android.vending.licensing.ILicensingService 73 | -keep class android.support.** {*;} 74 | 75 | -keep public class * extends android.view.View{ 76 | *** get*(); 77 | void set*(***); 78 | public (android.content.Context); 79 | public (android.content.Context, android.util.AttributeSet); 80 | public (android.content.Context, android.util.AttributeSet, int); 81 | } 82 | -keepclasseswithmembers class * { 83 | public (android.content.Context, android.util.AttributeSet); 84 | public (android.content.Context, android.util.AttributeSet, int); 85 | } 86 | #这个主要是在layout 中写的onclick方法android:onclick="onClick",不进行混淆 87 | -keepclassmembers class * extends android.app.Activity { 88 | public void *(android.view.View); 89 | } 90 | 91 | -keepclassmembers class * implements java.io.Serializable { 92 | static final long serialVersionUID; 93 | private static final java.io.ObjectStreamField[] serialPersistentFields; 94 | private void writeObject(java.io.ObjectOutputStream); 95 | private void readObject(java.io.ObjectInputStream); 96 | java.lang.Object writeReplace(); 97 | java.lang.Object readResolve(); 98 | } 99 | -keep class **.R$* { 100 | *; 101 | } 102 | 103 | -keepclassmembers class * { 104 | void *(*Event); 105 | } 106 | 107 | -keepclassmembers enum * { 108 | public static **[] values(); 109 | public static ** valueOf(java.lang.String); 110 | } 111 | -keep class * implements android.os.Parcelable { 112 | public static final android.os.Parcelable$Creator *; 113 | } 114 | #// natvie 方法不混淆 115 | -keepclasseswithmembernames class * { 116 | native ; 117 | } 118 | 119 | #保持 Parcelable 不被混淆 120 | -keep class * implements android.os.Parcelable { 121 | public static final android.os.Parcelable$Creator *; 122 | } 123 | 124 | 125 | 126 | #---------------------------------webview------------------------------------ 127 | -keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *; } 128 | -keepclassmembers class * extends android.webkit.WebViewClient { 129 | public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); 130 | public boolean *(android.webkit.WebView, java.lang.String); 131 | } 132 | 133 | -keepclassmembers class * extends android.webkit.WebViewClient { 134 | public void *(android.webkit.WebView, jav.lang.String); 135 | } 136 | 137 | 138 | -------------------------------------------------------------目前支持的开源库------------------------------------------------ 139 | #================支付宝支付 140 | -keep class com.alipay.android.app.IAlixPay{*;} 141 | -keep class com.alipay.android.app.IAlixPay$Stub{*;} 142 | -keep class com.alipay.android.app.IRemoteServiceCallback{*;} 143 | -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} 144 | -keep class com.alipay.sdk.app.PayTask{ public *;} 145 | -keep class com.alipay.sdk.app.AuthTask{ public *;} 146 | -keep public class * extends android.os.IInterface 147 | #================微信支付 148 | -keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;} 149 | -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;} 150 | -keep class com.tencent.wxop.** { *; } 151 | -dontwarn com.tencent.mm.** 152 | -keep class com.tencent.mm.**{*;} 153 | 154 | -keep class sun.misc.Unsafe { *; } 155 | 156 | -keep class com.taobao.** {*;} 157 | -keep class com.alibaba.** {*;} 158 | -keep class com.alipay.** {*;} 159 | -dontwarn com.taobao.** 160 | -dontwarn com.alibaba.** 161 | -dontwarn com.alipay.** 162 | 163 | -keep class com.ut.** {*;} 164 | -dontwarn com.ut.** 165 | 166 | -keep class com.ta.** {*;} 167 | -dontwarn com.ta.** 168 | 169 | -keep class anet.**{*;} 170 | -keep class org.android.spdy.**{*;} 171 | -keep class org.android.agoo.**{*;} 172 | -dontwarn anet.** 173 | -dontwarn org.android.spdy.** 174 | -dontwarn org.android.agoo.** 175 | 176 | -keepclasseswithmembernames class com.xiaomi.**{*;} 177 | -keep public class * extends com.xiaomi.mipush.sdk.PushMessageReceiver 178 | 179 | -dontwarn com.xiaomi.push.service.b 180 | 181 | -keep class org.apache.http.** 182 | -keep interface org.apache.http.** 183 | -dontwarn org.apache.** 184 | 185 | #===================================okhttp3.x 186 | -dontwarn com.squareup.okhttp3.** 187 | -keep class com.squareup.okhttp3.** { *;} 188 | -dontwarn okio.** 189 | #===================================sharesdk 190 | -keep class cn.sharesdk.**{*;} 191 | -keep class com.sina.**{*;} 192 | -keep class **.R$* {*;} 193 | -keep class **.R{*;} 194 | 195 | -keep class com.mob.**{*;} 196 | -dontwarn com.mob.** 197 | -dontwarn cn.sharesdk.** 198 | -dontwarn **.R$* 199 | 200 | #=========================nineoldandroids-2.4.0.jar 201 | -keep public class com.nineoldandroids.** {*;} 202 | 203 | #============================zxing 204 | -keep class com.google.zxing.** {*;} 205 | -dontwarn com.google.zxing.** 206 | #=============================百度定位 207 | -keep class com.baidu.** {*;} 208 | -keep class vi.com.** {*;} 209 | -dontwarn com.baidu.** 210 | 211 | #=====================================okhttp 212 | -dontwarn com.squareup.okhttp.** 213 | -keep class com.squareup.okhttp.{*;} 214 | #retrofit 215 | -dontwarn retrofit.** 216 | -keep class retrofit.** { *; } 217 | -keepattributes Signature 218 | -keepattributes Exceptions 219 | -dontwarn okio.** 220 | 221 | #========================recyclerview-animators 222 | -keep class jp.wasabeef.** {*;} 223 | -dontwarn jp.wasabeef.* 224 | 225 | #============================universal-image-loader 混淆 226 | -dontwarn com.nostra13.universalimageloader.** 227 | -keep class com.nostra13.universalimageloader.** { *; } 228 | 229 | #===============================ormlite 230 | -keep class com.j256.** 231 | -keepclassmembers class com.j256.** { *; } 232 | -keep enum com.j256.** 233 | -keepclassmembers enum com.j256.** { *; } 234 | -keep interface com.j256.** 235 | -keepclassmembers interface com.j256.** { *; } 236 | #umeng 237 | #===================================友盟 238 | -dontshrink 239 | -dontoptimize 240 | -dontwarn com.google.android.maps.** 241 | -dontwarn android.webkit.WebView 242 | -dontwarn com.umeng.** 243 | -dontwarn com.tencent.weibo.sdk.** 244 | -dontwarn com.facebook.** 245 | 246 | 247 | -keep enum com.facebook.** 248 | -keepattributes Exceptions,InnerClasses,Signature 249 | -keepattributes *Annotation* 250 | -keepattributes SourceFile,LineNumberTable 251 | 252 | -keep public interface com.facebook.** 253 | -keep public interface com.tencent.** 254 | -keep public interface com.umeng.socialize.** 255 | -keep public interface com.umeng.socialize.sensor.** 256 | -keep public interface com.umeng.scrshot.** 257 | 258 | -keep public class com.umeng.socialize.* {*;} 259 | -keep public class javax.** 260 | -keep public class android.webkit.** 261 | 262 | -keep class com.facebook.** 263 | -keep class com.umeng.scrshot.** 264 | -keep public class com.tencent.** {*;} 265 | -keep class com.umeng.socialize.sensor.** 266 | 267 | -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;} 268 | 269 | -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;} 270 | 271 | -keep class im.yixin.sdk.api.YXMessage {*;} 272 | -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;} 273 | 274 | -keep public class com.android.ljywp.R$*{ 275 | public static final int *; 276 | } 277 | -keepclassmembers class * { 278 | public (org.json.JSONObject); 279 | } 280 | -keepclassmembers enum * { 281 | public static **[] values(); 282 | public static ** valueOf(java.lang.String); 283 | } 284 | 285 | #===============================友盟自动更新 286 | -keep public class com.umeng.fb.ui.ThreadView { 287 | } 288 | -keep public class * extends com.umeng.** 289 | # 以下包不进行过滤 290 | -keep class com.umeng.** { *; } 291 | 292 | 293 | #========================================ButterKnife 7.0 294 | -keep class butterknife.** { *; } 295 | -dontwarn butterknife.internal.** 296 | -keep class **$$ViewBinder { *; } 297 | -keepclasseswithmembernames class * { 298 | @butterknife.* ; 299 | } 300 | -keepclasseswithmembernames class * { 301 | @butterknife.* ; 302 | } 303 | 304 | 305 | #========================================AndFix 306 | -keep class * extends java.lang.annotation.Annotation 307 | -keepclasseswithmembernames class * { 308 | native ; 309 | } 310 | 311 | #===========================================eventbus 3.0 312 | -keepattributes *Annotation* 313 | -keepclassmembers class ** { 314 | @org.greenrobot.eventbus.Subscribe ; 315 | } 316 | -keep enum org.greenrobot.eventbus.ThreadMode { *; } 317 | -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { 318 | (java.lang.Throwable); 319 | } 320 | -libraryjars libs/pksdk.jar 321 | 322 | 323 | #============================================EventBus 324 | -keepclassmembers class ** { 325 | public void onEvent*(**); 326 | } 327 | -keepclassmembers class ** { 328 | public void xxxxxx(**); 329 | } 330 | 331 | 332 | #==========================================gson 333 | -keep class com.google.gson.** {*;} 334 | -keep class com.google.**{*;} 335 | -keep class sun.misc.Unsafe { *; } 336 | -keep class com.google.gson.stream.** { *; } 337 | -keep class com.google.gson.examples.android.model.** { *; } 338 | 339 | -keepclassmembers class * implements java.io.Serializable { 340 | static final long serialVersionUID; 341 | private static final java.io.ObjectStreamField[] serialPersistentFields; 342 | private void writeObject(java.io.ObjectOutputStream); 343 | private void readObject(java.io.ObjectInputStream); 344 | java.lang.Object writeReplace(); 345 | java.lang.Object readResolve(); 346 | } 347 | -keep public class * implements java.io.Serializable {*;} 348 | 349 | 350 | #========================================support-v4 351 | #https://stackoverflow.com/questions/18978706/obfuscate-android-support-v7-widget-gridlayout-issue 352 | -dontwarn android.support.v4.** 353 | -keep class android.support.v4.app.** { *; } 354 | -keep interface android.support.v4.app.** { *; } 355 | -keep class android.support.v4.** { *; } 356 | 357 | 358 | #========================================support-v7 359 | -dontwarn android.support.v7.** 360 | -keep class android.support.v7.internal.** { *; } 361 | -keep interface android.support.v7.internal.** { *; } 362 | -keep class android.support.v7.** { *; } 363 | 364 | #=======================================support design 365 | #@link http://stackoverflow.com/a/31028536 366 | -dontwarn android.support.design.** 367 | -keep class android.support.design.** { *; } 368 | -keep interface android.support.design.** { *; } 369 | -keep public class android.support.design.R$* { *; } 370 | 371 | #==============================================picasso 372 | -keep class com.squareup.picasso.** {*; } 373 | -dontwarn com.squareup.picasso.** 374 | 375 | #================================================glide 376 | -keep public class * implements com.bumptech.glide.module.GlideModule 377 | -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 378 | **[] $VALUES; 379 | public *; 380 | } 381 | 382 | #========================================greenDao 383 | #greendao3.2.0,此是针对3.2.0,如果是之前的,可能需要更换下包名 384 | -keep class org.greenrobot.greendao.**{*;} 385 | -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { 386 | public static java.lang.String TABLENAME; 387 | } 388 | -keep class **$Properties 389 | # If you do not use SQLCipher: 390 | -dontwarn org.greenrobot.greendao.database.** 391 | 392 | 393 | #================================volley混淆 394 | -keep class com.android.volley.** {*;} 395 | -keep class com.android.volley.toolbox.** {*;} 396 | -keep class com.android.volley.Response$* { *; } 397 | -keep class com.android.volley.Request$* { *; } 398 | -keep class com.android.volley.RequestQueue$* { *; } 399 | -keep class com.android.volley.toolbox.HurlStack$* { *; } 400 | -keep class com.android.volley.toolbox.ImageLoader$* { *; } 401 | 402 | #=======================================jpush极光推送 403 | -dontwarn cn.jpush.** 404 | -keep class cn.jpush.** { *; } 405 | 406 | #==============================================activeandroid 407 | -keep class com.activeandroid.** { *; } 408 | -dontwarn com.ikoding.app.biz.dataobject.** 409 | -keep public class com.ikoding.app.biz.dataobject.** { *;} 410 | -keepattributes *Annotation* 411 | 412 | #==============================================log4j 413 | -dontwarn org.apache.log4j.** 414 | -keep class org.apache.log4j.** { *;} 415 | #下面几行 是环信即时通信的代码混淆 416 | -keep class com.easemob.** {*;} 417 | -keep class org.jivesoftware.** {*;} 418 | -dontwarn com.easemob.** 419 | 420 | #===================================================融云 421 | -keepclassmembers class fqcn.of.javascript.interface.for.webview { 422 | public *; 423 | } 424 | 425 | -keepattributes Exceptions,InnerClasses 426 | 427 | -keep class io.rong.** {*;} 428 | 429 | -keep class * implements io.rong.imlib.model.MessageContent{*;} 430 | 431 | -keepattributes Signature 432 | 433 | -keepattributes *Annotation* 434 | 435 | -keep class sun.misc.Unsafe { *; } 436 | 437 | -keep class com.google.gson.examples.android.model.** { *; } 438 | 439 | -keepclassmembers class * extends com.sea_monster.dao.AbstractDao { 440 | public static java.lang.String TABLENAME; 441 | } 442 | -keep class **$Properties 443 | -dontwarn org.eclipse.jdt.annotation.** 444 | 445 | -keep class com.ultrapower.** {*;} 446 | #=============================================高徳地图 447 | -dontwarn com.amap.api.** 448 | -dontwarn com.a.a.** 449 | -dontwarn com.autonavi.** 450 | -keep class com.amap.api.** {*;} 451 | -keep class com.autonavi.** {*;} 452 | -keep class com.a.a.** {*;} 453 | 454 | #===============================retrofit2.x 455 | -dontwarn retrofit2.** 456 | -keep class retrofit2.** { *; } 457 | -keepattributes Signature 458 | -keepattributes Exceptions 459 | 460 | #=====================================Rxjava RxAndroid 461 | -dontwarn rx.* 462 | -dontwarn sun.misc.** 463 | 464 | -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { 465 | long producerIndex; 466 | long consumerIndex; 467 | } 468 | 469 | -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { 470 | rx.internal.util.atomic.LinkedQueueNode producerNode; 471 | } 472 | 473 | -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { 474 | rx.internal.util.atomic.LinkedQueueNode consumerNode; 475 | } 476 | 477 | 478 | #=======================================fastJson 479 | -dontwarn com.alibaba.fastjson.** 480 | -keep class com.alibaba.fastjson.** { *; } 481 | 482 | #==========================================Okio 483 | -dontwarn com.squareup.** 484 | -dontwarn okio.** 485 | -keep public class org.codehaus.* { *; } 486 | -keep public class java.nio.* { *; } 487 | # Retrolambda 488 | -dontwarn java.lang.invoke.* 489 | -------------------------------------------------------------------------------- /MyProguard.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vicc1024/AndroidProguard/7b6a2ecb4707b5337276fca3a85ff94bfe38ec69/MyProguard.jar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | #### 简介 3 | 4 | 基本上Release版本的都是需要混淆的,Android也提供了相关混淆的工具,只不过需要开发者,自己去定义混淆规则而已,很多的规则都是大同小异的,而且现在项目使用的开源库也很多,这样就得去收集很多的混淆规则,为了方便这样的收集的过程,开发这样的插件 。不过,我认为将来所有的提交到jcent的开源库,需要提供混淆规则,AndroidStudio在编译开源库的时候,自动添加的开源库的规则,那样的话将大大减少开发者的工作量。 5 | 6 | #### 使用 7 | 8 | 1. 下载插件[下载地址](https://raw.githubusercontent.com/pengyuantao/AndroidProguard/master/MyProguard.jar) 9 | 2. 在AndroidStudio中安装插件,选择下载的jar包,安装后,进行重启。 10 | ![image.png](http://upload-images.jianshu.io/upload_images/1460021-cedd1d8ff488478a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 11 | 12 | 3. 安装后可以在主菜单栏中找到Proguard的选项(Alt+D拷贝混淆规则或者直接点击) 13 | 14 | ![image.png](http://upload-images.jianshu.io/upload_images/1460021-0ee5c1654f7d4e7d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 15 | 16 | #### 拓展 17 | 18 | 目前使用的是比较普遍的项目库的混淆,当然如果你自己有很多自己的框架,那么基本上你们自己公司使用的都是一套混淆规则,这个时候,你可以自己定义混淆规则的来源。 19 | 20 | ![image.png](http://upload-images.jianshu.io/upload_images/1460021-516c8fa1f867528e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 21 | 22 | #### 开源 23 | 24 | [AndroidProguard]( https://github.com/pengyuantao/AndroidProguard) 25 | 感觉不错的兄弟,来一波start! 26 | 27 | 28 | ![录像9.gif](http://upload-images.jianshu.io/upload_images/1460021-d91a5af669f96f1b.gif?imageMogr2/auto-orient/strip) 29 | -------------------------------------------------------------------------------- /resources/META-INF/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | com.peng.myproguard 3 | AndroidProguard 4 | 1.0 5 | Android兴趣组 6 | 7 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 27 | 28 | 29 | 30 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/com/peng/proguard/ProguardGenerate.java: -------------------------------------------------------------------------------- 1 | package com.peng.proguard; 2 | 3 | import com.intellij.openapi.actionSystem.AnAction; 4 | import com.intellij.openapi.actionSystem.AnActionEvent; 5 | import com.intellij.openapi.ui.Messages; 6 | 7 | import java.awt.*; 8 | import java.awt.datatransfer.StringSelection; 9 | import java.io.*; 10 | import java.net.HttpURLConnection; 11 | import java.net.URL; 12 | import java.net.URLConnection; 13 | 14 | /** 15 | * 彭元涛 16 | * Created by Administrator on 2017/9/8. 17 | */ 18 | public class ProguardGenerate extends AnAction { 19 | 20 | @Override 21 | public void actionPerformed(AnActionEvent e) { 22 | BufferedReader bufferedReader = null; 23 | HttpURLConnection urlConnection = null; 24 | try { 25 | URL url = new URL(Setting.getInstance().getState()); 26 | urlConnection = (HttpURLConnection) url.openConnection(); 27 | urlConnection.setRequestProperty("Accept-Charset", "UTF-8"); 28 | urlConnection.setDoOutput(true); 29 | urlConnection.setDoInput(true); 30 | urlConnection.setReadTimeout(5000); 31 | int responseCode = urlConnection.getResponseCode(); 32 | if (responseCode == 200) { 33 | String contentEncoding = urlConnection.getContentEncoding(); 34 | bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8")); 35 | StringBuilder resultBuilder = new StringBuilder(); 36 | String line = null; 37 | while ((line = bufferedReader.readLine()) != null) { 38 | resultBuilder.append(line).append("\n"); 39 | } 40 | StringSelection stringSelection = new StringSelection(resultBuilder.toString()); 41 | Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, stringSelection); 42 | Messages.showMessageDialog("Ctrl+V to copy it!","Succese",null); 43 | } else { 44 | Messages.showErrorDialog("Code:" + responseCode, "Error"); 45 | return; 46 | } 47 | } catch (IOException e1) { 48 | e1.printStackTrace(); 49 | Messages.showErrorDialog(e1.getMessage(),"Error"); 50 | } finally { 51 | if (bufferedReader != null) { 52 | try { 53 | bufferedReader.close(); 54 | } catch (IOException e1) { 55 | e1.printStackTrace(); 56 | } 57 | } 58 | if (urlConnection != null) { 59 | urlConnection.disconnect(); 60 | } 61 | } 62 | 63 | 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/com/peng/proguard/ProguardSetting.java: -------------------------------------------------------------------------------- 1 | package com.peng.proguard; 2 | 3 | import com.intellij.openapi.actionSystem.AnAction; 4 | import com.intellij.openapi.actionSystem.AnActionEvent; 5 | import com.intellij.openapi.ui.DialogBuilder; 6 | import com.intellij.openapi.ui.InputValidator; 7 | import com.intellij.openapi.ui.Messages; 8 | 9 | /** 10 | * Created by Administrator on 2017/9/8. 11 | */ 12 | public class ProguardSetting extends AnAction { 13 | 14 | 15 | @Override 16 | public void actionPerformed(AnActionEvent anActionEvent) { 17 | Messages.showInputDialog("Current Pruguad Url:", "Proguard From Url", null, Setting.getInstance().getState(), new InputValidator() { 18 | @Override 19 | public boolean checkInput(String s) { 20 | System.out.println("checkInput:" + s); 21 | return true; 22 | } 23 | 24 | @Override 25 | public boolean canClose(String s) { 26 | System.out.println("canClose:" + s); 27 | Setting.getInstance().loadState(s); 28 | return true; 29 | } 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/peng/proguard/Setting.java: -------------------------------------------------------------------------------- 1 | package com.peng.proguard; 2 | 3 | import com.intellij.openapi.components.PersistentStateComponent; 4 | import com.intellij.openapi.components.ServiceManager; 5 | import com.intellij.openapi.components.State; 6 | import com.intellij.openapi.components.Storage; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | /** 10 | * Created by Administrator on 2017/9/8. 11 | */ 12 | @State( 13 | name = "proguard", 14 | storages = { 15 | @Storage( 16 | id = "proguard", 17 | file = "$APP_CONFIG$/proguard_setting.xml" 18 | ) 19 | } 20 | ) 21 | public class Setting implements PersistentStateComponent { 22 | public static final String DEFAULT_PROGUARD_URL = "https://raw.githubusercontent.com/pengyuantao/AndroidProguard/master/AndroidProguard"; 23 | 24 | public String proguardUrl = DEFAULT_PROGUARD_URL; 25 | 26 | @Nullable 27 | @Override 28 | public String getState() { 29 | return proguardUrl; 30 | } 31 | 32 | @Override 33 | public void loadState(String s) { 34 | this.proguardUrl = s; 35 | } 36 | 37 | public static Setting getInstance() { 38 | return ServiceManager.getService(Setting.class); 39 | } 40 | } 41 | --------------------------------------------------------------------------------