1.android view中的码下web view是什么?
2.Androidä¸Viewçå建è¿ç¨
3.androidèªå®ä¹view
4.Android ViewRootImpl
5.Android系统WebView是什么有什么用
6.Android View详解
android view中的web view是什么?
这是安卓系统内置webkit内核浏览器的一个组件,组件名称为Webview。码下WebView是码下安卓系统中一款基于webkit引擎、展现web页面的码下控件。 Android的码下Webview在低版本和高版本采用了不同的webkit版本内核,在版本更新到4.4后直接使用了Chrome版本。码下spring mvc 实战 源码
WebView能够对Web页面进行i显示和渲染,码下可以直接使用html文件(网络上或本地assets中)作布局,码下更可以可和JavaScript交互调用。码下
WebView控件功能强大,码下除了具有一般View的码下属性和设置外,还可以对url请求、码下页面加载、码下getmaxdeapth源码渲染、码下页面交互进行强大的码下处理。
总的来说,webView是用于展示网络请求后的结果,比如:开发者开发一款APP,如果想要用它访问网络,但是不想使用手机安装的浏览器,而是想在自己APP内部打开展示网页,此时就可以使用webView这个组件来展示网页。
扩展资料:
WebView组件使用的WebKit引擎。默认情况下,WebView不支持JavaScript,web页面的dpplayer源码错误也会被忽略,如果只是用Webview来显示网页而不用交互,默认配置就可以了。如果需要交互,就需要自定义配置了。
WebView加载远程网页语法格式:
webView.loadUrl("");
WebView加载assets目录下的本地网页语法格式:
webView.loadUrl("file:///android_asset/test.html");
WebView加载手机本地网页语法格式:
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
WebView加载HTML代码片段语法格式:
webView.loadData(data, "text/html", "utf-8");
webView.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);
百度百科-webkit之WebView
Androidä¸Viewçå建è¿ç¨
æ们ç¥éå¨onCreateéé¢Viewè¿æ¯æ²¡ææµç»å®æçãé£ä¹ä»ä¹æ¶åæµç»å®æäºï¼çæ¡æ¯onResumeãéè¿æ¥çæºç æ们å¯ä»¥çå°å¨onCreateæ¹æ³éé¢è°ç¨äºgetWindow()æ¹æ³ç¶åå¨å°æ们ç页é¢å¡å°è¿ä¸ªwindowéé¢ãè¿ä¸ªwindowä¹å°±æ¯PhonwWindow.
é£PhoneWindowæ¯ä»ä¹æ¶å被å建çï¼
è¿å°±å¼åºäºActivityçå建æµç¨ã
é£Activityæ¯æä¹è¢«å建çå¢ï¼
ç±äºActivityæ¯ä¸ä¸ªç»ä»¶ä»æ¯ç±ç³»ç»ä½¿ç¨ActivityThreadæ¹æ³å»å建çã
ç°å¨ææ¥åæä¸ï¼
å æ¥å°ActivityThreadç±»çhandleLaunchActivityæ¹æ³ã
å¯ä»¥çå°ä»å»è°ç¨äºActivityçperformCreateæ¹æ³ã
ç°å¨æ们ç»äºçå°onCreateæ¹æ³è¢«è°ç¨äºã
è¿éè¿æ个éç¹ï¼å¨performLaunchActivityéé¢å»è°ç¨ActivityçonCreateæ¹æ³ä¹åè¿å»åäºä¸ä»¶å¾éè¦çäºæ ï¼è¿ä¸ªäºæ å¨ç¬¬è¡ï¼è°ç¨äºActivityçattachæ¹æ³ã
ç°å¨è·å°Activityçattachæ¹æ³ï¼æ¾å°äºæ们ä¸ç´æ¾çPhoneWindowçå建ã
androidèªå®ä¹view
androidæä¹èªå®ä¹viewå¢ï¼ä¸ç¥éçå°ä¼ä¼´æ¥ççå°ç¼ä»å¤©çå享å§!
androidå¯ä»¥éè¿ç»åæ§ä»¶æ¥å®ç°èªå®ä¹viewãç»åæ§ä»¶å°±æ¯å°ç³»ç»åæçæ§ä»¶è¿è¡ç»åï¼ææä¸ä¸ªæ°çæ§ä»¶ãè¿ç§æ¹å¼ä¸ï¼ä¸éè¦å¼åè èªå·±å»ç»å¶å¾ä¸æ¾ç¤ºçå 容ï¼ä¹ä¸éè¦å¼åè éåonMeasureï¼onLayoutï¼onDrawæ¹æ³æ¥å®ç°æµéãå¸å±ä»¥ådrawæµç¨ã
å ·ä½æä½ï¼
1ãå®ä¹æ é¢æ å¸å±æ件
å®ä¹æ é¢æ çå¸å±æ件custom_title_view.xmlï¼å°è¿åæé®åæ é¢ææ¬è¿è¡ç»åãè¿ä¸æ¥ç¨äºç¡®å®æ é¢æ çæ ·åï¼ä»£ç å¦ä¸æ示ï¼
xmlversion="1.0"encoding="utf-8"?RelativeLayoutxmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
Button
android:id="@+id/btn_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:text="Back"
android:textColor="@android:color/white"/
TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Title"
android:textColor="@android:color/white"
android:textSize="sp"/
/RelativeLayout
2ãæ ¹æ®ç»å®å¸å±å®ç°èªå®ä¹View
publicclassCustomTitleViewextendsFrameLayoutimplementsView.OnClickListener{
privateView.OnClickListenermLeftOnClickListener;
privateButtonmBackBtn;
privateTextViewmTittleView;
publicCustomTitleView(@NonNullContextcontext,@NullableAttributeSetattrs){
super(context,attrs);
LayoutInflater.from(context).inflate(R.layout.custom_title_view,this);
mBackBtn=findViewById(R.id.btn_left);
mBackBtn.setOnClickListener(this);
mTittleView=findViewById(R.id.title_tv);
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btn_left:
if(mLeftOnClickListener!=null){
mLeftOnClickListener.onClick(v);
}
break;
}
}
publicvoidsetLeftOnClickListener(View.OnClickListenerleftOnClickListener){
mLeftOnClickListener=leftOnClickListener;
}
publicvoidsetTittle(Stringtitle){
mTittleView.setText(title);
}
}
说æï¼
ï¼1ï¼ä»£ç ä¸å¯¹å¤æä¾äºä¸¤ä¸ªæ¥å£ï¼ä¸æ¯å¨æ设置æ é¢ï¼äºæ¯ä½¿ç¨è å¯ä»¥èªå®ä¹è¿åæé®çç¹å»äºä»¶ã
ï¼2ï¼CustomTitleViewçæé å½æ°ï¼è¦éæ©ä¸¤ä¸ªåæ°çï¼éæ©å ¶å®åæ°çæé å½æ°ä¼æ¥éãè¿ä¸ç¹æ¯ç¬è å¼åæºæµè¯çç»æï¼ææ¶ä¸æ¸ æ¥æ¯ä¸æ¯ææææºä¸é½æ¯è¿æ ·ã
ï¼3ï¼è¿éæ¯ç»§æ¿çFrameLayoutï¼ä½æ¯ç»§æ¿LinearLayoutï¼RelativeLayoutçç³»ç»å¸å±æ§ä»¶é½å¯ä»¥ãä¹æ以è¦ç»§æ¿è¿äºç³»ç»ç°æçViewGroupï¼æ¯å 为è¿æ ·å¯ä»¥ä¸ç¨åéåonMeasureï¼onLayoutçï¼è¿æ ·çäºå¾å¤ãç±äºè¿éæ¯ä¸ä¸ªå¸å±æ§ä»¶ï¼è¦ç¨LayoutInflateræ¥å¡«å ï¼æ以éè¦ç»§æ¿ViewGroupï¼å¦æ继æ¿Viewçç´æ¥åç±»ï¼ç¼è¯ä¼ä¸éè¿ãæ以ï¼CustomTitleViewèªå·±å°±æ¯ä¸ä¸ªå®¹å¨ï¼å®å ¨å¯ä»¥å½æ容å¨ä½¿ç¨ï¼æ¤æ¶CustomTitleViewèªèº«çå 容ä¼åå ¶ä½ä¸ºç¶å¸å±æ·»å çåæ§ä»¶ï¼ææä¼å å ï¼å ·ä½çå å æææ¯æ ¹æ®ç»§æ¿ç容å¨ç¹æ§å³å®çã
3ãå¨Activityçå¸å±æ件ä¸æ·»å CustomTitleViewã
å¨Activityçå¸å±æ件activity_custom_view_compose_demo.xmlä¸ï¼å使ç¨ç³»ç»æ§ä»¶ä¸æ ·ä½¿ç¨CustomTitleViewå³å¯ãCustomTitleViewèªå·±å°±æ¯ç»§æ¿çç°æçç³»ç»å¸å±ï¼æ以å®ä»¬æ¥æçå±æ§ç¹æ§ï¼CustomTitleViewä¸æ ·æ¥æã
xmlversion="1.0"encoding="utf-8"?RelativeLayoutxmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
com.example.demos.customviewdemo.CustomTitleView
android:id="@+id/customview_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/com.example.demos.customviewdemo.CustomTitleView
/RelativeLayout
4ãå¨Activityä¸æä½CustomTitleViewï¼ä»£ç å¦ä¸ï¼
1publicclassCustomViewComposeDemoActivityextendsAppCompatActivity{ privateCustomTitleViewmCustomTitleView;4@Override5protectedvoidonCreate(BundlesavedInstanceState){ 6super.onCreate(savedInstanceState);7setContentView(R.layout.activity_custom_view_compose_demo);8mCustomTitleView=findViewById(R.id.customview_title);9mCustomTitleView.setTittle("ThisisTitle");mCustomTitleView.setLeftOnClickListener(newView.OnClickListener(){ @OverridepublicvoidonClick(Viewv){ finish();}});}}
å¨ç¬¬8è¡ä¸ï¼è·åå°CustomTitleViewå®ä¾ï¼ç¬¬9è¡è®¾ç½®æ é¢æåï¼ç¬¬è¡èªå®ä¹âBackâæé®ç¹å»äºä»¶ã
5ãææå¾
æç §å¦ä¸ç4æ¥ï¼å°±éè¿ç»åæ§ä»¶å®æäºä¸ä¸ªæ¯è¾ç®åçèªå®ä¹æ é¢æ ã
以ä¸å°±æ¯å°ç¼ä»å¤©çå享äºï¼å¸æå¯ä»¥å¸®å©å°å¤§å®¶ã
Android ViewRootImpl
æ¬æ主è¦åæ两个é®é¢ï¼
1ã为ä»ä¹View çç»å¶æµç¨æ¯ä» ViewRootImpl çperformTraversals()æ¹æ³å¼å§çï¼
2ãView çinvalidateæ¹æ³æ¯æä¹è§¦åå°ViewRootImpl çperformTraversals()æ¹æ³çã
å¨é 读æ¬æåï¼æ好å äºè§£windowçæ·»å è¿ç¨ï¼Androidæ¶æ¯å¤çæºå¶ å View çç»å¶æµç¨ãæ¨èå é 读以ä¸æç« ï¼
Android WindowåWindowManager
Android-æ¶æ¯æºå¶
Android View çç»å¶æµç¨
android æºç 注éçæææ¯ï¼ViewRootImplæ¯è§å¾å±æ¬¡ç»æç顶é¨ï¼å®ç° View å WindowManager ä¹é´æéçåè®®ãæ¯ WindowManager Global çå é¨å®ç°ä¸éè¦çç»æé¨åã
View çç»å¶æµç¨æ¯ä» ViewRootImpl çperformTraversals()æ¹æ³å¼å§çï¼é£å°åºæ¯åªéè°ç¨äºperformTraversals()æ¹æ³å¢ï¼ä¸é¢æ们åæä¸ä¸ï¼
1.ç§æå±æ§çperformTraversals()æ¹æ³è¯å®æ¯å¨å é¨è°ç¨èµ·æ¥çï¼ç»è¿æç´¢æ¾å°æ¯doTraversal()æ¹æ³è°ç¨äºã
2.æ¥çæ¾å°äºï¼è°ç¨äºdoTraversal() çTraversalRunnable ç±»
3.å é¨åªæä¸ä¸ªå°æ¹å®ä¾åäºTraversalRunnable çå®ä¾mTraversalRunnable ï¼æ¥å°å°ä¸¤ä¸ªæ¹æ³å é½è°ç¨äºmTraversalRunnable ï¼ææ¾ scheduleTraversals æ¯ä¸»å¨è§¦åè¿ä¸ª Runnable ãè¿å°±è¡¨æè°ç¨äºscheduleTraversals ()å½æ°çå°æ¹é½ä¸»å¨è§¦åäºviewçå·æ°ã
4.æ¥çæ们çä¸ä¸ mChoreographer.postCallback åäºä»ä¹
å¯ä»¥çå°ï¼æååèµ°è¿äºscheduleVsyncLocked()æ¹æ³å ã
5.mDisplayEventReceiver çç±» æ¯ FrameDisplayEventReceiverï¼ç»§æ¿èª
DisplayEventReceiver ã
æåèµ°å°è¿é就没äºï¼é£ä¹è¿ä¸ªæ¹æ³æ¯åäºä»ä¹å¢ï¼è¿ä¸ªæ¹æ³ç注éæ¯è¿ä¸ªææï¼å®æå¨ä¸ä¸ä¸ªæ¾ç¤ºå¸§å¼å§æ¶ä¼ éå个åç´åæ¥èå²ãææå°±æ¯ï¼è°ç¨äºè¿ä¸ªæ¹æ³å¯ä»¥æ¶å°ç³»ç»ä¼ éè¿æ¥çåç´åæ¥èå²ä¿¡å·ãAndroidç³»ç»æ¯émså°±ä¼åéä¸ä¸ªVSYNCä¿¡å·ï¼VSYNCï¼vertical synchronization åç´åæ¥ï¼å¸§åæ¥ï¼ï¼è§¦å对UIè¿è¡æ¸²æãè¿ä¸ªåç´åæ¥ä¿¡å¯¹äºåºç¨æ¥è¯´äºï¼åªæäºè®¢é äºçå¬ï¼æè½æ¶å°ãèä¸æ¯è®¢é ä¸æ¬¡ï¼æ¶å°ä¸æ¬¡ã
6.æ¢ç¶æ¯å¨è¿ä¸ªç±»éé¢è®¢é åç´åæ¥ä¿¡å·çï¼é£åè°ä¹åºè¯¥å¨è¿éãäºæ¯æ¾å°äºä»¥ä¸æ¹æ³ã
native code è°ç¨å° onVsyncï¼è¿ä¸ªæ¹æ³ç注é解éå¦ä¸ï¼å½æ¥æ¶å°åç´åæ¥èå²æ¶è°ç¨ãæ¥æ¶è åºè¯¥æ¸²æä¸ä¸ªå¸§ï¼ç¶åè°ç¨ { @link scheduleVsync} æ¥å®æä¸ä¸ä¸ªåç´åæ¥èå²ã
è¿ä¸ªæ¹æ³çå ·ä½å®ç°å¨åé¢åæå°çFrameDisplayEventReceiver ç±»éé¢ã
è¿éå¯ä»¥çå°ï¼å ¶å®mHandlerå°±æ¯å½å主线ç¨çhandlerï¼å½æ¥æ¶å°onVsyncä¿¡å·çæ¶åï¼å°èªå·±å°è£ å°Messageä¸ï¼çå°Looperå¤çï¼æåLooperå¤çæ¶æ¯çæ¶åå°±ä¼è°ç¨runæ¹æ³ï¼è¿éæ¯Handlerçæºå¶ï¼ä¸å解éã
7.æåï¼å¦ä¸å¾è°ç¨æ示ï¼æç»ä»mCallbackQueuesååä¹åæ·»å çä»»å¡åæ§è¡runæ¹æ³ï¼ä¹å°±æ¯TraservalRunnableçrunæ¹æ³ã
æ»ç»ä¸é¢çåæï¼è°ç¨æµç¨å¦ä¸å¾æ示å¦ä¸ï¼
ä¸é¢æ们åæå°åªè¦è°ç¨äºViewRootImpl çscheduleTraversals ()æ¹æ³ï¼æç»å°±è½è°ç¨äºViewRootImpl çperformTraversals()æ¥å¼å§ç»å¶ãé£è¯å®æ¯æ们常è°ç¨çviewå·æ°çæ¥å£ï¼ç»è¿ä¸ç³»åçæ¹æ³è°ç¨ï¼æç»è°ç¨äºViewRootImpl çscheduleTraversals ()æ¹æ³ãä¸é¢æ们åæä¸ä¸å¸¸ç¨çView ç invalidate()æ¥å£æ¯æä¹è°ç¨å°äºViewRootImpl çscheduleTraversals ()æ¹æ³ã
å¯ä»¥çåºï¼invalidateæå¤ä¸ªéè½½æ¹æ³ï¼ä½æç»é½ä¼è°ç¨invalidateInternalæ¹æ³ï¼å¨è¿ä¸ªæ¹æ³å é¨ï¼è¿è¡äºä¸ç³»åçå¤æï¼å¤æViewæ¯å¦éè¦éç»ï¼æ¥ç为该View设置æ è®°ä½ï¼ç¶åæéè¦éç»çåºåä¼ éç»ç¶å®¹å¨ï¼å³è°ç¨ç¶å®¹å¨çinvalidateChildæ¹æ³ã
æ¥çæ们çViewGroup#invalidateChildï¼
ç±äºä¸æåä¸è°ç¨ç¶å®¹å¨çæ¹æ³ï¼å°æåä¼è°ç¨å°ViewRootImplçinvalidateChildInParentæ¹æ³ï¼æ们æ¥ççå®çæºç ï¼ViewRootImpl#invalidateChildInParent:
æåè°ç¨äºscheduleTraversalsæ¹æ³ï¼è§¦åViewçå·¥ä½æµç¨ãè³æ¤ï¼æ们已ç»å®æ´å°åæäºä¸æ¬¡è°ç¨View ç invalidate()æ¹æ³å°è§¦åViewRootImpl çscheduleTraversals()æ¹æ³ã
Android系统WebView是什么有什么用
Android系统WebView是什么有什么用
WebView是Android系统中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件
可以加载网页或者加载JS代码
如果你想使用你需要添加网络权限
安卓系统webview是什么
Android WebView是使Android APP内显示网页内容的系统插件,XX App(百度、亚马逊、订票、汽车之家)要调用此插件显示信息,一般更新最新版本可以解决一些应用不能显示网页内容的错误。
Android View详解
在Android开发中,View扮演着核心的openquant源码角色。它是所有控件的基础类,无论是简单的文本显示(TextView)还是复杂的布局管理器(LinearLayout, ListView),它们都源于View这个抽象类。View不仅代表了界面元素,还扩展到ViewGroup,这个名字暗示了它能包含一组View,即一个控件集合。
View的位置控制是通过四个关键属性来实现的:top、left、right、bottom,它们分别对应View的myqcms源码上、左、右、下边界。通过getLeft()、getRight()、getTop()和getBottom()方法获取这些坐标。从Android 3.0开始,还引入了x、y、translationX和translationY,它们分别表示左上角的坐标以及相对于父容器的偏移。通过这些参数,我们可以计算出View的实际宽高和位置关系。
View的移动方式有两种:一是使用scrollTo/scrollBy方法,如将TextView内容移动到(-,-),这是基于绝对位置的移动。二是通过动画,如位移动画,可以实现实体View的移动。Android 3.0以后,我们还可以直接通过setTranslationX和setTranslationY进行移动,效果类似scrollTo。
实例演示中,我们创建了一个自定义TextView,通过重写onTouchEvent方法,捕捉触摸事件,实现随手指滑动而移动。这需要理解触摸事件的ACTION_DOWN、ACTION_MOVE和ACTION_UP,以及如何利用这些事件计算偏移并调整View的位置。
总结来说,本篇内容讲解了:View的基本概念,坐标和获取方法,移动方式的区别,以及通过实例操作来深化理解。希望对你理解Android View有所帮助。
Android-View-invalidate 绘制流程
Android中的View刷新机制,通过invalidate()方法触发的绘制流程如下:
首先,当调用View的invalidate(),它会将需要重绘的区域通知其父ViewGroup,并调用invalidateChild()方法。在软件绘制过程中,ViewRootImpl会接收这个请求,开始计算需要更新的区域,并通过scheduleTraversals()安排后续的绘制任务。
ViewRootImpl的scheduleTraversals()会通过Handler开启同步屏障,然后执行mTraversalRunnable中的回调,这个回调负责记录绘制时间,并调用performTraversals()开始绘制过程。这个过程主要包括performMeasure()、performLayout()和performDraw()三个步骤。
在performMeasure()中,View会调用onMeasure()进行尺寸计算;performLayout()涉及onLayout(),用于布局调整;而performDraw()则执行onDraw(),绘制UI。默认情况下,只有onDraw()会在invalidate()后执行,因为mLayoutRequested默认为false。若需要执行onMeasure()和onLayout(),则需通过requestLayout()手动设置mLayoutRequested为true。
总结来说,invalidate()的流程是:从子View向根布局传递刷新任务,由根布局驱动整个View Tree进行更新。在性能优化上,invalidate()仅触发onDraw(),避免了不必要的测量和布局计算。
androidwebviewä¸è½½(webviewappä¸è½½)
Androidä¸çwebview为ä½è®¾ç½®äºsetDownloadListeneræ æå¢
webviewéæ¯ç¨htmlè¯è¨ç®¡æ§çï¼å¨htmlè¯è¨é置顶就å¯ä»¥äºï¼ç¨ç»å¯¹ä½ç½®
ææºå®è£ webviewæ件å没æåºç°å¾æ æ¯ä»ä¹ååå¨Androidè·¨å ¥5.0çæ¬ä¹åï¼æ们å¨ä½¿ç¨Androidææºçè¿ç¨ä¸ï¼å¯è½ä¼åç°ä¸ä¸ªå¥ç¹çç°è±¡ï¼å°±æ¯ææºéçWebViewæ¯å¯ä»¥å¨åºç¨ååºå级ï¼èä¸éè¦è·éç³»ç»çã
è¿ä¸ç¹å¨iOSä¸å°æªå®ç°ï¼ï¼iOSOTAçåå²ä¹ä¸æ¯ç¹å«çæ ä¹ ï¼ãä½æ¯webview.apkä¸æ¯ä¸ä¸ªæ®æ®ééçapkï¼é¦å å®æ²¡æå¾æ ï¼ä¸ç®æ¯ç¹å»å¯å¨çâAppâãåæ¶ï¼æ´æ°è¿ä¸ªAPKï¼ä¼è®©ææ使ç¨webviewçåºç¨é½å¾å°æ´æ°ï¼åªææ¯webviewä¸çUIï¼æ¯å¦åè¿åéä¹ä¸æ ·ï¼å¾å°æ´æ°ã
è¿ä¸ç¹æ¯å¦ä½åå°çå¢ï¼ä»å¤©æ们æ¥åæä¸webviewè¿ä¸ªå¥ç¹çAPKã
AndroidèµæºåèµæºID
å¦æå¼åè¿Androidçå°ä¼ä¼´ï¼å¯¹Rè¿ä¸ªç±»æ¯çæå¾ä¸è½åçæäºï¼ä¸ä¸ªRç±»ï¼éé¢ææçâå符串âæ们é½çå¾æï¼ä½æ¯ä¸å åå è¿å¶çæ°åï¼æ们å¯è½å¹¶ä¸æ¯é常ççæï¼æ¯å¦çè§ä¸ä¸ªRé¿è¿æ ·ï¼
publicclassR{
publicstaticclasslayout{
publicstaticfinalintactivity_main=0x7f
}
}
åé¢é£ä¸²åå è¿å¶çæ°åï¼æ们ä¸è¬ç§°ä¹ä¸ºèµæºID(resId)ï¼å¦æä½ å¯¹Ræ´çæä¸ç¹ï¼æ´å¯ä»¥ç¥éèµæºidå ¶å®æ¯æè§å¾çï¼å®çè§å¾å¤§æ¦æ¯
0xPPTTEEEE
å ¶ä¸PPæ¯packageIdï¼TTæ¯typeIdï¼EEEEæ¯æè§å¾åºæ¥çå®ä½IDï¼EntryIdï¼ï¼ä»å¤©æ们è¦å ³æ³¨çæ¯ååä½ãå¦æä½ æ¾ç»å ³æ³¨çè¯ï¼ä½ 大æ¦ä¼ç¥éï¼æ们ååºæ¥çAppï¼ä¸è¬PPå¼æ¯7Fã
æ们ç¥éandroidé对ä¸åæºå以åä¸ååºæ¯ï¼å®ä¹äºè®¸è®¸å¤å¤configï¼æç»å ¸ç¨¿å¤æ£çå¤è¯è¨åºæ¯ï¼
values/values-en/values-zh-CNæ们使ç¨ä¸ä¸ªå符串èµæºå¯è½ä½¿ç¨çæ¯ç¸åçIDï¼ä½æ¯æ¿å°çå ·ä½å¼æ¯ä¸åçãè¿ä¸ªæ¨¡åå°±æ¯ä¸ä¸ªè¡¨æ¨¡åââidä½ä¸ºä¸»é®ï¼æ¥è¯¢å°ä¸è¡æ°æ®ï¼åæ ¹æ®å®é æ åµéæ©æä¸åï¼ä¸è¡ä¸åç¡®å®ä¸ä¸ªæç»å¼ï¼
è¿ç§æ¨¡å对æ们å¨ä¸é®æååºæ¯ä¸éè¦ä½¿ç¨âåä¸å«ä¹âçèµæºæä¾äºé常大ç便æ·ãAndroidä¸æä¸ä¸ªç±»å«AssetManagerå°±æ¯è´è´£è¯»åRä¸çidå¼ï¼æç»å°ä¸ä¸ªå«resources.arscç表ä¸æ¾å°å ·ä½èµæºçè·¯å¾æè å¼è¿åç»Appçã
æ件åä¸çèµæºåºå®
æ们ç»å¸¸å¬è§Androidæ件åæ¹æ¡éï¼æä¸ä¸ªæ¦å¿µå«åºå®IDï¼è¿æ¯ä»ä¹ææå¢ï¼æ们å设ä¸å¼å§ä¸ä¸ªApp访é®çèµæºidæ¯0x7fï¼å®æ¯ä¸å¼ å¾çï¼è¿æ¶åæ们ä¸åäºæ°çæ件å ï¼å¨æ建çè¿ç¨ä¸ï¼æ°å¢äºä¸ä¸ªå符串ï¼æ°å¥½è¿å¼ å¾çå¨ç¼è¯ä¸è¿è¡äºæç§æåºï¼æåºçç»æ使å¾oxPPTTä¸çstringçTTåæäºï¼äºæ¯è¿ä¸ªå符串çidåæ°å¥½åæäº0x7fãé£ä¹è代ç åå»è®¿é®è¿ä¸ªèµæºçæ¶åï¼è®¿é®0x7fï¼è¿æ¶åæ¿å°çä¸åæ¯å¾çï¼èæ¯ä¸ä¸ªå符串ï¼é£ä¹AppçCrashå°±æ¯ç¾é¾æ§çäºã
å æ¤ï¼æ们ææèµæºidä¸æ¦çæï¼å°±ä¸è¦åå¨æ¥å¨å»äºãä½æ¯è¿éåæä¸ä¸ªé常æ¾ç¼çé®é¢ï¼å¦æpackageIdæ°¸è¿æ¯7fï¼é£ä¹æ¾ç¶æ¯ä¸å¤é¾æ¯ç¨çï¼æ们ç¥éæä¸å®çæ¹æ¡å¯ä»¥æ´æ¹packgeIdï¼åªè¦å¨ä¸åä¸å¡å ä¸ä½¿ç¨ä¸åçpackageIdï¼è¿æ ·è½æ大é¿å id碰æçé®é¢ï¼ä¸ºæ件å使ç¨å¤é¨èµæºæä¾äºæ¡ä»¶ã
ççï¼æ们å¨å¼å¤´è¯´å°äºwebview.apkçæ´æ°ââ代ç ï¼èµæºé½å¯ä»¥æ´æ°ãè¿å¬ä¸å»ä¸å°±æ¯æ件åçä¸ç§åï¼Googleåºç¨å¼åè æ æç¥çæ åµä¸ï¼å°åºæ¯æä¹å®ç°webviewçæ件åçå¢ï¼å¦ææ们æå¼äºè¿ä¸å±ç¥ç§çé¢çº±ï¼æ们æ¯ä¸æ¯ä¹å¯ä»¥ç¨è¿ä¸ªæ件åçç¹æ§äºå¢ï¼
çæ¡å½ç¶æ¯è¯å®çã
WebViewAPKåandroidç³»ç»èµæº
æä½ä¸ºä¸ä¸ªAndroidå·¥å ·é¾å¼åï¼å¨å¼å§å¥½å¥webviewçæ¶åï¼æwebview.apkä¸è½½è¿æ¥ç第ä¸æ¶é´ï¼å°±æ¯æå®æè¿AndroidStudioï¼çä¸çè¿ä¸ªAPKå°åºæåªéä¸åã
ä»ç»çï¼å®èµæºçpackgeIdæ¯ï¼ç´è§åè¯æï¼0è¿ä¸ªå¼å¾ç¹æ®ã
æ们åçä¸å¤§åé¼é¼çandroidsdkä¸çandroid.jaræä¾çèµæºã
è¿é说个é¢å¤è¯ï¼æ们使ç¨androidç³»ç»èµæºï¼æ¯å¦@android:color/redè¿æ ·çæ¹å¼ï¼å ¶å®å°±æ¯ä½¿ç¨å°äºandroid.jarä¸æä¾çèµæºãæ们å¯ä»¥æè¿ä¸ªandroid.jaréå½åæandroid.apkï¼æè¿AndroidStudioä¸è¿è¡æ¥çã
æ们çå°ï¼android.jarä¸èµæºçpackageIdæ¯ãç´è§åè¯æï¼1è¿ä¸ªå¼ä¹å¾ç¹æ®ï¼ï¼2çä¸å»å°±ä¸é£ä¹ç¹æ®äºï¼è¿ä¸ªçå®ç°ï¼å ¶å®é çä¹ç¥éæ¯æä¹åçââæpackageIdä½ä¸ºä¿çidï¼androidç³»ç»ä¸èµæºçidæ°¸ä¹ åºå®ï¼é£ä¹ææappæ¿å°ç0xå¼å¤´çèµæºæ°¸è¿æ¯ç¡®å®çï¼æ¯å¦ï¼æ们å»æ¥çcolor/blackè¿ä¸ªèµæºï¼æ¥çä¸é¢é£å¼ 表éçç»ææ¯0xcï¼é£ä¹æè³å°ç¡®å®æè¿ä¸ªçæ¬ææandroidææºç@android:color/blackè¿ä¸ªèµæºçidå ¨é½æ¯0xcãæ们å¯ä»¥åä¸ä¸ªdemo为è¯ï¼æç¼è¯ä¸ä¸ªxmlæ件ï¼
webview使ç¨loadDataWithBaseURLæ¹æ³çæ¶åæ¯æ²¡æé®é¢ï¼ä½æ¯å¨ScrollViewä¸è¾¹ä½¿ç¨çæ¶åï¼å¨å°ç±³ææºæ¾ç¤ºä¸äºï¼å¨ä¸ä¸ªé¡µé¢ä¸çH5使ç¨SVGè¿è¡ç»å¾ï¼ä½æ¯å¨VIVOåOPPOææºé½æ æ³æ¾ç¤ºï¼æåç½ä¸æ¥äºä¸å èµæï¼åç§Settings设置ï¼ä½æ¯è¿æ¯ä¸æ¾ç¤ºï¼æè§è¿æ¯SVGå ¼å®¹æ§é®é¢ï¼OPPOåVIVOroomåçä¹
æ¥æ¥æ¥ï¼å®åå¼åï¼webviewéå°ç£åé¾æ¥å¦ä½è°ç¨è¿ é·ä¸è½½
è¿ é·ï½ä¸è½½ï¼ä¸»é¡µå³ä¸ï¼ï½ï¼ï¼ä¸è½½é¡µå³ä¸ï¼ï½æ°å»ºä¸è½½é¾æ¥ã
androidwebviewæä¹ä½¿ç¨æ¬å°ç¼åandroid
webview使段å·ç¨æ¬å°ç¼åçè¯ï¼æè·¯å¦ä¸ï¼
å®ä¹ä¸ä¸ªç¦»çº¿ä¸è½½çæå¡Service
å¯å¨åå°æå¡Serviceæ¥æ§è¡å¼æ¥ä¸è½½
åå¨å°æ¬å°æ°æ®åºä¸
æ¯ä¸æ¬¡å è½½urlä¹åï¼å å¤ææ°æ®åºæ¯å¦åå¨ç¼åå 容
5.å¦æåå¨ç¼åï¼ä¼å å è½½æ¬å°ç¼åï¼å¦ç¥çæ»æè æä¸åå¨ï¼ææ§è¡èç½è¯·æ±
androidwebviewå è½½ç½é¡µå¾æ ¢ï¼èæµè§å¨å¾å¿«Android客æ·ç«¯ä¸æ··æHTML页é¢ï¼ä¼åºç°è½ç¶HTMLå å®¹è½½å ¥å®æï¼æ é¢ä¹æ£å¸¸æ¾ç¤ºï¼ä½æ¯æ´ä¸ªç½é¡µéè¦çå°è¿5ç§ï¼çè³æ´å¤ï¼æ¶é´æä¼æ¾ç¤ºåºæ¥ãç 究äºå¾ä¹ ï¼ç®é¾éæéäºå½å¤å¾å¤å¤å¦ç½ç«ï¼ä¹çè¿PhoneGapç代ç ï¼ä¸ç´æ 解ã
ä¸è¬äººå WebViewçå éï¼é½æ¯å»ºè®®å ç¨webView.getSettings().setBlockNetworkImage(true);å°å¾çä¸è½½é»å¡ï¼ç¶åå¨æµè§å¨çOnPageFinishedäºä»¶ä¸è®¾ç½®webView.getSettings().setBlockNetworkImage(false);éè¿å¾çç延è¿è½½å ¥ï¼è®©æ¦è£ç½é¡µè½æ´å¿«å°æ¾ç¤ºã
ä½æ¯ï¼éè¿å®é çæ¥å¿åç°ï¼AndroidçOnPageFinishedäºä»¶ä¼å¨Javascriptèæ¬æ§è¡å®æä¹åæä¼è§¦åãå¦æå¨é¡µé¢ä¸ä½¿ç¨JQueryï¼ä¼å¨å¤çå®DOM对象ï¼æ§è¡å®$(document).ready(function(){ });äºä»¶èªä¼åæä¼æ¸²æ并æ¾ç¤ºé¡µé¢ãå¦ä¸å¾
详ç»ä»£ç
Android5.xå Rootå级系ç»WebViewAndroidçç³»ç»ç¢çåé®é¢å¯ä»¥è¯´æ¯Androidç³»ç»æ大ç硬伤äºï¼èªè¿ä¸ªç³»ç»è¯ç以æ¥åå å¹´è¿å»äºï¼ä¾ç¶æ²¡è½å¾å¥½ç解å³ï¼ç¢çåé®é¢ä¹æ¯æ¯ä¸ªAndroidå¼åå·¥ç¨å¸å¿ä¸çéç?ï¼æ¯æ¬¡å¤çç³»ç»ç¢çå带æ¥çé®é¢æ¶ï¼è¡åä¹è½ååéé£åå°+ï¼ä¸ºäºåè½»å ¶ä»åä»ççè¦ä»¥åæ¤ååéå°ç±»ä¼¼é®é¢è½å°è¸©å 个åï¼å°±ä¹åçç¬åç»åå个记å½å§ã
æå ³WebieViewçéè¦æ§åå ¶ä½¿ç¨ä¸æ¯æ¬æçéç¹ï¼ä½æ¯æå 个ç¸å ³çå±æ§æä»¬å¿ é¡»äºè§£ï¼
å¨Android4.4ï¼APIlevelï¼ç³»ç»ä»¥åï¼Android使ç¨äºåçèªå¸¦çAndroidWebkitå æ ¸ï¼è¿ä¸ªå æ ¸å¯¹HTML5çæ¯æä¸æ¯å¾å¥½ï¼ç°å¨ä½¿ç¨4.4以ä¸æºåçä¹ä¸å¤äºï¼å°±ä¸å¯¹è¿ä¸ªå æ ¸åè¿å¤ä»ç»äºï¼æå ´è¶£å¯ä»¥çä¸è¿è¾©ä¸é·ç¯æç« ã
ä»æºå¼¯Android4.4ç³»ç»å¼å§ï¼Chromiumå æ ¸å代äºWebkitå æ ¸ï¼æ£å¼å°æ¥ç®¡äºWebViewç渲æå·¥ä½ãChromiumæ¯ä¸ä¸ªå¼æºçæµè§å¨å æ ¸é¡¹ç®ï¼åºäºChromiumå¼æºé¡¹ç®ä¿®æ¹å®ç°çæµè§å¨é常å¤ï¼å æ¬æèåçChromeæµè§å¨ï¼ä»¥åä¸ä¼å½å æµè§å¨ï¼æµè§å¨ãQQæµè§å¨çï¼ãå ¶ä¸Chromiumå¨Androidä¸é¢çå®ç°æ¯AndroidSystemWebView^1ã
ä»Android5.0ç³»ç»å¼å§ï¼WebView移æ¤æäºä¸ä¸ªç¬ç«çapkï¼å¯ä»¥ä¸ä¾èµç³»ç»èç¬ç«åå¨åæ´æ°ï¼æ们å¯ä»¥å¨ç³»ç»-设置-AndroidSystemWebViewçå°WebViewçå½åçæ¬ã
ä»Android7.0ç³»ç»å¼å§ï¼å¦æç³»ç»å®è£ äºChrome(version)ï¼é£ä¹Chromeå°ä¼ç´æ¥ä¸ºåºç¨çWebViewæä¾æ¸²æï¼WebViewçæ¬ä¼éçChromeçæ´æ°èæ´æ°ï¼ç¨æ·ä¹å¯ä»¥éæ©WebViewçæå¡æä¾æ¹ï¼å¨å¼åè é项-WebViewImplementationéï¼ï¼WebViewå¯ä»¥è±ç¦»åºç¨ï¼å¨ä¸ä¸ªç¬ç«çæ²çè¿ç¨ä¸æ¸²æ页é¢ï¼éè¦å¨å¼åè é项éæå¼ï¼^2ã
ä»Android8.0ç³»ç»å¼å§ï¼é»è®¤å¼å¯WebViewå¤è¿ç¨æ¨¡å¼ï¼å³WebViewè¿è¡å¨ç¬ç«çæ²çè¿ç¨ä¸^3ãââèéèªå¦ä½è®¾è®¡ä¸ä¸ªä¼é å¥å£®çAndroidWebViewï¼ï¼ä¸ï¼
WebViewçå åå¨AOSPä¸çå¼æ¯com.android.webviewï¼è¯¥å¼æ¯å¨AOSPæ建è¿ç¨ä¸ç¼è¯ççæ¬ï¼ä¹å°±æ¯è¯´å®æ¯åç³»ç»ä¸èµ·è¢«ç¼è¯åºæ¥çï¼ç±äºå¤§é¨åç第ä¸æ¹ææºå¶é åé½æèªå·±çå®å¶ROMï¼æ以å åä¹æ¯ä¸å°½ç¸åï¼æ¯å¦MIUIROMä¸å®å·²ç»è¢«æ¹ä¸ºcom.mi.webkit.coreãä»WebViewççæ¬åå²ä¸å¯ä»¥çå°èªAndroid5.0å¼å§WebView移æ¤æäºä¸ä¸ªç¬ç«çapkï¼å¯ä»¥ä¸ä¾èµç³»ç»èç¬ç«åå¨åæ´æ°ï¼è¿æ¶åèµ·WebViewçå åå°±æ£å¼æ¹ä¸ºcom.google.android.webviewäºã
æ以è¿å°±æ¯éæ ¸ä¸ºä»ä¹ç½ä¸ä¸å 人é®ä¸ºå¥å级äºä¸ä¸ç³»ç»WebViewï¼Appå 使ç¨å°WebViewçå°æ¹æè æ¯å ç½®æµè§å¨ä¸ç¢°å°±æ¥PackageManager$NameNotFoundException:com.google.android.webviewæè PackageManager$NameNotFoundException:com.android.webviewä¹ç±»çé误ï¼è¿äºé®é¢å¨Android5.0çæºå¨ä¸é常常è§ï¼å ä¸ºä½ å级äºWebViewä¹åTMDå åé½åäº?ï¼èROMå®å¶åä¸è¬å¨çæ¬è¡æ¥æ¶é½å¾ä¿å®ï¼æ以å³ä½¿ç³»ç»åå°äºAndroid5.0ï¼è§£å³æ¹æ¡æªå¿ å°±æ¯ææ°çï¼å ç½®çWebViewä¾ç¶å¯è½æ¯ç¡¬ç¼ç è¿ROMçï¼æ以系ç»ç¯å¢å¼ç¨çå åå¯è½ä¾æ§æ¯com.android.webviewï¼ä½ å级å°com.google.android.webviewå®å½ç¶ä¸è®¤è¯äº?ã
éè¿ä¸é¢ä¸éåºè¯ï¼ä½ åºè¯¥ç¥éäºï¼æ¿æ¢çåå°±å¨å¦æä½ æ¢ä¸å»çWebViewå åååå ç½®çWebViewå åä¸ä¸è´ï¼å°±æ æ³ä½¿ç¨ï¼æ以就éè¦æ¾ä¸ä¸ªå åä¸è´çé«çæ¬APKäºï¼è¿æä¸ç§æ¹æ³æ¯å¨ç³»ç»ç®å½æ个é ç½®æ件éæ¹ä¸ªä»ä¹å¼ï¼ä¹å°±æ¯å åå¼ç¨ï¼è¿æ ·ä½ å°±è½æ¢æä»»ä½å åçAPKäºï¼è¿ä¸ªææ¶æ²¡ä»ç»ç 究ï¼åç»æç»æäºåæ´æ°ã
APKMirroræ¯ä¸ä¸ªAPKéåç«ç¹ï¼å¨è¿éå¯ä»¥æ¾å°å¾å¤APKçreleaseçæ¬ä»¥ååå²çæ¬ï¼å°¤å ¶Googleå ¨å®¶æ¡¶ç³»åçAPKéå¸¸å ¨ï¼æ们å¨è¿éæ ¹æ®éæ±ç´æ¥æç´¢å åå°±å¯ä»¥äºï¼æè¿ééè¦com.android.webviewï¼æ£ç´¢å°å¦ä¸ç»æï¼å¯ä»¥çå°è¿äºé½æ¯ä»ç¬¬ä¸æ¹ROMéæååºæ¥çã
å 为Googleå®æ¹æ©å¨WebViewçæ¶å就已ç»å°å åæ¢æcom.google.android.webviewäºï¼ææ°çæ¯.xxxï¼æç¿»äºé¡µææ¾å°ææ©æ¹å并ç¬ç«åºæ¥çé£ä¸ªçæ¬?ã
adbconnect...
adbshell
su
mount-orw,remount/system
è¿éåç®å½ä¸çæ件åå«æ/webview/webview.apkå/webview/lib/arm/libwebviewchromium.soï¼å¤ä»½åç®å½ï¼
cd/system/app
mvwebview/webview-b/
mkdir-pwebview/lib/arm/
è¿éå¾ç®åï¼æ件åç¼.apkç´æ¥æ¹æ.zipç¶å解å缩ï¼å¤å¶åºlibwebviewchromium.soå³å¯
å ä¸ä¼ æ件å°è®¾å¤/sdcardï¼ç¶åæ§è¡å¦ä¸å½ä»¤ç§»å¨è¿å»ï¼ååè·¯å¾ä»¥ååæ件åä¿æä¸è´å³å¯ã
mv/sdcard/xxx.apk/system/app/webview/webview.apk
mv/sdcard/xxx.so/system/app/webview/lib/arm/libwebviewchromium.so
cd/system/app/
chmodwebview/
*adbreboot
å¦ä¸ä¸é¡¿æä½ï¼å ¶å®ä¹æ²¡ä»ä¹é¾åº¦ï¼ä¸»è¦çåå°±æ¯å åä¸è´çé®é¢ï¼è¿æä¸äºç³»ç»ç®å½è®¿é®æéä¹ç±»çé®é¢ï¼ä¹åç½ä¸æäºå¥½å¤ï¼é½è¯´ä¸root没æ³æ¢ï¼æè æ¢äºä¼åºé®é¢ï¼rootæéå ¶å®å°±æ¯ä¸ºäºè®¿é®ååå ¥ç³»ç»ç®å½ï¼éè¿éæ°æ载就解å³äºï¼æ¢äºä¼å´©æçé®é¢å ¶å®å°±æ¯åå²éçé®é¢ï¼ä»4.xè¿åº¦å°5.0WebViewç¬ç«äºï¼æ以å ååäºï¼æè æ¯ROMå®å¶æ¹ä¸æå¥è·¯æ¥å¯¼è´æ¢ä¸å»çWebViewä¸è¢«ç³»ç»è¯å«ï¼åªè¦æ¾å°åéçå 就解å³äºã