Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android mvvm的Proguard规则设置_Android_Mvvm_Kotlin_Dagger 2_Android Proguard - Fatal编程技术网

Android mvvm的Proguard规则设置

Android mvvm的Proguard规则设置,android,mvvm,kotlin,dagger-2,android-proguard,Android,Mvvm,Kotlin,Dagger 2,Android Proguard,没有Proguard规则设置,代码运行正常。但是,当我在发布版本中启用proguard时,项目成功构建。应用程序已成功安装,但在启动应用程序时每次都会崩溃 这是错误日志 2018-10-29 13:52:04.299 1942-1942/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.eighsquare.mcoopon, PID: 1942 java.lang.RuntimeException: Unable to

没有Proguard规则设置,代码运行正常。但是,当我在发布版本中启用proguard时,项目成功构建。应用程序已成功安装,但在启动应用程序时每次都会崩溃

这是错误日志

2018-10-29 13:52:04.299 1942-1942/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.eighsquare.mcoopon, PID: 1942
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.eighsquare.mcoopon/com.eighsquare.mcoopon.ui.splash.SplashActivity}: java.lang.RuntimeException: Cannot create an instance of class com.eighsquare.mcoopon.ui.splash.a
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.eighsquare.mcoopon.ui.splash.a
        at androidx.lifecycle.v$a.a(ViewModelProvider.java:202)
        at androidx.lifecycle.v.a(ViewModelProvider.java:135)
        at androidx.lifecycle.v.a(ViewModelProvider.java:103)
        at com.eighsquare.mcoopon.base.BaseActivity$b.b(**BaseActivity.kt**:32)
        at com.eighsquare.mcoopon.base.BaseActivity$b.a(BaseActivity.kt:16)
        at kotlin.o.a(LazyJVM.kt:74)
        at com.eighsquare.mcoopon.base.BaseActivity.q(Unknown Source:7)
        at com.eighsquare.mcoopon.base.BaseActivity.onCreate(BaseActivity.kt:50)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.NoSuchMethodException: <init> [class android.app.Application]
        at java.lang.Class.getConstructor0(Class.java:2320)
        at java.lang.Class.getConstructor(Class.java:1725)
        at androidx.lifecycle.v$a.a(ViewModelProvider.java:200)
        at androidx.lifecycle.v.a(ViewModelProvider.java:135) 
        at androidx.lifecycle.v.a(ViewModelProvider.java:103) 
        at com.eighsquare.mcoopon.base.BaseActivity$b.b(BaseActivity.kt:32) 
        at com.eighsquare.mcoopon.base.BaseActivity$b.a(BaseActivity.kt:16) 
        at kotlin.o.a(LazyJVM.kt:74) 
        at com.eighsquare.mcoopon.base.BaseActivity.q(Unknown Source:7) 
        at com.eighsquare.mcoopon.base.BaseActivity.onCreate(BaseActivity.kt:50) 
        at android.app.Activity.performCreate(Activity.java:7009) 
        at android.app.Activity.performCreate(Activity.java:7000) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
此代码放置在BaseActivity中以创建Viewmodel

这是我的基本活动。kt

abstract class BaseActivity<VM : ViewModel, DB : ViewDataBinding>(private val mViewModelClass: Class<VM>) : AppCompatBaseActivity() {

@LayoutRes
abstract fun getLayoutRes(): Int

abstract val viewModelFactory: ViewModelProvider.Factory?


val binding by lazy {
    DataBindingUtil.setContentView(this, getLayoutRes()) as DB
}


val viewModel by lazy {
    if (viewModelFactory != null)
        ViewModelProviders.of(this, viewModelFactory).get(mViewModelClass)
    else ViewModelProviders.of(this).get(mViewModelClass)

}


/**
 * If you want to inject Dependency Injection
 * on your activity, you can override this.
 */
open fun onInject() {}

open fun initView() {}

override fun onCreate(savedInstanceState: Bundle?) {
    onInject()
    LayoutInflaterCompat.setFactory2(layoutInflater, IconicsLayoutInflater2(delegate))

    super.onCreate(savedInstanceState)
    initViewModel(viewModel)

    initView()

}

/**
 *
 *  You need override this method.
 *  And you need to set viewModel to binding: binding.viewModel = viewModel
 *
 */
abstract fun initViewModel(viewModel: VM)


fun isNetworkConnected(): Boolean {
    return NetworkUtils.isNetworkConnected(this)
}


fun hideKeyboard() {
    Utils.hideKeyboard(this)
}

fun changeFragment(fragment: Fragment, cleanStack: Boolean = false, addToBackStack: Boolean = true) {
    Utils.changeFragment(this, fragment, cleanStack, addToBackStack)
}
抽象类BaseActivity(private val mViewModelClass:class):AppCompatBaseActivity(){
@布局
抽象趣味getLayoutRes():Int
抽象val viewModelFactory:ViewModelProvider.Factory?
通过lazy绑定val{
DataBindingUtil.setContentView(这是getLayoutRes())作为DB
}
由lazy创建的val视图模型{
如果(viewModelFactory!=null)
ViewModelProviders.of(这是viewModelFactory.get)(mViewModelClass)
else ViewModelProviders.of(this.get)(mViewModelClass)
}
/**
*如果你想注入依赖注入
*在您的活动中,您可以覆盖此选项。
*/
打开趣味onInject(){}
打开视图(){}
重写创建时的乐趣(savedInstanceState:Bundle?){
onInject()
LayoutFlaterCompat.setFactory2(LayoutFlater,图标SlayYoutInflater2(代理))
super.onCreate(savedInstanceState)
initViewModel(viewModel)
initView()
}
/**
*
*您需要重写此方法。
*您需要将viewModel设置为binding:binding.viewModel=viewModel
*
*/
抽象视图模型(视图模型:VM)
乐趣isNetworkConnected():布尔值{
返回NetworkUtils.isNetworkConnected(此)
}
趣味隐藏板(){
Utils.hideKeyboard(本)
}
fun changeFragment(fragment:fragment,cleanStack:Boolean=false,addToBackStack:Boolean=true){
changeFragment(this、fragment、cleanStack、addToBackStack)
}
}

我用的是匕首2
我在寻找解决方案的过程中浪费了2个小时。堆栈溢出是最后的希望。

经过长时间的研究,我找到了一个解决方案。 我只需要在ViewModel类中添加public@injectconstructor eg

class FullScreenViewModel public@Inject构造函数(应用程序:应用程序):BaseViewModel(应用程序){}

很抱歉,但仍然会遇到相同的错误。发布您的BaseActivity代码问题已更新为BaseActivity.kt共享您的proguard规则。这是proguard设置链接
abstract class BaseActivity<VM : ViewModel, DB : ViewDataBinding>(private val mViewModelClass: Class<VM>) : AppCompatBaseActivity() {

@LayoutRes
abstract fun getLayoutRes(): Int

abstract val viewModelFactory: ViewModelProvider.Factory?


val binding by lazy {
    DataBindingUtil.setContentView(this, getLayoutRes()) as DB
}


val viewModel by lazy {
    if (viewModelFactory != null)
        ViewModelProviders.of(this, viewModelFactory).get(mViewModelClass)
    else ViewModelProviders.of(this).get(mViewModelClass)

}


/**
 * If you want to inject Dependency Injection
 * on your activity, you can override this.
 */
open fun onInject() {}

open fun initView() {}

override fun onCreate(savedInstanceState: Bundle?) {
    onInject()
    LayoutInflaterCompat.setFactory2(layoutInflater, IconicsLayoutInflater2(delegate))

    super.onCreate(savedInstanceState)
    initViewModel(viewModel)

    initView()

}

/**
 *
 *  You need override this method.
 *  And you need to set viewModel to binding: binding.viewModel = viewModel
 *
 */
abstract fun initViewModel(viewModel: VM)


fun isNetworkConnected(): Boolean {
    return NetworkUtils.isNetworkConnected(this)
}


fun hideKeyboard() {
    Utils.hideKeyboard(this)
}

fun changeFragment(fragment: Fragment, cleanStack: Boolean = false, addToBackStack: Boolean = true) {
    Utils.changeFragment(this, fragment, cleanStack, addToBackStack)
}
class FullScreenViewModel public @Inject constructor(application: Application) : BaseViewModel<Any?>(application) {}