как да защитите android jar

знам как да защитя проекта за android, но в момента използвам android, направете jar, така че хората да могат да използват моя jar в приложението за android, но искам моят jar да се защити. Използвах 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 *; } това ми дава успех, но когато извикам proguarded jar в моето приложение, някакъв клас не е намерен.

в моя проект: дава ми :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() и така нататък, целият публичен метод не е извикан от буркана


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


Отговори (2)


добавете следното към вашия proguard.config. Мисля, че ще помогне за запазването на enum:

-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
дефинирайте вашия клас enum като статичен: public static enum GifImageType{ ... } и вижте дали помага - person waqaslam; 23.03.2012
comment
или в случай, че все още не помогне, променете втората опция на тази -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'

-оптимизации !code/oпростяване/аритметика,!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

-запазване на публичен клас com.android.vending.licensing.ILicensingService -запазване на публичен интерфейс com.ant.liao.GifAction -запазване на член на класа клас com.ant.liao.GifView { public void (); публичен празен набор*(*); публично празно шоу*();

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

-запазване на публичния интерфейс com.asqw.android.Listener {публично защитен; }

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

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

-keepclassmembers клас * разширява 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,allowshrinking class * {native; } и получавам eunm от java файла gifView и поставям eunm GifImageType като отделен java файл

person pengwang    schedule 26.03.2012