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

最近在学习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个回答

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

ghw_study
_低头的麦穗 我加上这句"-keep class android.view.animation.**{*;}"还是不行
大约 5 年之前 回复

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

ghw_study
_低头的麦穗 我加上这句"-keep class android.view.animation.**{*;}"还是不行
大约 5 年之前 回复

建议你 将核心代码混淆。

ghw_study
_低头的麦穗 我加上这句"-keep class android.view.animation.**{*;}"还是不行
大约 5 年之前 回复

你混淆的时候的问题,动画方面的就不要混淆了、

ghw_study
_低头的麦穗 我加上这句"-keep class android.view.animation.**{*;}"还是不行
大约 5 年之前 回复
ghw_study
_低头的麦穗 我加上这句"-keep class android.view.animation.**{*;}"还是不行
大约 5 年之前 回复

请搜索 afinal_0.5.1_bin 的混淆 可能是找不到对象 没有报错吗?

你可以试试反编译两个包,然后比对一下
看看具体是哪里影响了最终效果

楼主问题解决了吗???我也遇到同样的问题了,混淆后动画不会动了,怎么解决啊!!

WUshuaijun1
乐逍遥二 回复a516972602: 解决了,把你所有动画类禁止混淆就可以了
3 年多之前 回复
a516972602
a516972602 你解决了吗?我也遇到了同样的问题
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问