안드로이드 혼동 연구

27590 단어
전언
혼동은 온라인 전에 매우 중요한 부분이다.android에서 사용하는 ProGuard는 압축, 혼동, 예검, 최적화 역할을 합니다.그러나 헷갈린 서류를 정확하게 쓰는 자세를 제대로 파악하지 못한 어린이들이 많다.나는 모두가 쉽게 혼동을 해결할 수 있도록 틀화된 물건을 만들고 싶다.그럼 항목의 혼동을 쓰기 시작합시다...내가 너무 직접적이지...
다섯 걸음으로 끝내다
1
프로젝트 중proguard-rules를 엽니다.프로, 다음 코드를 복사하십시오.제 생각은 혼동을 두 가지 주요 부분으로 나누는 거예요.
4
  • 맞춤형 구역.여기의 내용은 우리가 주로 보충해야 할 부분으로 대체적으로 4개의 작은 부분으로 나뉘는데 우리의 다음 단계는 주로 이 4개의 부분을 보충하는 것이다

  • 4
  • 기본적으로 움직이지 않는 구역.말 그대로 거의 움직이지 않아도 된다.이 부분의 내용은 내가 이미 다 썼는데, 특별한 수요가 없으면 기본적으로 바꿀 필요가 없다.뇌봉이라고 불러주세요..
  • #-------------------------------------------     ----------------------------------------------
    #---------------------------------1.   ---------------------------------
    
    
    
    #-------------------------------------------------------------------------
    
    #---------------------------------2.    -------------------------------
    
    
    
    #-------------------------------------------------------------------------
    
    #---------------------------------3. js      ------------------------
    
    
    
    #-------------------------------------------------------------------------
    
    #---------------------------------4.         -----------------------
    
    
    
    #----------------------------------------------------------------------------
    #---------------------------------------------------------------------------------------------------
    
    #-------------------------------------------       --------------------------------------------
    #---------------------------------     ----------------------------------
    -optimizationpasses 5
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -dontskipnonpubliclibraryclassmembers
    -dontpreverify
    -verbose
    -printmapping proguardMapping.txt
    -optimizations !code/simplification/cast,!field/*,!class/merging/*
    -keepattributes *Annotation*,InnerClasses
    -keepattributes Signature
    -keepattributes SourceFile,LineNumberTable
    #----------------------------------------------------------------------------
    
    #---------------------------------     ---------------------------------
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Appliction
    -keep public class * extends android.app.Service
    -keep public class * extends android.content.BroadcastReceiver
    -keep public class * extends android.content.ContentProvider
    -keep public class * extends android.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class * extends android.view.View
    -keep public class com.android.vending.licensing.ILicensingService
    -keep class android.support.** {*;}
    
    -keepclasseswithmembernames class * {
        native ;
    }
    -keepclassmembers class * extends android.app.Activity{
        public void *(android.view.View);
    }
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    -keep public class * extends android.view.View{
        *** get*();
        void set*(***);
        public (android.content.Context);
        public (android.content.Context, android.util.AttributeSet);
        public (android.content.Context, android.util.AttributeSet, int);
    }
    -keepclasseswithmembers class * {
        public (android.content.Context, android.util.AttributeSet);
        public (android.content.Context, android.util.AttributeSet, int);
    }
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    -keep class **.R$* {
     *;
    }
    -keepclassmembers class * {
        void *(**On*Event);
    }
    #----------------------------------------------------------------------------
    
    #---------------------------------webview------------------------------------
    -keepclassmembers class fqcn.of.javascript.interface.for.webview {
       public *;
    }
    -keepclassmembers class * extends android.webkit.webViewClient {
        public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
        public boolean *(android.webkit.WebView, java.lang.String);
    }
    -keepclassmembers class * extends android.webkit.webViewClient {
        public void *(android.webkit.webView, jav.lang.String);
    }
    #----------------------------------------------------------------------------
    #---------------------------------------------------------------------------------------------------

    2
    전략급 사상을 이해한 후에 우리는 첫 번째 부분 보충-실체류를 시작한다.실체류는 서비스 측과의 상호작용과 관련되기 때문에 각종 gson의 상호작용은 이와 같기 때문에 보존해야 한다.프로젝트의 실체류를 모두 꺼내서 다음 문법으로 보존하십시오.
    -keep class          .** { *; }

    내 프로젝트 하위 클래스 User의 전체 경로는 com입니다.demo.login.bean.User, 그럼 내 혼동은 다음과 같다.
    #---------------------------------1.   ---------------------------------
    
    -keep class com.demo.login.bean.** { *; }
    
    #-------------------------------------------------------------------------

    물론 당신의 실체류는 이것뿐만이 아닙니다. 위의 방식으로 하나하나 첨가하세요. 만약 당신의 실체류가 모두 한 가방 밑에 있다면 당신은 행복할 것입니다.
    3
    두 번째 부분은 제3자 가방입니다.build을 엽니다.gradle 파일, 어떤 제3자 가방을 사용했는지 확인하세요.
    dependencies {
        compile 'com.github.bumptech.glide:glide:3.7.0'
        compile 'org.greenrobot:eventbus:3.0.0'
    }

    저는 glide, 이벤트bus를 사용했습니다.나는 그들의 홈페이지에 가서 이미 쓴 것을 혼동했다.
    #---------------------------------2.    -------------------------------
    
    #eventBus
    -keepattributes *Annotation*
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe ;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        (java.lang.Throwable);
    }
    
    #glide
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
      **[] $VALUES;
      public *;
    }
    
    #-------------------------------------------------------------------------

    보통 홈페이지가 헷갈려요. 없으면 Google, 없으면 위에 적힌 대로 직접 쓰고, 아직 모르면...가방만 바꿀 수 있어...만약 당신이 직접적으로 포함된jar 패키지라면, 당신은 이렇게 쓰십시오
    #---------------------------------2.    -------------------------------
    
    #log4j
    -libraryjars log4j-1.2.17.jar
    -dontwarn org.apache.log4j.**
    -keep class  org.apache.log4j.** { *;}
    
    #-------------------------------------------------------------------------

    대체로 헷갈리지 않고 Warn에 보고하지 않는다는 뜻이다.만약gradle이 틀렸다면 -libraryjarslog4j-1.2.17.jar라는 말.
    4
    세 번째 부분은 js와 호환되는 클래스로 프로젝트에서 직접 건너뛰지 않았습니다.보통 이렇게 써도 돼요.
    -keep class        .** { *; }

    내부류라면 이렇게 할 수 있어요.
    -keepclasseswithmembers class        .  $   { <methods>; }

    예컨대
    -keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface { 
          ; 
    }

    5
    네 번째 부분은 반사와 관련된 종류로 공사에서 직접 건너뛰지 않았다.클래스는 그냥 이렇게.
    -keep class        .** { *; }

    숙련되면 5분 안에 끝낼 수 있다.본인이 쓰고 헷갈리는 시간을 댓글로 남겨주시면 됩니다(0,0).
    깊이 이해하다
    우선 기본 지령구 지령의 함의를 조목조목 소개하다
    -optimizationpasses 5

    코드 혼동의 압축 비례, 값은 0-7 사이입니다
    -dontusemixedcaseclassnames

    혼동 후 유형 이름 은 모두 소문자 이다
    -dontskipnonpubliclibraryclasses

    비공용 라이브러리를 무시하지 않는 클래스를 지정합니다
    -dontskipnonpubliclibraryclassmembers

    비공식 라이브러리를 무시하지 않는 클래스의 구성원을 지정합니다
    -dontpreverify

    미리 검사하지 않은 조작
    -verbose
    -printmapping proguardMapping.txt

    원래 클래스 이름과 혼동된 클래스 이름을 만드는 맵 파일
    -optimizations !code/simplification/cast,!field/*,!class/merging/*

    혼동이 적용되는 알고리즘을 지정하다
    -keepattributes *Annotation*,InnerClasses

    혼동 안 함 Annotation
    -keepattributes Signature

    혼동 안 함 범용
    -keepattributes SourceFile,LineNumberTable

    이상을 던질 때 코드 줄 번호를 보존합니다
    기본 지령구는 기본적으로 소개가 끝났습니다. 가장 많이 쓰는 지령 두 가지를 말씀드리겠습니다.
    -keep class XXXX

    클래스 이름은 변하지 않는다. 즉, 클래스 이름은 혼동되지 않고 클래스의 구성원 이름은 보장되지 않는다.물론 XXX 클래스를 계승하는 모든 클래스 이름이 혼동되지 않고 구체적인 코드가 붙지 않아 이해에 중점을 둘 수도 있다.
    -keepclasseswithmembers class XXXX

    클래스 이름과 구성원 이름을 보존합니다.물론 클래스 중의 특정한 방법일 수도 있다. 코드가 붙지 않는 이유는 같다.
    첨부: 완전한 혼동
    #-------------------------------------------     ----------------------------------------------
    #---------------------------------1.   ---------------------------------
    
    -keep class com.demo.login.bean.** { *; }
    -keep class com.demo.main.bean.** { *; }
    
    #-------------------------------------------------------------------------
    
    #---------------------------------2.    -------------------------------
    
    #eventBus
    -keepattributes *Annotation*
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe ;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        (java.lang.Throwable);
    }
    
    #glide
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
      **[] $VALUES;
      public *;
    }
    
    #log4j
    -libraryjars log4j-1.2.17.jar
    -dontwarn org.apache.log4j.**
    -keep class  org.apache.log4j.** { *;}
    
    #-------------------------------------------------------------------------
    
    #---------------------------------3. js      ------------------------
    
    -keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface { 
          ; 
    }
    
    #-------------------------------------------------------------------------
    
    #---------------------------------4.         -----------------------
    
    #TODO        。。。
    
    #----------------------------------------------------------------------------
    #---------------------------------------------------------------------------------------------------
    
    #-------------------------------------------       --------------------------------------------
    #---------------------------------     ----------------------------------
    -optimizationpasses 5
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -dontskipnonpubliclibraryclassmembers
    -dontpreverify
    -verbose
    -printmapping proguardMapping.txt
    -optimizations !code/simplification/cast,!field/*,!class/merging/*
    -keepattributes *Annotation*,InnerClasses
    -keepattributes Signature
    -keepattributes SourceFile,LineNumberTable
    #----------------------------------------------------------------------------
    
    #---------------------------------     ---------------------------------
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Appliction
    -keep public class * extends android.app.Service
    -keep public class * extends android.content.BroadcastReceiver
    -keep public class * extends android.content.ContentProvider
    -keep public class * extends android.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class * extends android.view.View
    -keep public class com.android.vending.licensing.ILicensingService
    -keep class android.support.** {*;}
    
    -keepclasseswithmembernames class * {
        native ;
    }
    -keepclassmembers class * extends android.app.Activity{
        public void *(android.view.View);
    }
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    -keep public class * extends android.view.View{
        *** get*();
        void set*(***);
        public (android.content.Context);
        public (android.content.Context, android.util.AttributeSet);
        public (android.content.Context, android.util.AttributeSet, int);
    }
    -keepclasseswithmembers class * {
        public (android.content.Context, android.util.AttributeSet);
        public (android.content.Context, android.util.AttributeSet, int);
    }
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    -keep class **.R$* {
     *;
    }
    -keepclassmembers class * {
        void *(**On*Event);
    }
    #----------------------------------------------------------------------------
    
    #---------------------------------webview------------------------------------
    -keepclassmembers class fqcn.of.javascript.interface.for.webview {
       public *;
    }
    -keepclassmembers class * extends android.webkit.webViewClient {
        public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
        public boolean *(android.webkit.WebView, java.lang.String);
    }
    -keepclassmembers class * extends android.webkit.webViewClient {
        public void *(android.webkit.webView, jav.lang.String);
    }
    #----------------------------------------------------------------------------
    #---------------------------------------------------------------------------------------------------

    뒷말
    build.gradle에서 minify Enabled를 true로 설정해서 포장해 보세요.
       release {
           minifyEnabled true
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
       }

    기타 수요는 댓글로 토론할 수 있습니다.도움이 된다면 마음에 드는 것을 찔러 주세요.
    감사
    가방 선생님의 앱 연구개발록
    문/wolearn(약서 작성자)
    텍스트 링크:http://www.jianshu.com/p/f3455ecaa56e
    저작권은 작가에게 귀속되며, 전재는 작가에게 연락하여 권한을 부여받고'약서작가'라고 표기해 주십시오.

    좋은 웹페이지 즐겨찾기