как защитить андроид банку - PullRequest
0 голосов
/ 23 марта 2012

Я знаю, как защищать проект 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 * { общедоступная статическая * [] values ​​(); общедоступная статическая * valueOf (java.lang.String);

} -keep class * реализует android.os.Parcelable { общедоступная статическая финальная версия 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

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

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

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

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

-keep class com.ant.liao.GifView { *; }
1 голос
/ 26 марта 2012

-injars GifView.jar -outjars G.jar

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

-оптимизации!код / ​​упрощение / арифметика,! field / ,! class / merging / -оптимизация проходит 5 -dontusemixedcaseclassnames -dontpreverify -verbose

-keep public class * extends android.app.Activity

-поддержать общедоступный класс * extends android.app.Application

-поддержать общедоступный класс * extends android.app.Service

-сохранить открытый класс * extends android.content.BroadcastReceiver

-поддержать открытый класс * extends android.content.ContentProvider

-поддержать открытый класс * extends android.app.backup.BackupAgentHelper

-поддержать открытый класс * extends android.preference.Предпочтение

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

} - сохранить класс com.ant.liao.GifImageType {*;}

- поддерживать открытый интерфейс 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);}

-класс класса * extends android.os.Parcelable {общедоступная статическая финальная версия android.os.Parcelable $ Creator *;}

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

.

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

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

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

...