как прогардить банку андроида

Я знаю, как создать проект для Android, но в настоящее время я использую Android для создания jar-файла, чтобы люди могли использовать мой jar-файл в приложении для Android, но я хочу, чтобы мой jar-файл был proguard. Я использовал инструмент proguard, мой файл .pro:

-libraryjars 'D:\Android\android-sdk\platforms\android-7\android.jar'

-optimizationpasses 5
 -dontusemixedcaseclassnames 
 -dontskipnonpubliclibraryclasses 
  -dontpreverify 
 -verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity  
-keep public class * extends android.app.Application
-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 com.android.vending.licensing.ILicensingService
 -keep public abstract interface com.asqw.android.Listener{
 public protected <methods>; 
}

-keepclasseswithmembernames class * { 
 native <methods>;
}
-keepclasseswithmembers class * { 
 public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
 public void *(android.view.View);
}

-keepclassmembers enum * { public static *[] values(); public static * valueOf(java.lang.String);

} -keep class * реализует android.os.Parcelable { public static final android.os.Parcelable$Creator *; } это дает мне успех, но когда я вызываю защищенную банку в своем приложении, какой-то класс не найден.

в моем проекте: он дает мне: import com.ant.liao.GifView.GifImageType; не нашел. мой файл gifView:

 public class GifView extends ImageView implements GifAction{


private GifDecoder gifDecoder = null;

private Bitmap currentImage = null;

private boolean isRun = true;

private boolean pause = false;

private DrawThread drawThread = null;

private Context context = null;

private boolean cacheImage = false;

private View backView = null;

private GifImageType animationType = GifImageType.SYNC_DECODER;

public enum GifImageType{

    WAIT_FINISH (0),

    SYNC_DECODER (1),

    COVER (2);

    GifImageType(int i){
        nativeInt = i;
    }
    final int nativeInt;
}


public GifView(Context context) {
    super(context);
    this.context = context;
    //gifDecoder = new GifDecoder(this);
    setScaleType(ImageView.ScaleType.FIT_XY);
}

public GifView(Context context, AttributeSet attrs) {
    this(context, attrs,0);

}  

public GifView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
   // TypedArray a = context.obtainStyledAttributes(attrs,R.array.);
    //gifDecoder = new GifDecoder(this);
    setScaleType(ImageView.ScaleType.FIT_XY);
}


 private void setGifDecoderImage(byte[] gif){

    if(gifDecoder == null){
        gifDecoder = new GifDecoder(this);
    }
    gifDecoder.setGifImage(gif);
    gifDecoder.start();
}


private void setGifDecoderImage(InputStream is){

    if(gifDecoder == null){
        gifDecoder = new GifDecoder(this);
    }
    gifDecoder.setGifImage(is);
    gifDecoder.start();


}


public void setAsBackground(View v){
    backView = v;
}

protected Parcelable onSaveInstanceState() {
    super.onSaveInstanceState();
    if(gifDecoder != null)
        gifDecoder.free();

    return null;
}

// public void setCahceImage(){ // if(gifDecoder == null){ // gifDecoder = new GifDecoder(this); // } // cacheImage = true; // gifDecoder.setCacheImage(true, context); // }

public void setGifImage(byte[] gif){
    setGifDecoderImage(gif);
}


public void setGifImage(InputStream is){
    setGifDecoderImage(is);
}


public void setGifImage(int resId){
    Resources r = getResources();
    InputStream is = r.openRawResource(resId);
    setGifDecoderImage(is);
}


public void destroy(){
    if(gifDecoder != null)
        gifDecoder.free();
}


public void showCover(){
    if(gifDecoder == null)
        return;
    pause = true;
    currentImage = gifDecoder.getImage();
    invalidate();
}


public void showAnimation(){
    if(pause){
        pause = false;
    }
}


public void setGifImageType(GifImageType type){
    if(gifDecoder == null)
        animationType = type;
}


 public void parseOk(boolean parseStatus,int frameIndex){
    if(parseStatus){
        if(gifDecoder != null){
            switch(animationType){
            case WAIT_FINISH:
                if(frameIndex == -1){
                    if(gifDecoder.getFrameCount() > 1){    
                        DrawThread dt = new DrawThread();
                        dt.start();
                    }else{
                        reDraw();
                    }
                }
                break;
            case COVER:
                if(frameIndex == 1){
                    currentImage = gifDecoder.getImage();
                    reDraw();
                }else if(frameIndex == -1){
                    if(gifDecoder.getFrameCount() > 1){
                        if(drawThread == null){
                            drawThread = new DrawThread();
                            drawThread.start();
                        }
                    }else{
                        reDraw();
                    }
                }
                break;
            case SYNC_DECODER:
                if(frameIndex == 1){
                    currentImage = gifDecoder.getImage();
                    reDraw();
                }else if(frameIndex == -1){
                    reDraw();
                }else{
                    if(drawThread == null){
                        drawThread = new DrawThread();
                        drawThread.start();
                    }
                }
                break;
            }

        }else{
            Log.e("gif","parse error");
        }

    }
}

private void reDraw(){
    if(redrawHandler != null){
        Message msg = redrawHandler.obtainMessage();
        redrawHandler.sendMessage(msg);
    }

}

private void drawImage(){
    setImageBitmap(currentImage);
    invalidate();
}

private Handler redrawHandler = new Handler(){
    public void handleMessage(Message msg) {
        try{
            if(backView != null){
                backView.setBackgroundDrawable(new BitmapDrawable(currentImage));
            }else{
                drawImage();
            }
        }catch(Exception ex){
            Log.e("GifView", ex.toString());
        }
    }
};

  private class DrawThread extends Thread{  
    public void run(){
        if(gifDecoder == null){
            return;
        }
        while(isRun){
            if(gifDecoder.getFrameCount() == 1){

                GifFrame f = gifDecoder.next();
                currentImage = f.image;
                gifDecoder.free();
                reDraw();

                break;
            }
            if (pause == false) {
                GifFrame frame = gifDecoder.next();

                if (frame == null) {
                    SystemClock.sleep(50);
                    continue;
                }
                if (frame.image != null)
                    currentImage = frame.image;
                else if (frame.imageName != null) {
                    currentImage = BitmapFactory.decodeFile(frame.imageName);
                }
                long sp = frame.delay;
                if (redrawHandler != null) {
                    reDraw();
                    SystemClock.sleep(sp);
                } else {
                    break;
                }
            } else {
                SystemClock.sleep(50);
            }
        }
    }
}

} когда я использую инструмент proguard для защиты файлов, gf2.setGifImage(R.drawable.a2); gf2.setGifImageType(GifImageType.COVER);gf1.showCover() и т. д., все общедоступные методы, не вызываемые из jar


person pengwang    schedule 23.03.2012    source источник


Ответы (2)


добавьте следующее в свой proguard.config. Я думаю, это поможет сохранить перечисление:

-keep public enum com.ant.liao.GifView.GifImageType$** {
    **[] $VALUES;
    public *;
}

или обойти класс, который определяет enum:

-keep class com.ant.liao.GifView { *; }
person waqaslam    schedule 23.03.2012
comment
Я использовал 2 метода, это уменьшает мою ошибку, только GifImageType.COVER не найден, можете ли вы сказать мне, как это уменьшить? - person pengwang; 23.03.2012
comment
определите свой класс перечисления как статический: public static enum GifImageType{ ... } и посмотрите, поможет ли это - person waqaslam; 23.03.2012
comment
или в случае, если это все еще не помогает, измените 2-й вариант на этот -keep class com.ant.liao.GifView. (Примечание: без скобок в конце) - person waqaslam; 23.03.2012
comment
я использовал -keep class com.ant.liao.GifView также бесполезен - person pengwang; 23.03.2012
comment
затем добавьте это -dontwarn com.ant.liao.GifView - person waqaslam; 23.03.2012
comment
я использовал -keep public class com.ant.liao.GifView -dontwarn com.ant.liao.GifView также бесполезен - person pengwang; 23.03.2012
comment
я изменяю свой пост, мои общедоступные методы не вызываются из банки, java-файл, который у меня есть - person pengwang; 26.03.2012

-injars GifView.jar -outjars G.jar

-libraryjars 'D:\Android\android-sdk\platforms\android-7\android.jar'

-optimizations !code/simplification/arithmetic,!field/,!class/merging/ -optimizationpasses 5 -dontusemixedcaseclassnames -dontpreverify -verbose

-keep public class * расширяет android.app.Activity

-keep public class * расширяет android.app.Application

-keep public class * расширяет android.app.Service

-keep public class * расширяет android.content.BroadcastReceiver

-keep public class * расширяет android.content.ContentProvider

-keep public class * расширяет android.app.backup.BackupAgentHelper

-keep public class * расширяет android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService -keep public interface com.ant.liao.GifAction -keepclassmembers class com.ant.liao.GifView { public void (); public void set*(*); публичное недействительное шоу*();

} -keep class com.ant.liao.GifImageType { *; }

-keep public interface com.asqw.android.Listener { public protected ; }

-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); }

-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); }

-keepclassmembers class * extends android.app.Activity {public void *(android.view.View); }

-keep class * extends android.os.Parcelable {public static final android.os.Parcelable$Creator *; }

Также держите - Перечисления. Сохраняйте специальные статические методы, которые требуются в

классы перечисления.

-keepclassmembers enum * { public static *[] values(); public static * valueOf(java.lang.String); }

Сохранить имена — собственные имена методов. Сохраняйте все нативные имена классов/методов.

-keepclasseswithmembers, разрешить сжатие class * { native ; } и я получаю eunm из java-файла gifView и помещаю eunm GifImageType в отдельный java-файл

person pengwang    schedule 26.03.2012