1

Android アプリケーションでいくつかのビューをアニメーション化するために PropertyValuesHolder を使用しています。アニメーションがまったくないリリースビルドを行うまで、アニメーションは私のデバイスで正常に動作します。(プロパティ名は「Panel1W」などの文字列名として参照されるため、問題は難読化に関係していると思います)

スローされる例外はありません。ただアニメーションはありません。http://proguard.sourceforge.net/index.html#manual/troubleshooting.htmlで見つけた最も近いものは 、proguard.cfg で -keep コマンドを使用する必要がある NoSuchMethodException です。proguard.cfg で次のことを試しましたが、成功しませんでした

-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel1W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel1W(java.lang.Integer); }
-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel2W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel2W(java.lang.Integer); }
-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel3W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel3W(java.lang.Integer); }

何か不足していますか?以下にコードを示します。ありがとう。

PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[3];
arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("Panel1W", mPanel1.getWidth(), 0);
arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", 360, 1280);
arrayOfPropertyValuesHolder[2] = PropertyValuesHolder.ofInt("Panel3W", 0, (int)(screenWidth * 0.65));

ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
arrayOfPropertyValuesHolder).setDuration(time);
localObjectAnimator.setInterpolator(sCollapseInterpolator);
localObjectAnimator.start();

ゲッターメソッドとセッターメソッドもあります。

    public int getPanel1W() {
        return ((ViewGroup.MarginLayoutParams) mPanel1.getLayoutParams()).width;
    }

    public void setPanel1W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel1.getLayoutParams();
        lp.width = paramInt;
        mPanel1.setLayoutParams(lp);
    }

    public int getPanel2W() {
        return ((ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams()).width;
    }

    public void setPanel2W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams();
        lp.width = paramInt;
        mPanel2.setLayoutParams(lp);
    }  

    public int getPanel3W() {
        return ((ViewGroup.MarginLayoutParams) mPanel3.getLayoutParams()).width;
    }

    public void setPanel3W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel3.getLayoutParams();
        lp.width = paramInt;
        mPanel3.setLayoutParams(lp);        
    }
4

2 に答える 2

6

トリックは、によって呼び出されるメソッドPropertyValuesHolderが または のいずれset*get*であるという事実です。したがって、そのようなメソッドを保持するためのProGuard規則は次のとおりです。

void set*(***);
*** get*();

したがって、それに基づいて、アニメーション化されたターゲットがいくつかのクラスの 1 つにすぎない場合は、アニメーション化されたターゲット クラスごとにこれを追加します。

-keep class my.package.MyClass {
    void set*(***);
    *** get*();
}

すべてのターゲットが何らかの基本クラスを拡張する場合、単一のルールを追加してそれらすべてを保存できます。

-keep class * extends my.package.MyBaseClass {
    void set*(***);
    *** get*();
}
于 2013-09-29T08:39:40.027 に答える
0

String "Panel1W"、"Panel2W"、および "Panel3W" が proguard によって混在しているかどうかを確認してください。これらの文字列をクラスで定義し、これらの文字列を保護するために proguard.cfg に保持できると思います。

于 2012-07-26T09:01:26.620 に答える