应用程序在Android 5.1和6.1中运行良好,但在4.10(API 16)中崩溃 [英] App works well in android 5.1 and 6.1 but crashes in 4.10(API 16)

查看:85
本文介绍了应用程序在Android 5.1和6.1中运行良好,但在4.10(API 16)中崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Android开发中的新手。我可以使该应用程序在Android 5.1中运行,但是当我尝试在Android 4.1中部署该应用程序时,它通常会在主要活动本身中崩溃。我理解它是因为我使用了矢量图像,而android 4.1与它不兼容。为了克服这个问题,我将代码设置如下:

I am a newbee in the Android development. I am able to make this app work in Android 5.1 and but however when I tried to deploy this app in Android 4.1 it used to crash in the main activity itself. I understood its becuase I used vector images and android 4.1 is not compatible with it. To overcome this I set the code as mentioned below:

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  
You’ll note this new attribute only exists in the version 2.0 of the Gradle Plugin. If you are using Gradle 1.5 you’ll instead use
 // Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }

我现在收到此错误


AndroidRuntime:致命例外:main java.lang.RuntimeException:无法启动activityComponentInfo {com.abc.efg.plcapp / com.abc.efg.ghi.MainActivity}:
android.view.InflateException:二进制XML文件第37行:错误
夸大了ImageView

的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)在
android.app.ActivityThread.access $ 600(ActivityThread.java:130)在
安卓
。 app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java: 137)android.app.ActivityThread.main(ActivityThread.java:4745)中的
java.lang.reflect.Method.invokeNative(本地方法)
在java.lang.reflect.Method.invoke(Method.java:511)

com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)处
在dalvik.system.NativeStart.main(本机方法)
原因:android.view.InflateException:二进制XML文件行#37:

处膨胀ImageView
时发生错误android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
在android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
在android.view.LayoutInflater.rInflate(LayoutInflater.java :736)android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
在android.view。 LayoutInflater.inflate(LayoutInflater.java:489)
在android.view.LayoutInflater.inflate (LayoutInflater.java:396)android.view.LayoutInflater.inflate中的
(LayoutInflater.java:352)

android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java :267)
at
android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at
MainActivity.onCreate(MainActivity.java:40)$ android.app.Activity.performCreate(Activity.java:5008)的b $ b android.app.Instrumentation.callActivityOnCreate(Instrumenta)的

tion.java:1079)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2084)
at android.app.ActivityThread.access $ 600(ActivityThread.java:130)
at
android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4745)处
在java.lang.reflect.Method.invokeNative(本机方法)在
处在java.lang.reflect.Method.invoke(方法。 java:511)

com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
在com.android.internal.os.ZygoteInit.main( ZygoteInit.java:553)在dalvik.system.NativeStart.main(Native Method)处
原因:android.content.res.Resources $ NotFoun dException:从android.content.res.Resources.loadDrawable(Resources.java:1918)的可绘制资源ID#0x7f020057
中的
res / drawable / ic_mood_24dp.xml文件中android.content处的
。 res.TypedArray.getDrawable(TypedArray.java:601)
在android.widget.ImageView。(ImageView.java:120)

android.support.v7.widget.AppCompatImageView。( AppCompatImageView.java:57)
at
android.support.v7.widget.AppCompatImageView。(AppCompatImageView.java:53)
at
android.support.v7。 app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
at
android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at
android。 support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at
android.support.v4.view.LayoutInflaterCompatHC $ FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
在android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)处
在android.view.LayoutInflater.rInflate(LayoutInflater.java:736)处
在android.view.LayoutInflater.parseInclude(LayoutInflater.java :830)在android.view.LayoutInflater.rInflate(LayoutInflater.java:736)上的
在android.view.LayoutInflater.inflate(LayoutInflater.java:489)上的
在android.view上的
。 LayoutInflater.inflate(LayoutInflater.java:396)
在android.view.LayoutInflater.inflate(LayoutInflater.java:352)处

android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)

android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)

MainActivity.onCreate(MainActivity.java:40)
在android.app.Activity.performCreate (Activity.java:5008)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
在android.app.ActivityThread .access $ 600(ActivityThread.java:130)
at
android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler。 java:99)android.os.Looper.loop(Looper.java:137)的
android.app.ActivityThread.main(ActivityThread.java:474的
5)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)

com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)在dalvik是
。 system.NativeStart.main(Native Method)
原因:org.xmlpull.v1.XmlPullParserException:二进制XML文件行
1:无效的可绘制标记向量

处android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)在
处android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
在android.content .res.Resources.loadDrawable(Resources.java:1915)
在android.content.res.TypedArray.getDrawable(TypedArray.java:601)
在android.widget.ImageView。(ImageView.java: 120)

android.support.v7.widget.AppCompatImageView。(AppCompatImageView.java:57)

android.support.v7.widget.AppCompatImageView。(AppCompatImageView.java:53)
at
android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
at
android.support.v7.app.AppCompatDelegateImplV7.java:963)
at
android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)

android.support.v4.view.LayoutInflaterCompatHC $ FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)

android.view.LayoutInflater.createViewFromT ag(LayoutInflater.java:675)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
在android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:736)处
在android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)处
在android.view.LayoutInflater.rInflate(LayoutInflater.java :736)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
在android.view.LayoutInflater.inflate(LayoutInflater.java:396)
在android.view.LayoutInflater.inflate(LayoutInflater.java:352)

android.support.v7.app .AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at
android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at
com.abc .efg.ghi.MainActivity.onCreate(MainActivity.java:40)
在android.app.Activity.performCreate(Activity.java:5008)

android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
在android.app.ActivityThread.access $ 600(ActivityThread.java:130)

android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)上
在android.app.ActivityThread.main(ActivityThread.java:4745)在Java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at
com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 786)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(Native Method)
06-28 20: 06: 42.790 1648-1648 /? I / Process:正在发送信号。 PID:1648 SIG:9

AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activityComponentInfo{com.abc.efg.plcapp/com.abc.efg.ghi.MainActivity}: android.view.InflateException: Binary XML file line #37: Error inflating class ImageView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class ImageView at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830) at android.view.LayoutInflater.rInflate(LayoutInflater.java:736) at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830) at android.view.LayoutInflater.rInflate(LayoutInflater.java:736) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at android.view.LayoutInflater.inflate(LayoutInflater.java:352) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) at MainActivity.onCreate(MainActivity.java:40) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  at android.app.ActivityThread.access$600(ActivityThread.java:130)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:4745)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  at dalvik.system.NativeStart.main(Native Method)  Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_mood_24dp.xml from drawable resource ID #0x7f020057 at android.content.res.Resources.loadDrawable(Resources.java:1918) at android.content.res.TypedArray.getDrawable(TypedArray.java:601) at android.widget.ImageView.(ImageView.java:120) at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:57) at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:53) at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106) at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963) at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022) at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)  at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)  at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)  at MainActivity.onCreate(MainActivity.java:40)  at android.app.Activity.performCreate(Activity.java:5008)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  at android.app.ActivityThread.access$600(ActivityThread.java:130)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:4745)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  at dalvik.system.NativeStart.main(Native Method)  Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line 1: invalid drawable tag vector at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877) at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818) at android.content.res.Resources.loadDrawable(Resources.java:1915) at android.content.res.TypedArray.getDrawable(TypedArray.java:601)  at android.widget.ImageView.(ImageView.java:120)  at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:57)  at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:53)  at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)  at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)  at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)  at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)  at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)  at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)  at com.abc.efg.ghi.MainActivity.onCreate(MainActivity.java:40)  at android.app.Activity.performCreate(Activity.java:5008)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  at android.app.ActivityThread.access$600(ActivityThread.java:130)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:4745)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  at dalvik.system.NativeStart.main(Native Method)  06-28 20:06:42.790 1648-1648/? I/Process: Sending signal. PID: 1648 SIG: 9

代码文件

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

import android.util.Log;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    Button btnRegister;
    Button btnRequestLog;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    private String android_id;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
if ( findViewById(R.id.fab) == null)
    {}
        else {

        }
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();

        // Buttons
        btnRegister = (Button) findViewById(R.id.btnRegister);
        btnRequestLog = (Button) findViewById(R.id.btnRequestLog);

XML文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

请帮助我进行调试。我有点困惑,需要您的帮助。

Please help me in debugging this. I am kind of stuck and would need your help.

推荐答案

您正在使用矢量可绘制对象。在Android 4.x及更早版本上,仅在以下情况下支持此功能:

You are using vector drawables. On Android 4.x and earlier, this is only supported if you:


  • 使用Android支持库23.x或更高版本✓

  • 在gradle构建文件中启用它(vectorDrawables.useSupportLibrary = true)✓

  • 使用 srcCompat 代替每当您使用 ImageView

  • use Android Support Libraries 23.x or later ✓
  • enable it in the gradle build file (vectorDrawables.useSupportLibrary = true) ✓
  • use srcCompat instead of src whenever you use ImageView

最后一项可能是需要解决的问题。

The last item is probably the problem that needs to be fixed.

这篇关于应用程序在Android 5.1和6.1中运行良好,但在4.10(API 16)中崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆