_低头的麦穗 2015-05-21 14:16 采纳率: 0%
浏览 4028
已结题

android proguard混淆后,效果和原来的不一致

最近在学习android proguard,但是看了很多的博客和demo,自己练手的时候出现的问题久久不会解决,郁闷已久,虽求助大家。

问题描述:一个android动画的demo,没有混淆之后效果都能实现,但是混淆之后动画效果都没有效果了。

我引用了一个第三方jar包:afinal_0.5.1_bin.jar

proguard-project.txt:
-dontoptimize
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontwarn
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes InnerClasses,LineNumberTable

-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 class net.tsz.afinal.**{*;}
-keep class android.webkit.**{*;}

-keepclasseswithmembernames class * {
native ;
}

-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);
}

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

-keep class **.R$* {

*;

}

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

 package com.example.animation;

import net.tsz.afinal.FinalActivity;
import net.tsz.afinal.annotation.view.ViewInject;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends FinalActivity {
    @ViewInject(id = R.id.btn_scale_anim, click = "onClick")
    private Button mBtnScale;
    @ViewInject(id = R.id.btn_alpha_anim, click = "onClick")
    private Button mBtnAlpha;
    @ViewInject(id = R.id.btn_rotate_anim, click = "onClick")
    private Button mBtnRotate;
    @ViewInject(id = R.id.btn_translate_anim, click = "onClick")
    private Button mBtnTranslate;
    @ViewInject(id = R.id.btn_continue_one, click = "onClick")
    private Button mBtnContinueOne;
    @ViewInject(id = R.id.btn_continue_two, click = "onClick")
    private Button mBtnContinueTwo;
    @ViewInject(id = R.id.btn_flash, click = "onClick")
    private Button mBtnFlash;
    @ViewInject(id = R.id.btn_shake, click = "onClick")
    private Button mBtnShake;
    @ViewInject(id = R.id.btn_switch, click = "onClick")
    private Button mBtnSwitch;
    @ViewInject(id = R.id.btn_layout, click = "onClick")
    private Button mBtnLayout;
    @ViewInject(id = R.id.btn_frame, click = "onClick")
    private Button mBtnFrame;
    @ViewInject(id = R.id.btn_shake, click = "onClick")
    private Button mBntShake;
    @ViewInject(id = R.id.iv_image)
    private ImageView mIvImage;

    private Animation mAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View v) {
        switch (v.getId()) {
        // 缩放
        case R.id.btn_scale_anim:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.scale);
            mIvImage.startAnimation(mAnim);
            break;
        // 透明度
        case R.id.btn_alpha_anim:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.alpha);
            mIvImage.startAnimation(mAnim);
            break;
        // 平移
        case R.id.btn_translate_anim:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.translate);
            mIvImage.startAnimation(mAnim);
            break;
        // 旋转
        case R.id.btn_rotate_anim:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.rotate);
            mIvImage.startAnimation(mAnim);
            break;
        // 组合动画,用监听器的方式
        case R.id.btn_continue_one:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.translate);
            mIvImage.startAnimation(mAnim);
            final Animation tAnim = AnimationUtils.loadAnimation(this, R.anim.rotate);
            mAnim.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {
                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    mIvImage.startAnimation(tAnim);
                }
            });
            break;
        // 组合动画,用xml文件的方式
        case R.id.btn_continue_two:
            mAnim = AnimationUtils.loadAnimation(this, R.anim.continue_two);
            mIvImage.startAnimation(mAnim);
            break;
        // 闪动效果
        case R.id.btn_flash:
            AlphaAnimation alphaAnim = new AlphaAnimation(0.1f, 1.0f);
            alphaAnim.setDuration(100);
            alphaAnim.setRepeatCount(10);
            alphaAnim.setRepeatMode(Animation.REVERSE);
            mIvImage.startAnimation(alphaAnim);
            break;
        // 两个activity跳转的动画效果
        case R.id.btn_switch:
            startActivity(new Intent(this, SecondActivity.class));
            overridePendingTransition(R.anim.aty_in, R.anim.aty_out);
            break;
        // 布局动画
        case R.id.btn_layout:
            startActivity(new Intent(this, ListActivity.class));
            break;
        // 帧动画
        case R.id.btn_frame:
            // 怎么控制帧动画的重复次数
            mIvImage.setImageResource(R.drawable.anim_list);
            AnimationDrawable animDrawable = (AnimationDrawable) mIvImage.getDrawable();
            animDrawable.start();
            break;
        case R.id.btn_shake:
            TranslateAnimation translateAnim = new TranslateAnimation(-10, 10, -10, 10);
            translateAnim.setDuration(30);
            translateAnim.setRepeatCount(10);
            translateAnim.setRepeatMode(Animation.REVERSE);
            mIvImage.startAnimation(translateAnim);
            break;
        }
    }
}

  • 写回答

7条回答

  • bdmh 移动开发领域优质创作者 2015-05-21 14:19
    关注

    一些需要通过反射实现的东西,就不要混淆了,否则找不到类了,你可以尝试吧这个动画类不要混淆

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置