首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当minifyEnabled为真时,Parcelable / Parceler出错

当minifyEnabled为真时,Parcelable / Parceler出错
EN

Stack Overflow用户
提问于 2020-04-21 00:37:03
回答 1查看 292关注 0票数 0

设置minifyEnabled true时,将得到以下错误

无法为com.codeworks.myapp.FirestoreModel$$Parcelable找到生成的Parcelable类,请验证您的类配置是否正确,以及Parceler是否生成了Parcelable类

我在proguard-rules.pro中放置了如下代码,如parceler.org网站所示

代码语言:javascript
复制
# Parceler configuration
-keep interface org.parceler.Parcel
-keep @org.parceler.Parcel class * { *; }
-keep class **$$Parcelable { *; }
-keep class org.parceler.Parceler$$Parcels

..。并在FirestoreModel和片段的类中添加了@Keep注释:

代码语言:javascript
复制
@Parcel
@Keep
class FirestoreModel{
...
}

@Keep
class MyFragment: Fragment() {
...
}

然后添加了一些专业警卫规则,或者我从stackoverflow.com的示例中了解到的规则(因为我无法理解官方文档中的规则):

代码语言:javascript
复制
-keepnames class com.codeworks.myapp.MyFragment { *; }
-keepnames class com.codeworks.myappFirestoreModel { *; }

我仍然收到以下错误:

代码语言:javascript
复制
2020-04-21 08:07:38.554 28188-28188/com.codeworks.myapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.codeworks.myapp, PID: 28188
    h.a.d: Unable to find generated Parcelable class for com.codeworks.myappFirestoreModel, verify that your class is configured properly and that the Parcelable class com.codeworks.myappFirestoreModel$$Parcelable is generated by Parceler.
        at h.a.e$b.a(:154)
        at h.a.e.a(:73)
        at h.a.e.a(:57)
        at com.codeworks.myapp.MyFragment$onViewCreated$1.a(:103)
        at com.codeworks.myapp.MyFragment$onViewCreated$1.a(:68)
        at com.firebase.ui.firestore.FirestoreRecyclerAdapter.b(:158)
        at androidx.recyclerview.widget.RecyclerView$g.a(:7065)
        at androidx.recyclerview.widget.RecyclerView$g.a(:7107)
        at androidx.recyclerview.widget.RecyclerView$v.a(:6012)
        at androidx.recyclerview.widget.RecyclerView$v.a(:6279)
        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.e(: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:972)
        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
        at android.view.Choreographer.doFrame(Choreographer.java:727)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7464)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)

显然,onViewCreated函数在MyFragment上的变量名正在被重命名,尽管有支持保护规则。

这个错误似乎指向了这一行:

代码语言:javascript
复制
    // Here... at com.codeworks.myapp.MyFragment$onViewCreated$1.a(:68)
    adapter = object : FirestoreRecyclerAdapter<DpMemoModel, DpViewHolder>(options) {

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FirestoreViewHolder{

            val view : View = LayoutInflater.from(parent.context).inflate(R.layout.firestore_cardview, parent, false)

            return FirestoreViewHolder(view)
        }
        override fun onBindViewHolder(
            holder: FirestoreViewHolder,
            position: Int,
            model: FirestoreModel
        ) {
...
            // ...and Here: **at com.codeworks.myapp.MyFragment$onViewCreated$1.a(:103)**
            val wrapped : Parcelable = Parcels.wrap(model)

            holder.cardView.setOnClickListener {

                val intent= Intent(activity, FirestoreInfoActivity::class.java)
                intent.putExtra("parcel", wrapped)
                startActivity(intent)
            }

P.S.:我正在使用FirestoreRecyclerAdapter,我认为这是最好的方法,因为我正在处理Cloud和Firebase存储数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-21 10:09:33

我不知道哪里出了问题,也不知道错过了什么。我现在改用@Parcelize。代码要长一点,但至少可以工作。此外,没有必要使用:

代码语言:javascript
复制
# Parceler configuration
-keep interface org.parceler.Parcel
-keep @org.parceler.Parcel class * { *; }
-keep class **$$Parcelable { *; }
-keep class org.parceler.Parceler$$Parcels

proguard-rules.pro. ...in我所需要的只是在数据类中保留@注释。我花了一天半的时间研究,尝试和错误,但是,嗯,是的,拉维。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61334247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档