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