Я знаю, как защищать проект 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