1、使用Android Studio自带的Layout Inspector;
2、使用SDK工具包中的UI Automator Viewer;
3、使用dumpsys命令
通过adb shell dumpsys activity top
命令,拿到activity
的快照,内部包含布局信息。
也可以通过指定包名,只获取你自己应用的Activity信息:
adb shell dumpsys activity com.ldd.layoutapp(包名)
E:\Android\AndroidStudioProjects\LayoutApp>adb shell dumpsys activity com.ldd.layoutapp
TASK 10123:com.ldd.layoutapp id=89 userId=0
ACTIVITY com.ldd.layoutapp/.MainActivity a6fb414 pid=15302
Local Activity ba99d88 State:
mResumed=true mStopped=false mFinished=false
mIsInMultiWindowMode=false mIsInPictureInPictureMode=false
mChangingConfigurations=false
mCurrentConfig={1.0 310mcc260mnc [en_US] ldltr sw432dp w432dp h792dp 400dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2160) mAppBounds=Rect(
0, 0 - 1080, 2040) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.1}
mLoadersStarted=true
Active Fragments in 104513d:
#0: ReportFragment{1c55d32 #0 androidx.lifecycle.LifecycleDispatcher.report_fragment_tag}
mFragmentId=#0 mContainerId=#0 mTag=androidx.lifecycle.LifecycleDispatcher.report_fragment_tag
mState=5 mIndex=0 mWho=android:fragment:0 mBackStackNesting=0
mAdded=true mRemoving=false mFromLayout=false mInLayout=false
mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
mRetainInstance=false mRetaining=false mUserVisibleHint=true
mFragmentManager=FragmentManager{104513d in HostCallbacks{a1a1a83}}
mHost=android.app.Activity$HostCallbacks@a1a1a83
Child FragmentManager{5836400 in ReportFragment{1c55d32}}:
FragmentManager misc state:
mHost=android.app.Activity$HostCallbacks@a1a1a83
mContainer=android.app.Fragment$1@969c439
mParent=ReportFragment{1c55d32 #0 androidx.lifecycle.LifecycleDispatcher.report_fragment_tag}
mCurState=5 mStateSaved=false mDestroyed=false
Added Fragments:
#0: ReportFragment{1c55d32 #0 androidx.lifecycle.LifecycleDispatcher.report_fragment_tag}
FragmentManager misc state:
mHost=android.app.Activity$HostCallbacks@a1a1a83
mContainer=android.app.Activity$HostCallbacks@a1a1a83
mCurState=5 mStateSaved=false mDestroyed=false
ViewRoot:
mAdded=true mRemoved=false
mConsumeBatchedInputScheduled=false
mConsumeBatchedInputImmediatelyScheduled=false
mPendingInputEventCount=0
mProcessInputEventsScheduled=false
mTraversalScheduled=false mIsAmbientMode=false mUnbufferedInputSource=0
android.view.ViewRootImpl$NativePreImeInputStage: mQueueLength=0
android.view.ViewRootImpl$ImeInputStage: mQueueLength=0
android.view.ViewRootImpl$NativePostImeInputStage: mQueueLength=0
Choreographer:
mFrameScheduled=false
mLastFrameTime=54431098 (840399 ms ago)
InsetsController:
InsetsState
InsetsSource type=ITYPE_STATUS_BAR frame=[0,0][1080,60] visible=true
InsetsSource type=ITYPE_NAVIGATION_BAR frame=[0,2040][1080,2160] visible=true
InsetsSource type=ITYPE_TOP_GESTURES frame=[0,0][1080,60] visible=true
InsetsSource type=ITYPE_BOTTOM_GESTURES frame=[0,2040][1080,2160] visible=true
InsetsSource type=ITYPE_LEFT_GESTURES frame=[0,0][0,2160] visible=true
InsetsSource type=ITYPE_RIGHT_GESTURES frame=[1080,0][1080,2160] visible=true
InsetsSource type=ITYPE_TOP_TAPPABLE_ELEMENT frame=[0,0][1080,60] visible=true
InsetsSource type=ITYPE_BOTTOM_TAPPABLE_ELEMENT frame=[0,2040][1080,2160] visible=true
InsetsSource type=ITYPE_IME frame=[0,0][0,0] visible=false
View Hierarchy:
DecorView@8e81a7e[MainActivity]
android.widget.LinearLayout{e59dbdf V.E...... ........ 0,0-1080,2040}
android.view.ViewStub{abac02c G.E...... ......I. 0,0-0,0 #10201af android:id/action_mode_bar_stub}
android.widget.FrameLayout{6196af5 V.E...... ........ 0,60-1080,2040}
androidx.appcompat.widget.ActionBarOverlayLayout{5e7608a V.E...... ........ 0,0-1080,1980 #7f08007d app:id/decor_content_parent}
androidx.appcompat.widget.ContentFrameLayout{7aa56fb V.E...... ........ 0,140-1080,1980 #1020002 android:id/content}
android.widget.LinearLayout{b29b318 V.E...... ........ 0,0-1080,1840}
com.google.android.material.textview.MaterialTextView{1e2c171 VFED..C.. ........ 0,0-387,97 #7f08006f app:id/constraintLayoutAct1}
com.google.android.material.textview.MaterialTextView{2e2fb56 VFED..C.. ........ 0,97-507,194 #7f08014f app:id/singleInstanceAct}
com.google.android.material.textview.MaterialTextView{dbd67d7 V.ED..... ........ 0,194-350,345 #7f08017d app:id/text}
androidx.appcompat.widget.ActionBarContainer{692e8c4 V.ED..... ........ 0,0-1080,140 #7f080032 app:id/action_bar_container}
androidx.appcompat.widget.Toolbar{b1103ad V.E...... ........ 0,0-1080,140 #7f080030 app:id/action_bar}
androidx.appcompat.widget.AppCompatTextView{a2b76e2 V.ED..... ........ 40,36-284,103}
androidx.appcompat.widget.ActionMenuView{786aa73 V.E...... ........ 1080,0-1080,140}
androidx.appcompat.widget.ActionBarContextView{437cd30 G.E...... ......I. 0,0-0,0 #7f080038 app:id/action_context_bar}
android.view.View{f672da9 V.ED..... ........ 0,2040-1080,2160 #1020030 android:id/navigationBarBackground}
android.view.View{88e1f2e V.ED..... ........ 0,0-1080,60 #102002f android:id/statusBarBackground}
Looper (main, tid 2) {d977acf}
(Total messages: 0, polling=false, quitting=false)
里面的 View Hierarchy: 部分就是你的Activity布局的完整层级结构了。