web-dev-qa-db-ja.com

Proguardが有効なNoSuchMethodException

この問題は発生しません。次のようにProguardを有効にしないと:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
    }
}

Logcat:

Java.lang.RuntimeException: Java.lang.NoSuchMethodException: com.example.NewUsers$f.<init> [class Android.view.View]
    at i.c.a.b.f.b(:147)
    at androidx.recyclerview.widget.RecyclerView$g.a(:7078)
    at androidx.recyclerview.widget.RecyclerView$v.a(:6235)
    at androidx.recyclerview.widget.RecyclerView$v.b(:6118)
    at androidx.recyclerview.widget.RecyclerView$v.d(:6114)
    at androidx.recyclerview.widget.LinearLayoutManager$c.a(:2303)
    at androidx.recyclerview.widget.LinearLayoutManager.a(:1627)
    at androidx.recyclerview.widget.LinearLayoutManager.a(:1587)
    at androidx.recyclerview.widget.LinearLayoutManager.c(:665)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(:4134)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(:3851)
    at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(:1897)
    at androidx.recyclerview.widget.RecyclerView$a.run(:414)
    at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:996)
    at Android.view.Choreographer.doCallbacks(Choreographer.Java:794)
    at Android.view.Choreographer.doFrame(Choreographer.Java:725)
    at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:981)
    at Android.os.Handler.handleCallback(Handler.Java:883)
    at Android.os.Handler.dispatchMessage(Handler.Java:100)
    at Android.os.Looper.loop(Looper.Java:237)
    at Android.app.ActivityThread.main(ActivityThread.Java:7807)
    at Java.lang.reflect.Method.invoke(Native Method)
    at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:493)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1047)
 Caused by: Java.lang.NoSuchMethodException: com.example.NewUsers$f.<init> [class Android.view.View]
    at Java.lang.Class.getConstructor0(Class.Java:2332)
    at Java.lang.Class.getConstructor(Class.Java:1728)
    at i.c.a.b.f.b(:144)
    at androidx.recyclerview.widget.RecyclerView$g.a(:7078) 
    at androidx.recyclerview.widget.RecyclerView$v.a(:6235) 
    at androidx.recyclerview.widget.RecyclerView$v.b(:6118) 
    at androidx.recyclerview.widget.RecyclerView$v.d(:6114) 
    at androidx.recyclerview.widget.LinearLayoutManager$c.a(:2303) 
    at androidx.recyclerview.widget.LinearLayoutManager.a(:1627) 
    at androidx.recyclerview.widget.LinearLayoutManager.a(:1587) 
    at androidx.recyclerview.widget.LinearLayoutManager.c(:665) 
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(:4134) 
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(:3851) 
    at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(:1897) 
    at androidx.recyclerview.widget.RecyclerView$a.run(:414) 
    at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:996) 
    at Android.view.Choreographer.doCallbacks(Choreographer.Java:794) 
    at Android.view.Choreographer.doFrame(Choreographer.Java:725) 
    at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:981) 
    at Android.os.Handler.handleCallback(Handler.Java:883) 
    at Android.os.Handler.dispatchMessage(Handler.Java:100) 
    at Android.os.Looper.loop(Looper.Java:237) 
    at Android.app.ActivityThread.main(ActivityThread.Java:7807) 
    at Java.lang.reflect.Method.invoke(Native Method) 
    at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:493) 
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1047) 

現在のプロガード:

-keep class com.example.models.** { *; }

Javaクラス:

public class NewUsers extends AppCompatActivity {

    ....

    @RequiresApi(api = Build.VERSION_CODES.Lollipop)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_users);

        ....

        mNewUsersList = findViewById(R.id.newUsers);
        mNewUsersList.setHasFixedSize(true);
        mNewUsersList.setLayoutManager(new LinearLayoutManager(this));

        onStart();

    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<Users, UsersViewHolder> adapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(
                Users.class,
                R.layout.users_list,
                UsersViewHolder.class,
                mDatabaseReference
        ) {

            @Override
            protected void populateViewHolder(UsersViewHolder usersViewHolder, Users users, int position) {
                usersViewHolder.setName(users.getName());

            }
        };
        mNewUsersList.setAdapter(adapter);
    }

    public static class UsersViewHolder extends RecyclerView.ViewHolder {
        View mView;

        public UsersViewHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setName(String name) {
            TextView mUserNameView = mView.findViewById(R.id.textViewUserName);
            mUserNameView.setText(name);
        }
    }
}

可能性はありますか、リリースのために縮小と縮小を有効にしたいだけです

モデル:

public class Users {

    String name;

    public Users() {
    }

    public Users(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
4
Android

解決策1:

保持するクラスをcom.example.modelからcom.exampleに変更します。

より良い解決策

このクラスを使用しているファイルに適切にインポートし、いかなるリフレクションも使用していない場合、proguardはこれを削除しないでください。

このクラスにアクセスするためにリフレクションまたは間接メソッドを使用する必要がない可能性がある共通の位置に配置してみてください

0
mayank1513

Java.lang.RuntimeException:Java.lang.NoSuchMethodException:com.example.NewUsers $ f。 [class Android.view.View] at i.c.a.b.f.b(:147)

上記の例外は、特定のメソッドが見つからない場合にスローされます。ここはプロガードによるものです。あなたは試してみるべきです

-keep class com.example.** { *; }
-keepclassmembers class com.example.** { *; }

パッケージ全体に @Keep を追加すると、クラス全体がそのまま保持されます。メソッドまたはフィールドに追加すると、メソッド/フィールド(およびその名前)だけでなく、クラス名もそのまま保持されます。

OPは

public class HomeActivity extends AppCompatActivity { 

private TextView f2032b; 
private Button f2033c; 

ご参考までに

これらの追加の最適化を有効にするには、プロジェクトのgradle.propertiesファイルに以下を含めます。

Android.enableR8.fullMode=true

ランタイムの問題を回避するために、追加のProGuardルールを含める必要がある場合があります。 Enable more aggressive optimizations に関する公式ガイドラインを読む

0
IntelliJ Amiya

クラスのパッケージはcom.exampleですが、プロガードルールはcom.example.models。これを修正すると問題が解決するはずです。

0
Pedro Loureiro