移动互联网名词

复习题目和范围

Android等移动开发开发环境,各部、功能、用法、流程等,术语SDK、NDK、clang、avd、adb、studio等。
Android中的技术,GUI元素和界面设计、声音录放、静图/动图、网路通信、性能C、权限、GPS和地图、二维码等。

传感器技术和创意应用设计,再举例:街头棋局app。https://blog.csdn.net/lanrenxiaowen/article/details/108051656

通信技术,ip、port、socket、tcp/udp/sctp、multicast/mdns、proxy、http/s、socks、mq、p2p、nat、socat、ssh/-L-R-D、JSch

与桌面开发不同的移动开发技术。

移动开发和云的结合:计算能力和续航能力的平衡、分布式计算或数据存储、云备份、安全加密等。
与时俱进的移动开发技术,各方面:接入、通信、存储、界面、显示、Web/HTML、云、各种识别等。

从HTML/5到WebView的开发技术和过程。

H5/Canvas和Android/Canvas

Android上app代码运行优化的机制和过程等:JVM、DVM、JIT、AOT、ART等

从APK结构解析,到Android安全技术和对抗逆向。

术语和线索词汇

Activity

推荐阅读

Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。在编程范式中,应用是通过 main() 方法启动的,而 Android 系统与此不同,它会调用与其生命周期特定阶段相对应的特定回调方法来启动 Activity 实例中的代码。

本文介绍了 Activity 的概念,并提供了有关如何使用 Activity 的简要说明。要详细了解有关设计应用架构的最佳做法,请参阅应用架构指南

Activity 的概念

移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式开始。例如,如果您从主屏幕打开电子邮件应用,可能会看到电子邮件列表,如果您通过社交媒体应用启动电子邮件应用,则可能会直接进入电子邮件应用的邮件撰写界面。

Activity 类的目的就是促进这种范式的实现。当一个应用调用另一个应用时,调用方应用会调用另一个应用中的 Activity,而不是整个应用。通过这种方式,Activity 充当了应用与用户互动的入口点。您可以将 Activity 实现为 Activity 类的子类。

Activity 提供窗口供应用在其中绘制界面。此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面。通常,一个 Activity 实现应用中的一个屏幕。例如,应用中的一个 Activity 实现“偏好设置”屏幕,而另一个 Activity 实现“选择照片”屏幕。

大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。例如,一个简单的电子邮件应用中的主 Activity 可能会提供显示电子邮件收件箱的屏幕。主 Activity 可能会从该屏幕启动其他 Activity,以提供执行写邮件和打开邮件这类任务的屏幕。

虽然应用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小。事实上,Activity 经常会启动属于其他应用的 Activity。例如,浏览器应用可能会启动社交媒体应用的“分享”Activity。

adb

推荐阅读

Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发机器上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
  • 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。

adb 的工作原理

当您启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推

如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。

服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端(或从某个脚本)控制任意设备。

android:onClick

点击事件监听,对应于安卓事务。

这里使用四种onClick单击事件,来实现电话拔号器的DEMO。

XML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:ems="10"
android:id="@+id/et_number"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dial_number"
android:id="@+id/bt_dial"
android:layout_below="@id/et_number"
android:layout_alignRight="@id/et_number"
android:layout_alignEnd="@id/et_number" />

第一种、匿名内部类:

1
2
3
4
5
6
7
8
9
10
11
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_dial = (Button) findViewById(R.id.bt_dial);
bt_dial.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialPhone();
}
});
}

第二种、自定义单击事件监听类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_number = (EditText) MainActivity.this.findViewById(R.id.et_number);

Button bt_dial = (Button) findViewById(R.id.bt_dial);
bt_dial.setOnClickListener(new MyListener());
}

private class MyListener implements View.OnClickListener {
@Override
public void onClick(View view) {
dialPhone();
}
}

第三种、Activity继承View.OnClickListener,由Activity实现OnClick(View view)方法,在OnClick(View view)方法中用switch-case对不同id代表的button进行相应的处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends Activity implements View.OnClickListener {
EditText et_number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_number = (EditText) MainActivity.this.findViewById(R.id.et_number);

Button bt_dial = (Button) findViewById(R.id.bt_dial);
bt_dial.setOnClickListener(this);

}

public void onClick(View view) {

switch (view.getId()){
case R.id.bt_dial:
dialPhone();
break;
default:
break;
}
}
}

第四种、在XML文件中显示指定按钮的onClick属性,这样点击按钮时会利用反射的方式调用对应Activity中的click()方法:

1
2
3
4
5
6
7
8
9
<Button
android:onClick="dialPhoneMethod"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dial_number"
android:id="@+id/bt_dial"
android:layout_below="@id/et_number"
android:layout_alignRight="@id/et_number"
android:layout_alignEnd="@id/et_number" />
public void dialPhoneMethod(View view){
    dialPhone();
}
 
private void dialPhone() {
    String number = et_number.getText().toString().trim();
 
    if (TextUtils.isEmpty(number)){
        Toast.makeText(this, "电话号码不能为空", Toast.LENGTH_LONG).show();
        return;
    }
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:" + number));
    startActivity(intent);
}

总结:
第四种写法整个代码中都不用声明button就可以实现button的单击事件。但通常不推荐这样使用,第三种方法是onClick最佳的的使用方式。按钮少的时候用匿名内部类会比较快,比如写demo测试的时候。

————————————————
原文链接:https://blog.csdn.net/a78270528/article/details/46953541

AnimationDrawable

推荐阅读

在某些情况下,图片需要在屏幕上呈现动画效果。如果您希望显示由多张图片组成的自定义加载动画,或者希望一个图标在用户执行操作后变为另一个图标,这种做法就非常实用。Android 提供了两个选项供您为可绘制对象添加动画效果。

第一个选项是使用 AnimationDrawable。使用该选项,您可以指定多个静态可绘制对象文件(每次展示一个)来创建动画。第二个选项是使用 AnimatedVectorDrawable。使用该选项,您可以为矢量可绘制对象的属性添加动画效果。

使用 AnimationDrawable

要为 Drawables 添加动画效果,一种方法是接连加载一系列可绘制资源以创建动画。从某种意义上来说,这是一种传统动画,使用一系列不同的图片创建而成,然后像一卷胶卷一样按顺序播放。AnimationDrawable 类是可绘制动画的基础。

虽然您可以使用 AnimationDrawable 类 API 在代码中定义动画帧,但使用单个 XML 文件(其中列出构成动画的各个帧)可更轻松地完成此操作。此类动画的 XML 文件位于 Android 项目的 res/drawable/ 目录中。在这种情况下,具体指令是每个动画帧的顺序和时长。

XML 文件包含一个 <animation-list> 元素(用作根节点)和一系列子 <item> 节点(每个节点定义一个帧):帧和帧时长的可绘制资源。以下是可绘制动画的 XML 文件示例:

1
2
3
4
5
6
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

此动画仅运行 3 帧。通过将列表的 android:oneshot 属性设置为 true,此动画仅循环一次,然后便停止并保持在最后一帧。如果设置为 false,则动画会一直循环。将此 XML 文件另存为 rocket_thrust.xml(位于项目的 res/drawable/ 目录中)后,可将其作为背景图片添加到视图,然后进行调用以播放。在以下示例 Activity 中,该动画添加到了 ImageView 中,然后在用户轻触屏幕时呈现动画效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

rocketImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rocketAnimation.start();
}
});
}

请务必注意,对 AnimationDrawable 调用的 start() 方法不能在 Activity 的 onCreate() 方法期间调用,因为 AnimationDrawable 尚未完全附加到窗口。如果您想立即播放动画而无需互动,那么您可能需要从 Activity 中的 `onStart()``` 方法进行调用,该方法会在 Android 在屏幕上呈现视图时调用。

aosp

官网推荐阅读

Android 是一个适用于移动设备的开源操作系统,也是由 Google 主导的对应开源项目。此网站和 Android 开源项目 (AOSP) 代码库可为您提供所需信息和源代码,供您创建定制的 Android 操作系统版本,将设备和配件移植到 Android 平台,同时确保您的设备符合兼容性要求,从而让 Android 生态系统维持良好稳健的运行环境,以便更好地服务于数百万用户。


AOSP 是由谷歌主导的一个开源项目,通过 AOSP 可以编译出一个比较纯净的,可以用于智能设备的操作系统。

Android 系统是开源的 AOSP 和额外的闭源部分(其中包括 GMS )的组合而成,所以可以认为 Android=AOSP+GMS 。

网友有一个通俗的比喻:AOSP 是个毛坯房,Android 是个精装房

由于 AOSP 是开源的,一些第三方机构就可以以 AOSP 为基础,做出自己的改进,并对不同机型适配,然后自己取一个名字。

比如小米的 MIUI、华为的 EMUI、或者魅族的 Flyme。

HarmonyOS

阅读参考

鸿蒙是一个面向全场景的分布式操作系统,蒙是基于微内核的全场景分布式操作系统,目前华为已经将鸿蒙捐献给了开放原子开源基金会

有人说鸿蒙是基于 2012 年华为的 LiteOS 开发而来,LiteOS 是轻量级物联网操作系统,目前也以及完全开源。

从客观上来讲,鸿蒙肯定借鉴了 LiteOS 开发中所积累的经验,所以华为鸿蒙OS 算是 LiteOS 的一个发展产物,但它们是两款完全不同的操作系统。

这里还需要和大家明确,区分一个概念,说实话如果不是为了给大家写这篇文章,查了很多资料,不然我也混淆的。

Openharmony 和 HarmonyOS(鸿蒙操作系统) 是两个完全不同的概念!

HarmonyOS 是华为研发的面向万物互联时代的全新的、独立的智能终端操作系统,为不同设备的智能化、互联与协同提供统一的语言。

华为把 HarmonyOS 中基础功能提取出来,打包成功一个项目叫做:Openharmony ,把 Openharmony 捐献给原子开源基金会。

华为这次发布的 HarmonyOS 2 是华为基于开源项目 OpenHarmony 2.0 开发的面向多种全场景智能设备的商用版本。

OpenHarmony 是华为主要贡献的,不属于华为,属于开源组织;而 HarmonyOS 是华为的商业系统,属于华为拥有。

国产厂商为什么不跟进?

大家如果明白上面这两个概念的区别之后,就应该很容易明白,为什么国内厂商没有跟进鸿蒙?

上面说的有点绕,做一个简单的比喻大家应该就明白了:

HarmonyOS 2 = Openharmony 2 + 华为的 EMUI + 兼容安卓部分

根据这个公式,我们可以回答好几个问题:

1、Openharmony 是不兼容安卓的,也没有什么 AOSP 的事情,是一个纯正、独立的开源操作系统。

2、HarmonyOS 2 是不开源的,是华为基于 Openharmony 2 开发的一个商业版本。

为了兼容安卓应用,必定使用了一些 AOSP 的内容,同时华为是不可能将 EMUI 开放给同行的,所以同行厂商没办法直接使用 HarmonyOS 2

3、如果让国内同行都兼容鸿蒙的话,他们需要做的工作是:基于 Openharmony 2 开发自己的 UI。

比如 MIUI + 兼容以前应用,工作量巨大,可能不是一时半会就可以搞定,同时他们还需要考虑谷歌在国外对他们制裁的风险。

可以套用上面的比如:Openharmony 2 是个毛坯房,而 HarmonyOS 2 是个精装房。

apk

参考阅读

APK是Android Package的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把android sdk编译的工程打包成一个安装程序文件,格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别。


Android应用程序包(英语:Android application package,APK),是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。 一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)

ARM

参考阅读

ARM架构,称为进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于行动通讯领域,符合其主要设计目标为低耗电的特性。

在今日,ARM家族占了所有32位嵌入式处理器75%的比例,使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到,从可携式装置(PDA、移动电话、多媒体播放器、掌上型电子游戏,和计算机)到电脑外设(硬盘、桌上型路由器)甚至在导弹的弹载计算机等军用设施中都有他的存在。在此还有一些基于ARM设计的派生产品,重要产品还包括Marvell的XScale架构和德州仪器的OMAP系列。

优势:价格低;能耗低;

X86架构

是一个复杂指令集CISC(Complex Instruction Set Computer)处理器架构。X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多、强得多。X86的CPU随便就是1G以上、双核、四核。X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,而且X86结构的电脑出现了近30年,其配套扩展的设备种类多、价格也比较便宜,所以X86结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。

ARM 和x86的区别

ARM 架构注重的是续航能力, X86 架构注重的是性能

  • (1) ARM系统的作用:ARM的Jazelle技术使Java加速得到比基于软件的Java虚拟机(JVM)高得多的性能,和同等的非Java加速核相比功耗降低80%。
  • (2) Android X86的作用:项目的主要目的在于为X86平台提供一套完整的Android 系统解决方案。这个项目提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB。
  • (3) ARM系统的特点:耗电少,功能强;16位/32位双指令集;合作伙伴众多。
  • (4) Android X86的特点:具有更完善的安装程序和多重启动系统;支持鼠标及部分键盘;支持待机功能;支持部分触摸屏;支持压缩档案格式。

RISC-V

RISC-V是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。V表示为第五代RISC.与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件。RISC-V被认为是继x86、ARM之后的第三大CPU架构。

RISC-V包括三大优势,

  1. 模块化:RISC-V将不同的部分以模块化的方式组织在一起,这种模块化是x86与ARM架构所不具备的。
  2. 指令数目少:受益于短小精悍的架构以及模块化的特性,RISC-V架构的指令数目非常的简洁。
  3. RISC-V全面开源,且具有全套开源免费的编译器、开发工具和软件开发环境,大大降低指令集修改的门槛。

RISC-V作为新兴架构,以其精简的体量,未来的IoT(物联网)领域中能取得绝对的优势。IoT的“碎片化”需求,IoT芯片设计速度要快、成本要低、能量身定制。同时嵌入式市场具备少量多样的特点,在各细分应用场景并未形成真正壁垒,架构的选择五花八门。以上原因成就了RISC-V绝佳的突破口。RISC-V的开源能降低成本,也能让用户自由修改,可定制化,RISC-V生态与敏捷设计同源。

目前,国内外已有多家芯片企业投入大量资金研发RISC-V在IoT领域的应用。2015年,RISC-V基金会正式成立,吸引了包括英伟达、NXP、三星、Microsemi在内等企业的加入。迄今为止,该基金会已吸引了全球28个国家327多家会员加入。目前,阿里、亚马逊等都有相关芯片研制出,甚至就连苹果A4/A5、AMD速龙/Zen架构之父JimKeller也创业投身RISC-V了。

AOT

参考文档

AOT是干嘛的

AOT 是静态编译,应用在安装的时候会启动 dex2oat 过程把 dex预编译成 ELF 文件,每次运行程序的时候不用重新编译。 ART 对 Garbage Collection(GC)过程的也进行了改进:

  1. 只有一次 GC 暂停(Dalvik 需要两次)
  2. 在 GC 保持暂停状态期间并行处理
  3. 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
  4. 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见
  5. 压缩 GC 以减少后台内存使用和碎片

AOT的缺陷

  • 应用安装和系统升级之后的应用优化比较耗时(重新编译,把程序代码转换成机器语言)
  • 优化后的文件会占用额外的存储空间(缓存转换结果)

JIT

参考阅读同上

JIT意思是Just In Time Compiler,就是即时编译技术,与Dalvik虚拟机相关。

JIT是干嘛的

JIT在Android2.2到Android4.4版本,JIT的目的是为了提高Android的运行效率。

Dalvik虚拟机可以看做是一个Java虚拟机。在 Android系统初期,每次运行程序的时候,Dalvik负责将dex翻译为机器码交由系统调用。这样有一个缺陷每次执行代码,都需要Dalvik将操作码代码翻译为机器对应的微处理器指令,然后交给底层系统处理,运行效率很低

为了提升效率Android在2.2版本中添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行即时编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。JIT 编译器可以对执行次数频繁的 dex/odex 代码进行编译与优化,将 dex/odex 中的 Dalvik Code(Smali 指令集)翻译成相当精简的 Native Code 去执行,JIT 的引入使得 Dalvik 的性能提升了 3~6 倍。

JIT缺陷

  • 每次启动应用都需要重新编译(没有缓存)
  • 运行时比较耗电,耗电量大

dex

参考1参考2

dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。

相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。

当java程序编译成class后,还需要使用dex工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加紧凑,dex文件是传统jar文件大小的50%左右。

dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余。

从宏观上来说dex的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。

为何要研究dex格式?因为dex里面包含了所有app代码,利用反编译工具可以获取java源码。理解并修改dex文件,就能更好的apk破解和防破解。

dex好处

dex文件有个天大的好处:它可以直接用DexClassLoader类加载,这叫动态加载。于是我们只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

一般的反编译流程是什么样子的

下载apk文件,然后解压 ,得到 class.dex 文件

用dex2jar 把 class.dex 还原成 classes-dex2jar.jar 文件

用 jd-gui.exe 把 classes-dex2jar.jar 文件打开,就可以看到源码了。

DVM

什么是Dalvik?

Dalvik是Google公司自己设计用于Android平台的虚拟机。 Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一,它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃时候所有程序都被关闭。

很长时间以来,Dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。2014年6月25日,Android L正式亮相于召开的谷歌i/o大会,Android L改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART.

Dalvik和JVM有啥关系?

主要区别:

Dalvik是基于寄存器的,而JVM是基于栈的。

Dalvik运行dex文件,而JVM运行java字节码

自Android 2.2开始,Dalvik支持JIT(just-in-time,即时编译技术)。

优化后的Dalvik较其他标准虚拟机存在一些不同特性:

1.占用更少空间

2.为简化翻译,常量池只使用32位索引

3.标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的”虚拟寄存器”区。这样减少了Dalvik的指令指数,提高了翻译速度。

ART

ART是一个AOT编译器。所谓AOT (Ahead of Time)是指在运行以前就把中间代码静态编译成本地代码,而JIT (Just inTime)则是在运行时动态编译。

ART 使用AOT,在安装apk时会进行预编译,生成OAT文件,仍以.odex保存,但是与Dalvik下不同,这个文件是可执行文件。dex、odex 均可通过dex2oat生成oat文件,以实现兼容性。在大型应用安装时需要更多时间和空间。

**在Android N中引入了一种新的编译模式,同时使用JIT和AOT。**这是我在网上找到的一些解释:

包含了一个混合模式的运行时。应用在安装时不做编译,而是解释字节码,所以可以快速启动。ART中有一种新的、更快的解释器,通过一种新的JIT完成,

但是这种JIT的信息不是持久化的。取而代之的是,代码在执行期间被分析,分析结果保存起来。然后,当设备空转和充电的时候,ART会执行针对“热代码”进行的基于分析的编译,其他代码不做编译。为了得到更优的代码,ART采用了几种技巧包括深度内联。 对同一个应用可以编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,

这取决于分析器在随后的执行中的分析数据。

新的ART在安装程序时使用JIT,在JIT编译了一些代码后将这些代码保存到本地,等到设备空闲的时候将保存的这些代码使用AOT编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。

ART的机制与Dalvik不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time, JIT)转换为机器码,这会拖慢应用的运行效率,而在ART环境中,应用在第一次安装的时候,字节码酒会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time). 这样的话,应用的启动(首次)和执行都会变得更加快速.

优点:

1,系统性能的显著提升
2,应用启动更快,运行更快,体验更流畅,触感反馈更及时
3,更长的电池续航能力
4,支持更低的硬件

缺点:

1, 机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的Google+ Apk是 28.3mb, 但是代码只有6.9mb)
2,应用的安装时间会变长

AVD

Android 虚拟设备 (AVD) 是一种配置,用于定义您要在 Android 模拟器中模拟的 Android 手机、平板电脑、Wear OS、Android TV 或 Automotive OS 设备的特性。

AVD 包含硬件配置文件、系统映像、存储区域、皮肤和其他属性。

Camera2

对于大多数开发者,我们推荐使用 CameraX。CameraX 是一个 Jetpack 库,支持绝大多数 Android 设备(Android 5.0 及更高版本),并提供围绕常见用例设计的一致的高级别 API。CameraX 会为您解决设备兼容性问题,因此您无需向应用添加针对特定设备的代码。

CameraX 基于 Camera2 软件包构建而成。如果您需要低级别的相机控件来支持复杂用例,那么 Camera2 是一个不错的选择,但相应 API 比 CameraX 更复杂,并且您需要管理设备专属配置。与 CameraX 一样,Camera2 适用于 Android 5.0(API 级别 21)及更高版本。

原始 Android Camera 类已废弃。新应用应使用 CameraX(推荐)或 Camera2;现有应用应进行迁移,以便充分利用新功能,并避免与未来设备不兼容。

CGI

摘自此文

CGI(Common Gateway Interface),即通用网关接口,是 WWW(World Wide Web)技术中最重要的技术之一,是外部应用程序(即 CGI 程序)与 Web 服务器之间的接口标准,负责在 CGI 程序和 Web 服务器之间传递信息。

CGI 是 Web 服务器运行时,调用外部应用程序(即 CGI 程序)的规范,CGI 规范允许 Web 服务器执行外部程序,并将它们的输出发送给 Web 浏览器,CGI 将 Web 的一组简单的静态超媒体文档变成一个完整的、新的交互式媒体,按照 CGI 编写的程序可以扩展 Web 服务器功能。

出现背景:CGI 是比较原始的开发动态网站的方式。由于静态的 HTML 页面无法实现网站的动态内容的生成,所以就需要由 Web 服务器调用 CGI 程序,CGI 程序生成动态内容,返回给 Web 服务器,Web 服务器再返回给 Web 浏览器。

CGI 应用程序能通过 Web 服务器与 Web 浏览器进行交互,还可以通过数据库 API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据,将数据格式化为 HTML 文档后,发送给 Web 浏览器,也可以将从 Web 浏览器获得的数据放到数据库中。CGI 与这几者的关系图如下:

几乎所有 Web 服务器都支持 CGI,可用多种语言编写 CGI(包括流行的 C、C++ 等),只要这种语言具有标准输入、输出和环境变量即可。

大多数的 CGI 程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给 Web 浏览器,CGI 程序使网页具有了交互功能。
————————————————
版权声明:本文为CSDN博主「liitdar」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liitdar/article/details/79896457

LLVM

推荐阅读

LLVM项目包含了一系列的模块化,可复用的编译器和工具链集合。

官方描述如下:
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name “LLVM” itself is not an acronym; it is the full name of the project.

在官网上罗列了11个LLVM子项目。其中2个最重要的:

  1. LLVM 核心优化器(optimizer)。它不依赖于源码和目标机器指令集。这个核心库基于LLVM的中间表示(LLVM intermedaite representation)。

  2. Clang 编译器(compiler)。Clang目标是实现一个C/C++/Objective-C compiler。Clang可以提供非常有用的错误和警告信息。Clang Static Analyzer是一个自动化发bug的工具。

clang

推荐阅读

什么是clang编译器?

LLVM (Low Level Virtual Machine) 是一个开源的编译器架构。Clang 是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 等编程语言。

Clang 对源程序进行预处理、词法分析、语法分析,并将分析结果转换为 Abstract Syntax Tree ( 抽象语法树 ) ,最后使用 LLVM 作为编译器后端代码的生成器。

Clang 的开发目标是提供一个可以替代 GCC 的前端编译器。Apple 对 Objective-C 新增很多特性,想做的很多功能,比如更好的IDE支持,GCC 不能很好的支持,于是,苹果开发了 Clang 与 LLVM 来完全取代GCC。Clang作为编译器前端,LLVM作为编译器后端。

clang编译器的优势与劣势

相比于gcc,clang 具有如下优势:

  • 编译速度更快:在某些平台上,clang 的编译速度要明显快于gcc。
  • 占用内存更小:clang生成的AST所占用的内存通常是gcc的五分之一左右。
  • 模块化的设计:clang采用基于库的模块化设计,更易于IDE的集成及其他用途的重用。
  • 诊断信息可读性强:在编译过程中,clang会创建并保留大量详细的元数据 (metadata),这将更有利于调试和错误报告。
  • 设计更清晰简单,容易理解,易于扩展加强。与代码基础较为古老的gcc相比,学习曲线会显得更为平缓。

当前 Clang 还处在不断完善过程中,相比于 gcc,clang在以下方面还有待加强:

  • 需要支持更多语言:gcc除了支持 C/C++/Objective-C, 还支持Fortran/Pascal/Java/Ada/Go等其他语言。clang目前基本上只支持C/C++/Objective-C/Objective-C++这四种语言。
  • 需要加强对C++的支持:clang对C++的支持依然落后于gcc,clang还需要加强对C++ 提供全方位支持。
  • 需要支持更多平台:由于gcc流行的时间比较长,已经被广泛使用,对各种平台的支持也很完备。clang目前支持的平台有 Linux/Windows/Mac OS。

dex2jar

推荐阅读(参考)

1、dex2jar 工具主要是将 dex 文件转换为包含 class 文件的 jar 文件。
2、JD-GUI 工具是针对从dex 转为jar后的文件,进行可视化读取与展示。

apk 安装包本质是经过特殊处理的压缩包,可以直接将 target.apk 修改后缀名为 target.zip,然后通过解压工具解压,解压后的文件夹包含各种资源文件和文件夹,以及 dex 文件,如果apk是多个 dex 文件组成,解压后会有多个dex 存在,可逐个操作,最终会生成jar文件。

直接将 之前通过dex2jar生成的 jar文件拖入 JD-GUI 即可查看源码,通过工具可以查看到源码是否有混淆。

findViewById

安卓编程的定位函数,主要是引用.R文件里的引用名。一般在R.java文件里系统会自动帮你给出你在XML里定义的ID或者Layout里面的名称,例如:Button button=(Button)findViewById(R.id.button01);这样就引用了XML(res里的布局文件)文件里面的button,使得在写.java的按钮时能与XML里的一致。
————————————————
版权声明:本文为CSDN博主「proveyourself」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/sugesi/article/details/77103727

替代品,推荐阅读

通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

在大多数情况下,视图绑定会替代 findViewById

与使用 findViewById 相比,视图绑定具有一些很显著的优点:

  • Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
  • 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。

这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。

Flutter

推荐阅读

1.2.1 Flutter 简介

Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter 提供了丰富的组件、接口,开发者可以很快地为 Flutter 添加 Native 扩展。下面我们整体介绍一下 Flutter 技术的主要特点。

#1. 跨平台自绘引擎

Flutter 与用于构建移动应用程序的其它大多数框架不同,因为 Flutter 既不使用 WebView,也不使用操作系统的原生控件。 相反,Flutter 使用自己的高性能渲染引擎来绘制 Widget(组件)。这样不仅可以保证在 Android 和iOS 上 UI 的一致性,也可以避免对原生控件依赖而带来的限制及高昂的维护成本。

Flutter 底层使用 Skia 作为其 2D 渲染引擎,Skia 是 Google的一个 2D 图形处理函数库,包含字型、坐标转换,以及点阵图,它们都有高效能且简洁的表现。Skia 是跨平台的,并提供了非常友好的 API,目前 Google Chrome浏览器和 Android 均采用 Skia 作为其 2D 绘图引擎。

目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux、Fuchsia(Google新的自研操作系统)等众多平台,但本书的示例和介绍主要是基于 iOS 和 Android 平台的,其它平台读者可以自行了解。

#2. 高性能

Flutter 高性能主要靠两点来保证:

第一:Flutter APP 采用 Dart 语言开发。Dart 在 JIT(即时编译)模式下,执行速度与 JavaScript 基本持平。但是 Dart 支持 AOT,当以 AOT模式运行时,JavaScript 便远远追不上了。执行速度的提升对高帧率下的视图数据计算很有帮助。

第二:Flutter 使用自己的渲染引擎来绘制 UI ,布局数据等由 Dart 语言直接控制,所以在布局过程中不需要像 RN 那样要在 JavaScript 和 Native 之间通信,这在一些滑动和拖动的场景下具有明显优势,因为在滑动和拖动过程往往都会引起布局发生变化,所以 JavaScript 需要和 Native 之间不停的同步布局信息,这和在浏览器中JavaScript 频繁操作 DOM 所带来的问题是类似的,都会导致比较可观的性能开销。

#3. 采用Dart语言开发

这个是一个很有意思但也很有争议的问题,在了解 Flutter 为什么选择了 Dart 而不是 JavaScript 之前我们先来介绍一下之前提到过的两个概念:JIT 和 AOT。

程序主要有两种运行方式:静态编译与动态解释。静态编译的程序在执行前程序会被提前编译为机器码(或中间字节码),通常将这种类型称为AOT (Ahead of time)即 “提前编译”。而解释执行则是在运行时将源码实时翻译为机器码来执行,通常将这种类型称为JIT(Just-in-time)即“即时编译”。

AOT 程序的典型代表是用 C/C++ 开发的应用,它们必须在执行前编译成机器码;而JIT的代表则非常多,如JavaScript、python等,事实上,所有脚本语言都支持 JIT 模式。但需要注意的是 JIT 和 AOT 指的是程序运行方式,和编程语言并非强关联的,有些语言既可以以 JIT 方式运行也可以以 AOT 方式运行,如Python,它可以在第一次执行时编译成中间字节码,然后在之后执行时再将字节码实施转为机器码执行。也许有人会说,中间字节码并非机器码,在程序执行时仍然需要动态将字节码转为机器码,这不应该是 JIT 吗 ? 是这样,但通常我们区分是否为AOT 的标准就是看代码在执行之前是否需要编译,只要需要编译,无论其编译产物是字节码还是机器码,都属于AOT。在此,读者不必纠结于概念,概念就是为了传达精神而发明的,只要读者能够理解其原理即可,得其神忘其形。

现在我们看看 Flutter 为什么选择 Dart 语言?笔者根据官方解释以及自己对 Flutter 的理解总结了以下几条(由于其它跨平台框架都将 JavaScript 作为其开发语言,所以主要将 Dart 和 JavaScript 做一个对比):

  1. 开发效率高

    Dart 运行时和编译器支持 Flutter 的两个关键特性的组合:

    • 基于 JIT 的快速开发周期:Flutter 在开发阶段采用,采用 JIT 模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间;
    • 基于 AOT 的发布包: Flutter 在发布时可以通过 AOT 生成高效的机器码以保证应用性能。而 JavaScript 则不具有这个能力。
  2. 高性能

    Flutter 旨在提供流畅、高保真的的 UI 体验。为了实现这一点,Flutter 中需要能够在每个动画帧中运行大量的代码。这意味着需要一种既能提供高性能的语言,而不会出现会丢帧的周期性暂停,而 Dart 支持 AOT,在这一点上可以做的比 JavaScript 更好。

  3. 快速内存分配

    Flutter 框架使用函数式流,这使得它在很大程度上依赖于底层的内存分配器。因此,拥有一个能够有效地处理琐碎任务的内存分配器将显得十分重要,在缺乏此功能的语言中,Flutter 将无法有效地工作。当然 Chrome V8 的 JavaScript 引擎在内存分配上也已经做的很好,事实上 Dart 开发团队的很多成员都是来自Chrome 团队的,所以在内存分配上 Dart 并不能作为超越 JavaScript 的优势,而对于Flutter来说,它需要这样的特性,而 Dart 也正好满足而已。

  4. 类型安全和空安全

    由于 Dart 是类型安全的语言,且 2.12 版本后也支持了空安全特性,所以 Dart 支持静态类型检测,可以在编译前发现一些类型的错误,并排除潜在问题,这一点对于前端开发者来说可能会更具有吸引力。与之不同的,JavaScript 是一个弱类型语言,也因此前端社区出现了很多给 JavaScript 代码添加静态类型检测的扩展语言和工具,如:微软的 TypeScript 以及Facebook 的 Flow。相比之下,Dart 本身就支持静态类型,这是它的一个重要优势。

git

推荐阅读

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git特点

优点:

  • 适合分布式开发,强调个体;

  • 公共服务器压力和数据量都不会太大;

  • 速度快、灵活;

  • 任意两个开发者之间可以很容易的解决冲突;

  • 离线工作。

缺点:

  • 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息;

  • 权限控制不友好;如果需要对开发者限制各种权限的建议使用SVN。

————————————————
版权声明:本文为CSDN博主「ThinkWon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ThinkWon/article/details/94346816

GPS

推荐阅读

全球定位系统(英语:Global Positioning System,通常简称GPS),又称全球卫星定位系统,是美国国防部研制,美国太空军运营与维护的中距离圆型轨道卫星导航系统。它可以为地球表面绝大部分地区(98%)提供准确的定位、测速和高精度的标准时间。全球定位系统可满足位于全球地面任何一处或近地空间的军事用户连续且精确地确定三维位置、三维运动和时间的需求。该系统包括太空中的31颗GPS人造卫星;地面上1个主控站、3个数据注入站和5个监测站,及作为用户端的GPS军用接收机器、智能手机等。最少只需其中4卫星,就能迅速确定用户端在地球上所处的位置及海拔高度;所能接收到的卫星讯号数越多,解码出来的位置就越精确。

GPS系统拥有如下多种优点:使用低频讯号,就算天气不佳仍能保持相当的讯号穿透性;高达98%的全球覆盖率;高精度三维定速定时;快速、省时、高效率;应用广泛、多功能;可移动定位。不同于双星定位系统,使用过程中接收机不需要发出任何信号;此举增加了隐蔽性,提高了其军事应用效能。

HTML5

推荐阅读

HTML5 是最新的 HTML 标准。HTML5 是专门为承载丰富的 web 内容而设计的,并且无需额外插件。HTML5 拥有新的语义、图形以及多媒体元素。HTML5 提供的新元素和新的 API 简化了 web 应用程序的搭建。HTML5 是跨平台的,被设计为在不同类型的硬件(PC、平板、手机、电视机等等)之上运行。


HTML5HTML最新的修订版本,由万维网联盟(W3C)于2014年10月完成标准制定。目标是取代1999年所制定的HTML 4.01和XHTML 1.0标准,以期能在网际网路应用迅速发展的时候,使网路标准达到符合当代的网路需求。广义论及HTML5时,实际指的是包括HTML、CSSJavaScript在内的一套技术组合。它希望能够减少网页浏览器对于需要外挂程式丰富性网路应用服务(Plug-in-Based Rich Internet Application,RIA),例如:Adobe FlashMicrosoft SilverlightOracle JavaFX的需求,并且提供更多能有效加强网路应用的标准集。

HttpURLConnection

虽然更喜欢OKHttp

JDK的java.net包中提供了访问HTTP协议的基本功能的类:HttpURLConnection。

URLConnection是个抽象类,它有两个直接子类分别是HttpURLConnection和JarURLConnection。另外一个重要的类是URL,通常URL可以通过传给构造器一个String类型的参数来生成一个指向特定地址的URL实例。

HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

1
2
3
4
int getResponseCode();        // 获取服务器的响应代码。
String getResponseMessage(); // 获取服务器的响应消息。
String getResponseMethod(); // 获取发送请求的方法。
void setRequestMethod(String method); // 设置发送请求的方法。

每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。
————————————————
版权声明:本文为CSDN博主「冯insist」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40036754/article/details/102554755

HUAWEI DevEco Studio

推荐阅读

HUAWEI DevEco Studio(以下简称DevEco Studio)是基于IntelliJ IDEA Community开源版本打造,面向华为终端全场景多设备的一站式集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用/服务开发。通过使用DevEco Studio,开发者可以更高效的开发具备HarmonyOS分布式能力的应用/服务,进而提升创新效率。

作为一款开发工具,除了具有基本的代码开发、编译构建及调测等功能外,DevEco Studio还具有如下特点:

  • 多设备统一开发环境:支持多种HarmonyOS设备的应用/服务开发,包括手机(Phone)、平板(Tablet)、车机(Car)、智慧屏(TV)、智能穿戴(Wearable),轻量级智能穿戴(LiteWearable)和智慧视觉(Smart Vision)设备。
  • 支持多语言的代码开发和调试:包括Java、XML(Extensible Markup Language)、C/C++ 、eTS(Extended TypeScript)、 JS(JavaScript)、CSS(Cascading Style Sheets)和HML(HarmonyOS Markup Language)。
  • 支持FA(Feature Ability)和PA(Particle Ability)快速开发:通过工程向导快速创建FA/PA工程模板,一键式打包成HAP(HarmonyOS Ability Package)。
  • 支持分布式多端应用/服务开发:一个工程和一份代码可跨设备运行,支持不同设备界面的实时预览和差异化开发,实现代码的最大化重用。
  • 支持多设备模拟器:提供多设备的模拟器资源,包括手机、平板、车机、智慧屏、智能穿戴设备的模拟器,方便开发者高效调试。
  • 支持多设备预览器:提供JS和Java预览器功能,可以实时查看应用/服务的布局效果,支持实时预览和动态预览;同时还支持多设备同时预览,查看同一个布局文件在不同设备上的呈现效果。

HAXM

Hardware Accelerated Execution Manager的缩写。

intel的硬件加速执行管理器,是一款可以使用英特尔虚拟化技术(VT)加快 Android* 开发速度的硬件辅助虚拟化引擎(管理程序)。是AMD的CPU不能安装,在CPU中增加了控制硬件,对应开启VT的时候,启动一些模拟指令(或者新增部分基础指令)来加速运算,减少各个周期以达到优化效果。开启HAXM的时候,android模拟器的速度会明显增快。

HAXM是一个跨平台的硬件辅助虚拟化引擎(hypervisor),广泛用作Android Emulator和QEMU的加速器。
————————————————
版权声明:本文为CSDN博主「hankern」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hankern/article/details/117400801


以下参考here

以下虚拟化技术可用于加速 Android Emulator:

  1. Microsoft 的 Hyper-V 和 Windows 虚拟机监控程序平台 (WHPX)Hyper-V 是 Windows 的虚拟化功能,使虚拟的计算机系统可以在物理主计算机上运行。
  2. Intel 硬件加速执行管理器 (HAXM) 。 HAXM 是运行 Intel CPU 的计算机所用的虚拟化引擎。

为了在 Windows 上获得最佳体验,建议使用 WHPX 来加速 Android Emulator。 如果计算机没有 Hyper-V,则可使用 HAXM。 如果满足以下条件,Android Emulator 将自动使用硬件加速:

  • 硬件加速在开发计算机上可用并已启用。
  • 仿真器正在运行为基于 x86 的虚拟设备创建的系统映像。

ImageView

ImageView 继承自View组件,主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示。ImageView可以适用于任何布局中,并且Android为其提供了缩放和着色的一些操作。

Intent

推荐阅读

Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:

  • 启动 Activity

    Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 用于描述要启动的 Activity,并携带任何必要的数据。

    如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收。如需了解详细信息,请参阅 Activity 指南。

  • 启动服务

    Service 是一个不使用用户界面而在后台执行操作的组件。使用 Android 5.0(API 级别 21)及更高版本,您可以启动包含 JobScheduler 的服务。如需了解有关 JobScheduler 的详细信息,请参阅其 API-reference documentation

    对于 Android 5.0(API 级别 21)之前的版本,您可以使用 Service 类的方法来启动服务。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。

    如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。如需了解详细信息,请参阅服务指南。

  • 传递广播

    广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()sendOrderedBroadcast(),您可以将广播传递给其他应用。

    Intent 类型

    Intent 分为两种类型:

    • 显式 Intent:通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
    • 隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。

jar

JAR 包是什么

JAR 文件的全称 Java Archive File(Java 档案文件),通常 JAR 文件是一种压缩格式,和 ZIP 格式兼容,与 ZIP格式不同的是它 包含了一个名为 META-INF/MANIFEST.MF的清单文件,这个清单文件是由生成 JAR 包的时候系统自动创建的,这个清单文件与我们可以不做关注。

JAR 包的用途

当我们开发了一个程序以后,程序中有很多的类,如果需要提供给别人使用,发给对方一堆的源文件是非常不好的,通常需要把这些类打包成一个 JAR 包,把这个 JAR 包提供给别人使用,只需要别人在CLASSPATH 环境变量中添加这个 JAR 包,则 Java 虚拟机就可以在内存中解析这个 JAR 包了,这个 JAR 包就是一个路径,就像我们电脑访问普通文件一样,Java 虚拟机会根据路径查找相应的文件。

JAR 包的优点

体积小,安全,可移植性强,封装好等优点.

作者:Lstone
链接:https://www.jianshu.com/p/2b2e7d7fb160
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

JNI

JNI (Java Native Interface) 介绍

JNI是一个协议,这个协议用来沟通Java代码和外部本地代码(c/c++),外部的c/c++代码也可以调用Java代码。

以下是oracle对JNI的定义
JavaTM Native Interface (JNI) is a standard programming interface for writing Java native methods and embedding the JavaTM virtual machine* into native applications. The primary goal is binary compatibility of native method libraries across all Java virtual machine implementations on a given platform.

JNI的优点

  • 效率上c/c++是本地代码,比java更高效

  • 代码移植,如果之前用c语言开发过的模块,可以复用已经存在的c代码

  • java反编译比c语言容易,一般加密算法都是用c语言编码,不容易被反编译

ssh/-L-R-D

推荐阅读

ssh 命令除了登陆外还有三种代理功能:

  • 正向代理(-L):相当于 iptable 的 port forwarding
  • 反向代理(-R):相当于 frp 或者 ngrok
  • socks5 代理(-D):相当于 ss/ssr

正向代理

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

反向代理

所谓“反向代理”就是让远端启动端口,把远端端口数据转发到本地。

本地 socks5 代理

在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:

1
HostA$ ssh -D localhost:1080  HostB

那么在 HostA 上面,浏览器配置 socks5 代理为 127.0.0.1:1080,看网页时就能把数据通过 HostB 代理出去,类似 ss/ssr 版本,只不过用 ssh 来实现。

JSch

SSH的介绍

SSH(Secure Shell)是一种网络协议,用于互联网上不同设备之间信息的安全传输,在安全性方面其使用了公钥的加密技术。目前大都数的Linux中都运行着OpenSSH,为用户安全的提供远程登录管理和其他数据传输的功能.

JSCH的介绍

JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。

SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

ftp协议通常是用来在两个服务器之间传输文件的,但是它本质上是不安全的。

SFTP可以理解为SSH + FTP,也就是安全的网络文件传输协议。

Kotlin

推荐阅读

Kotlin是由JetBrains开发的针对JVM、Android和浏览器的静态编程语言,目前,在Apache组织的许可下已经开源。使用Kotlin,开发者可以很方便地开发移动Android应用、服务器程序和JavaScript程序。Kotlin可以将代码编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。

Kotlin 相比 Java 有哪些优势呢?

更容易学习

Kotlin是一门具备函数式编程思想的面向对象编程语言,它具有静态编程语言的很多特点,学习更加容易。

更快的编译速度

第一次编译Kotlin代码时,它需要比Java更长的时间,当使用增量编译的时候,Kotlin则比Java更快。

性能更好

由于非常相似的字节码结构,Kotlin应用程序的运行速度与Java类似。随着Kotlin对内联函数的支持,使用Lambda表达式的代码通常比用Java 写的代码运行得更快。

空指针安全

Kotlin对比于Java的最大的一个优点就是可以有效解决空指针问题,毕竟价值“十亿美元的错误”不是人人都犯的起的。

跨平台开发特性

Kotlin除了可以用来开发移动Android App之外,还可以用来做服务端框架开发和Web浏览器开发。

与IDE无缝融合

在Google官方发布的最新版本的Android Studio 3.0上,已经默认集成了Kotlin,对于一些老版本,也可以通过插件的方式来集成Kotlin。所以,使用JetBrains提供的IDE,可以为Kotlin开发提供最佳的环境支持。

LinearLayout

推荐阅读

LinearLayout 是一个视图组,用于使所有子视图在单个方向(垂直或水平)保持对齐。您可以使用 android:orientation 属性指定布局方向。

LinearLayout 的所有子视图依次堆叠,因此无论子视图有多宽,垂直列表每行均只有一个子视图,水平列表将只有一行高(最高子视图的高度加上内边距)。LinearLayout 会考虑子视图之间的边距以及每个子视图的对齐方式(右对齐、居中对齐或左对齐)。

LinearLayout 还支持使用 android:layout_weight 属性为各个子视图分配权重。此属性会根据视图应在屏幕上占据的空间大小,向视图分配“重要性”值。如果拥有更大的权重值,视图便可展开,填充父视图中的任何剩余空间。子视图可指定权重值,然后系统会按照子视图所声明的权重值比例,为其分配视图组中的任何剩余空间。默认权重为零。

MainActivity

我们新建一个 Android 项目时,通过会默认生成一个 Activity,叫 MainActivity,这个 MainActivity 就是此时这个项目唯一的页面,也是 APP 的启动页面,不过你可以根据自己的需求新建其它的 Activity。

MediaRecorder

推荐阅读

MediaRecorder类是Android sdk提供的一个专门用于音视频录制的类,一般利用手机麦克风采集音频,摄像头采集图片信息。

使用以下调用初始化 MediaRecorder 的新实例:

  • 使用setAudioSource()设置音频源。您可能会使用MIC

    注意:大部分音频源(包括 DEFAULT)都会对音频信号进行处理。要录制原始音频,请选择 UNPROCESSED。有些设备不支持未经处理的输入。请先调用 AudioManager.getProperty(AudioManager.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED) 以验证其是否可用。如果不可用,请尝试使用 VOICE_RECOGNITION,VOICE_RECOGNITION 不会采用 AGC 或噪音抑制。即使在不支持该属性的情况下,您也可以将 UNPROCESSED 用作音频源,但不能保证在这种情况下信号是否未经处理。

  • 使用setOutputFormat()设置输出文件格式。请注意,从 Android 8.0(API 级别 26)开始MediaRecorder

    支持 MPEG2_TS 格式,这对流式传输非常有用:

    1
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
  • 使用 setOutputFile() 设置输出文件名。您必须指定代表实际文件的文件描述符。

  • 使用 setAudioEncoder() 设置音频编码器。

  • 通过调用 prepare() 完成初始化。

通过分别调用 start()stop() 来启动和停止录音功能。

使用完 MediaRecorder 实例后,请尽快调用 release() 来释放其资源。

注意:在搭载 Android 9(API 级别 28)或更高版本的设备上,在后台运行的应用将无法访问麦克风。因此,您的应用只在以下两种情况下才应录制音频:当其位于前台时,或者您在前台服务中添加了 MediaRecorder 实例时。

MIPS

MIPSMicroprocessor without Interlocked Pipeline Stages),是一种采取精简指令集(RISC)的指令集架构(ISA)

MQ(MessageQueue)

推荐阅读

MessageQueue ,顾名思义,意为消息队列,其操作主要有插入和读取。插入对应的方法为 enqueueMessage(),即往消息队列中插入一条消息,而读取对应next(),该方法会从消息队列中取出一条消息并将其从消息队列中删除。虽然 MessageQueue 的名字包含队列(Queue),但是其底层实现采用的是单链表,这是因为链表在插入和删除方面的性能好。


Handler消息机制的工作原理:

  1. 创建与线程绑定的Looper,同时会创建一个与之关联的MessageQueue用于存放消息
  2. 开启消息循环,从MessageQueue中获取待处理消息,若无消息会阻塞线程
  3. 通过Handler发送消息,此时会将Message入队列到MessageQueue中,并且唤醒等待的Looper
  4. Looper获取的消息会投递给对应的Handler处理

可以看到其中与MessageQueue相关的也就两个操作,一个是入队列(MessageQueue是链表结构),一个是出队列。

sendMessage

Handler 有两种方式可以向MessageQueue 发送消息,一种是post ,另外一种是sendMessage。但其实post 实际上也是通过sendMessage来发送消息的。通过handler的sendMessage方法我们可以很轻易的将数据从子线程发送到主线程

MulticastSocket

推荐阅读参考文档

MulticastSocket是一个(UDP)DatagramSocket,具有用于连接互联网上其他多播主机的“组”的附加功能。

多播组由D类IP地址和标准UDP端口号指定。 D类IP地址的范围是224.0.0.0239.255.255.255 (含)。 地址224.0.0.0被保留,不应该被使用。

DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送至多个客户端。其主要思想是设置一组特殊网络地址作为多点广播地址,每个多点广播地址都被看做一个组,当客户端需要发送,接收广播消息时,加入到该组即可。

IP协议为多点广播提供了这些特殊的IP地址,这些IP地址的范围是224.0.0.0239.255.255.255。当MulticastSocket把一个DatagramPacket发送到多点广播IP地址时,该数据将被自动广播到加入该地址的所有MulticastSocket,同时也可以设置该MulticastSocket接收自身发送的数据。

如果仅仅是用于发送数据报的MulticastSocket对象,使用默认地址,随机端口即可。但如果创建接收用的MulticastSocket对象,则该MulticastSocket对象必须指定端口,否则发送方无法确定发送数据报的目标端口。

mDNS

mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。

在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,大多数情况,设备的ip不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址,如何设备发现呢,就是要mdns大显身手,例如:现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,发一些特定信息,感兴趣设备应答,实现局域网设备的发现,当然mdns 比这强大的多

组播地址: 组播地址使用的是D类地址,地址范围为:224.0.0.0—239.255.255.255

mdns 工作原理简单描述:

mdns 使用组播地址为: 224.0.0.251 (ipv6: FF02::FB) 端口为5353,mdns 是用于局域网内部的,并且主机的域名为.local 结尾,每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁(域名),和我的IP地址是多少。然后其他有mdns服务的主机就会响应,也会告诉你,它是谁(域名),它的IP地址是多少。 当然设备需要服务时,就是使用mdns 查询域名对对应的ip地址,对应的设备收到该报文后同样通过组播方式应答,此时其他主机设备也是可以收到该应答报文,其他主机也会记录域名和ip 以及ttl 等,更新缓存
————————————————
版权声明:本文为CSDN博主「人生为棋我愿为卒行动虽慢未曾后退」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wang112031/article/details/52772380

NDK

推荐阅读

Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:

  • 在平台之间移植其应用。
  • 重复使用现有库,或者提供其自己的库供重复使用。
  • 在特定情况下提高性能,特别是像游戏这种计算密集型应用。

NDK是什么

  • NDK是一系列工具的集合。

    • NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
    • NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
    • NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
  • NDK提供了一份稳定、功能有限的API头文件声明。

    • Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

引自 https://www.cnblogs.com/leaven/archive/2010/05/27/1744855.html

onCreate

推荐阅读

onCreate()

您必须实现此回调,它会在系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。例如,onCreate() 的实现可能会将数据绑定到列表,将 Activity 与 ViewModel 相关联,并实例化某些类作用域变量。此方法会接收 savedInstanceState 参数,后者是包含 Activity 先前保存状态的 Bundle 对象。如果 Activity 此前未曾存在,Bundle 对象的值为 null。

如果您有一个生命周期感知型组件与您的 Activity 生命周期相关联,该组件将收到 ON_CREATE 事件。系统将调用带有 @OnLifecycleEvent 注释的方法,以使您的生命周期感知型组件可以执行已创建状态所需的任何设置代码。

onCreate() 方法的以下示例显示执行 Activity 某些基本设置的一些代码,例如声明界面(在 XML 布局文件中定义)、定义成员变量,以及配置某些界面。在本示例中,系统通过将文件的资源 ID R.layout.main_activity 传递给 setContentView() 来指定 XML 布局文件。

除了定义 XML 文件,然后将其传递给 setContentView(),您还可以在 Activity 代码中新建 View 对象,并将新建的 View 插入到 ViewGroup 中,以构建视图层次结构。然后,将根 ViewGroup 传递给 setContentView() 以使用该布局。如需详细了解如何创建界面,请参阅界面文档。

您的 Activity 并未处于“已创建”状态。onCreate() 方法完成执行后,Activity 进入“已开始”状态,系统会相继调用 onStart()onResume() 方法

opencv

OpenCV的全称是:Open Source Computer Vision Library

OpenCV是Intel开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。

优点:

1、 OpenCV 对非商业应用和商业应用都是免费的;

2、 开源的;

3、 可以应用于工程实践中;

缺点:

相对于Matlab而言,OpenCV基于C语言开发,编程复杂,开发周期较长。

可以看出,OpenCV的优缺点正好与Matlab的优缺点相反,两者各有所长,根据不同的要求选择不同的编程环境。

P2P

推荐阅读

Wi-Fi peer-to-peer(P2P,对等网络),它同意具备对应硬件的Android 4.0(API level 14)或者更高版本号的设备能够直接通过wifi而不须要其他中间中转节点就能直接通信(Android的Wi-Fi P2P框架符合Wi-Fi联盟的Wi-Fi Direct™直连认证标志)。使用这些API。你能够搜索并连接其他相同支持Wi-Fi P2P的设备,然后再通过一个快速的连接进行互相通信,而且这个连接的有效距离要比蓝牙连接的有效距离要长的多。

这对于须要在用户之间共享数据的应用程序很实用,比如多玩家游戏或者照片分享之类应用。

Android的WLAN P2P API 包含以下主要部分:

  • 支持您发现、请求,以及连接到对等设备的方法(在 WifiP2pManager 类中定义)。
  • 支持您获知 WifiP2pManager 方法调用成功与否的侦听器。调用 WifiP2pManager 方法时,每个方法均可收到作为参数传入的特定侦听器。
  • 通知您 WLAN P2P 框架检测到的特定事件(例如连接断开或新发现对等设备)的 Intent。

Sensor-etc

推荐阅读:官网推荐博客

手机上搭载的基本都是物理传感器

  • 方向传感器 (Orientation sensor)
  • 加速感应器(Accelerometer sensor)
  • 陀螺仪传感器 (Gyroscope sensor)
  • 磁场传感器 (Magnetic field sensor)
  • 距离传感器 (Proximity sensor)
  • 光线传感器 (Light sensor)
  • 气压传感器 (Pressure sensor)
  • 温度传感器 (Temperature sensor)
  • 重力感应器 (Gravity sensor)
  • 线性加速感应器 (Linear acceleration sensor)
  • 旋转矢量传感器 (Rotation vector sensor)
  • 相对湿度传感器 (Relative humidity sensor)
  • 近场通信 (NFC) 传感,NFC 和其它不一样,具有读写功能

Smali

Smali是Android虚拟机的反汇编语言。
我们都知道,Android代码一般是用java编写的,执行java程序一般需要用到java虚拟机,在Android平台上也不例外,但是出于性能上的考虑,并没有使用标准的JVM,而是使用专门的Android虚拟机(5.0以下为Dalvik,5.0以上为ART)。Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。

掌握Smali有哪些好处

1、动态调试APK,通常静态分析APK是不够的,如果需要彻底分析APK的执行逻辑,需要通过动态调试来进行。
具体教程参考:http://blog.csdn.net/hanchaohao2012/article/details/63253725
2、修改APK运行逻辑,通过修改Smali代码,再重新编译打包成新的APK,是Android逆向的基本操作。

作者:李全栋
链接:https://www.jianshu.com/p/9931a1e77066
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

socat

推荐阅读

Socat 是 Linux 下的一个多功能的网络工具,名字来由是 「Socket CAT」。其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版。

Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。

socket api

推荐阅读

Swift

推荐阅读

Swift 是一种强大直观的编程语言,适用于 macOS、iOS、watchOS 和 Apple tvOS 等。

TextView

TextView(文本框),是Android中用于显示文本的一个控件。

常用属性详解

  • id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置。
  • layout_width:控件的宽度,可以写成wrap_contentmatch_parent,前者是宽度自适应(控件中显示的内容多大,控件就多大),而后者宽度会填满该控件所在的父容器;也可以设置成特定的大小,如上200dp。
  • layout_height:组件的宽度,内容同上。
  • gravity:设置控件中内容的位置,如上center表示居中。
  • text:设置显示的文本内容,一般我们是把字符串写到string.xml文件中,然后通过@String/xxx取得对应的字符串内容的,可避免图上黄色警告。
  • textColor:设置字体颜色,同上,也需通过colors.xml资源来引用。
  • textStyle:设置字体风格,三个可选值:normal(无效果),bold(加粗),italic(斜体)。
  • textSize:字体大小,单位用sp
  • backgroud:控件的背景颜色,填充整个控件,也可以是图片或者drawable资源文件。

Toast

推荐阅读

Android中的Toast是一种简易的消息提示框。

当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。用户将可能是在中间键入别的东西。Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,Toast会根据用户设置的显示时间后自动消失。

TYPE_GYROSCOPE

陀螺仪传感器

  1. TYPE_ACCELEROMETER:加速度传感器,单位是m/s²,测量应用于设备X、Y、Z轴上的加速度,又叫做G-sensor

  2. TYPE_AMBIENT_TEMPERATURE:温度传感器,单位是℃,测量返回当前的温度。

  3. TYPE_GRAVITY:重力传感器,单位是m/s²,测量应用于设备X、Y、Z轴上的重力,也叫GV-sensor,地球上的数值是9.8m/s²,也可以设置其他星球(呃,目测平时用不到吧)

  4. TYPE_GYROSCOPE:陀螺仪传感器,单位是rad/s,测量设备x、y、z三轴的角加速度数据。

  5. TYPE_LIGHT:光线感应传感器,单位lx,检测周围的光线强度,手机系统中主要是调节LCD亮度。

  6. TYPE_LINEAR_ACCELERATION:线性加速度传感器,单位是m/s²,该传感器是获取加速度传感器去除重力的影响得到的数据。

  7. TYPE_MAGNETIC_FIELD:磁力传感器,单位是uT(微特斯拉),测量设备周围三个物理轴(x,y,z)的磁场(个人不了解哪些App上有应用)。

  8. TYPE_ORIENTATION:方向传感器,测量设备围绕三个物理轴(x,y,z)的旋转角度,API显示使用 SensorManager.getOrientation()替代掉了。

  9. TYPE_PRESSURE:压力传感器,单位是hPa(百帕斯卡),返回当前环境下的压强。

  10. TYPE_PROXIMITY:距离传感器,单位是cm,用来测量某个对象到屏幕的距离,可用于打电话时判断人耳到电话屏幕距离来进行关闭屏幕的省电功能。

  11. TYPE_RELATIVE_HUMIDITY:湿度传感器,单位是%,来测量周围环境的相对湿度(估计很少设备有吧)。

  12. TYPE_ROTATION_VECTOR:旋转矢量传感器,旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据(具体咋用不了解)。

  13. TYPE_TEMPERATURE:温度传感器,新版本中被TYPE_AMBIENT_TEMPERATURE替换掉了。

UITextView

UITextView 是 iOS 中的文本输入、显示控件。与 UITextField 不同的是,UITextView 是多行的文本域,支持滚动,多用于显示长篇内容。而 UITextField 是文本框,多用于输入用户名、密码等。

值得一提的是,UITextView 是 UIScrollView 的子类,具有滚动视图的行为和属性。

如果要在 UITextView 中输入文字,需要先设置 editable 为 true ,然后再将 textView 设置为第一响应者。

NAT

推荐阅读:什么是NAT?NAT转换是怎么工作的?

引自推荐阅读。

NAT简介:

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
另外,这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。在RFC中有对NAT的说明。
​ ------来源于百度百科

NAT的功能:

NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
1.宽带分享:这是 NAT 主机的最大功能。
2.安全防护: NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC 。
​ -------来源于百度百科

NAT的实现方式:

NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。

NAT的优点:

  1. 节省合法的公有ip地址
  2. 地址重叠时,提供 解决办法
  3. 网络发生变化时,避免重新编址

NAT对我们来说最大的贡献就是帮助我们节省了大量的ip资源

NAT的缺点:

  1. 无法进行端到端的ip跟踪(破坏了端对端通信的平等性)
  2. 很多应用层协议无法识别(比如ftp协议 )

UPnP

推荐阅读:P2P 网络核心技术:UPnP 和 SSDP 协议

背景知识

UPnP, Universal Plug and Play,中文是 “通用即插即用”。在理解 UPnP 之前,我们先了解一下传统的 PnP 技术,因为 UPnP 是对于传统 PnP(即插即用)概念的扩展。

传统的 PnP “即插即用”是指 PC 电脑在添加硬件设备时可以自动处理的一种标准。在 PnP 技术出现以前,当需要为 PC 电脑安装新的硬件(比如:声卡,CD-ROM,打印机)时,这些设备需要用到 PC 电脑的 DMA 和 IRQ 等资源,为了避免硬件设备对计算机这些资源使用上的冲突,我们就需要手工为新添加的硬件设备设置中断和 I/O 端口(比如,想要为添加的声卡占用中断 5,就找一个小跳线在卡上标着中断 5的针脚上一插)。这样的操作需要用户了解中断和 I/O 端口的知识,并且能够自己分配中断地址而不发生冲突,对普通用户提出这样的要求是不切实际的。

PnP “即插即用”技术出现以后,可以自动为新添加的硬件分配中断和 I/O 端口,用户无须再做手工跳线,也不必使用软件配置程序。唯一的要求就是操作系统需要支持 PnP 标准,同时所安装的新硬件也符合 PnP 规范的。

UPnP 协议介绍

现在我们讲 UPnP,在网络世界里,**当一个主机加入网络时,其行为模式跟我们上述的添加和删除设备是类似的。**尤其是在私有网络和公网交互的时候,私有网络中的主机使用的是内网 IP 地址,是无法被外网的主机直接访问的。必须借助 NAT 网关设备(本地路由器)把内网地址映射到网关的公网地址上。

简单来说就是, NAT 网关设备拥有一个公网 IP 地址(比如 10.59.116.19),内网中的主机(比如 192.168.1.101)想要与外界通信的话,NAT 网关设备可以为其做一个端口映射(比如:180.59.116.19 :80 —> 192.168.1.101 :80),这样,外部的主机发往 NAT 网关的数据包都会被转发给内网的该主机,从而实现了内网中的主机与外部主机的通信。

当内网中的主机想要被外界主机直接访问(比如开放 80 端口,对外提供 HTTP 服务),我们就需要在 NAT 设备中为当前主机手工配置端口映射,如果内网中有多台主机都想要被外界主机直接访问的话,我们必须在同一个 NAT 设备上为这些主机分别做端口映射,它们之间不能使用有冲突的端口。这个过程需要用户手工一一配置,显然给用户带来了很大的麻烦。

UPnP 技术标准的出现就是为了解决这个问题,只要 NAT 设备(路由器)支持 UPnP,并开启。那么,当我们的主机(或主机上的应用程序)向 NAT 设备发出端口映射请求的时候,NAT 设备就可以自动为主机分配端口并进行端口映射。这样,我们的主机就能够像公网主机一样被网络中任何主机访问了。

VNC

来源

VNC (Virtual Network Console) 是虚拟网络控制台的缩写。它是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下用户只需要其中的两个命令:vncserver 和 vncviewer。

组成部分

VNC 基本上是由两部分组成:一部分是客户端登录界面的应用程序 (vncviewer) ;另外一部分是服务器端的应用程序 (vncserver)。VNC 的基本运行原理和一些 Windows 下的远程控制软件很相像。VNC 的服务器端应用程序在 UNIX 和 Linux 操作系统中适应性很强,图形用户界面十分友好,看上去和 Windows 下的软件界面也很类似。在任何安装了客户端的应用程序 (vncviewer) 的 Linux 平台的计算机都能十分方便地和安装了服务器端的应用程序 (vncserver) 的计算机相互连接。另外,服务器端 (vncserver) 还内建了 Java Web 接口,这样用户通过服务器端对其他计算机的操作就能通过 Netscape 显示出来了,这样的操作过程和显示方式比较直观方便。

特点

同样可能远程连入 UNIX、Linux 进行图形化操作的还有流行的 Xmanager,VNC 与之相比 —— 两者工作原理不一样,前者(VNC)是远程连入操作系统,所有操作在 UNIX、Linux 主机服务端进行,即使操作过程中 “本地电脑与操作主机网络断开”,也不影响操作的顺利进行;而后者(Xmanager)是通过端口将主机服务器的 UI 界面引导到本地电脑进行展现,如操作过程出现 “本地电脑与操作主机网络断开”,操作将中断失败!如果操作中进行的工作任务非常重要,不能中断,如 ORACLE RAC 实施,结果是灾难性的!更重要的是,VNC 是免费的、开源的,Xmanager 你可能用的是注册版的。

WebView

推荐阅读,以下全部来自这篇文章。

Webview 是一个基于webkit的引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做浏览器看待。(chrome浏览器也是基于webkit引擎开发的,Mozilla浏览器是基于Gecko引擎开发的)

webview主要用于什么地方?或者说什么需求下会使用到webview?

个人理解,电脑上展示html页面,通过浏览器打开页面即可浏览,而手机系统层面,如果没有webview支持,是无法展示html页面,所以webview的作用即用于手机系统来展示html界面的

所以它主要在需要在手机系统上加载html文件时被需要

一个原生应用调用html页面的过程?

1.原生应用加载html页面(加载页面的方式可能有多种,比如加载本地写好的html文件,或者放置在服务器的文件)

2.加载完成,展示就是通过webview来渲染展示的,如果系统没有webview,则是无法渲染展示html的

2步其实一个原生应用调用html页面过程已经完成了,那么页面不光展示,有时候可能还需要交互,这里的话就需要写一些方法了,比如html界面的按钮需要调用系统原生的东西(比如:拍照,系统的文件,相册之类的)。原生端就负责维护html调用的接口,然后按照需要返回(原生端充当一个server的角色,html充当一个client角色)

使用webview的好处?

原生APP是将页面的布局设计,以及业务代码打包然后用户下载安装使用,而webview是通过加载html文件来进行页面的展示,当需要更新页面布局的或者业务逻辑变更时,如果是原生的APP就需要修改前端内容,升级打包,重新发布才可以使用最新的。

而通过webview方式的页面则只需要修改html代码或者js文件(如果是从服务器端获取,只要新的文件部署完成),用户重新刷新就可以使用更新后的,无需通过下载安装的方式完成升级。

wget

推荐阅读

GNU Wget(常简称为Wget)是一个在网络上进行下载的简单而强大的自由软件,其本身也是GNU计划的一部分。它的名字是“World Wide Web”和“Get”的结合,同时也隐含了软件的主要功能。目前它支持通过HTTPHTTPS,以及FTP这三个最常见的TCP/IP协议协议下载。

它的主要特点包括:

  • 支持递归下载
  • 恰当的转换页面中的链接
  • 生成可在本地浏览的页面镜像
  • 支持代理服务器

WIFIDirect

推荐阅读

2010年10月,Wi-Fi Alliance(wi-fi联盟)发布Wi-Fi Direct白皮书,白皮书中介绍了有关于这种技术的基本信息、这种技术的特点和这种技术的功能,

Wi-Fi Direct标准是指允许无线网络中的设备无需通过无线路由器即可相互连接。与蓝牙技术类似,这种标准允许无线设备以点对点形式互连,而且在传输速度与传输距离方面则比蓝牙有大幅提升。

WIFI Direct有什么好处?(特点)

1、无线网络中的设备无需通过无线路由器即可相互连接;

2、以支持一对一直连,也可以实现多台设备同时连接;

3、支持所有的Wi-Fi设备,从11a/b/g至11n,不同标准的Wi-Fi设备之间也可以直接互联;

4、移动性与便携性:Wi-Fi Direct设备能够随时随地实现互相连接。由于不需要Wi-Fi路由器或接入点,因此Wi-Fi设备可以在任何地点实现连接。

5、即时可用性:用户将得以利用带回家的第一部Wi-Fi Direct认证设备建立直接连接。例如,一部新购买的Wi-Fi Direct笔记本可以与用户已有的传统Wi-Fi设备创建直接连接。

6、易用性:Wi-Fi Direct设备发现(Device Discovery)与服务发现(Service Discovery)功能帮助用户确定可用的设备与服务,然后建立连接。例如,如果用户想要打印文件,他们可以通过上述服务连接到哪个Wi-Fi网络拥有打印机。

7、简单而安全的连接:Wi-Fi Direct设备采用Wi-Fi Protected Setup™简化了在设备之间创建安全连接的过程。用户可以按下任一设备上的按钮,也可以输入PIN码(即设备显示的PIN码),轻松创建安全连接。

WXSS

推荐阅读

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。

WXSS 用来决定 WXML 的组件应该怎么显示。

为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。

Xcode

参考

Xcode是苹果的集成开发环境(IDE)。你使用Xcode来为苹果设备创建app,比如,iPad、iPhone、Apple Watch、Apple TV、Mac。在app的创建、测试、优化、发布到AppStore这整个开发流程中,Xcode提供了一套工具来方便你进行管理。

Xcode前身是继承自NeXTProject Builder

The Xcode suite包含有GNU Compiler Collection自由软件(GCC、LLVM(默认是后者)),并支持C语言C++FortranObjective-CObjective-C++JavaAppleScriptPythonRubySwift,还提供CocoaCarbon以及Java等编程模式。协力厂商更提供了GNU Pascal,[1]Free Pascal[2], Ada[3], C#[4], Perl[5], Haskell[6]D语言。Xcode包使用GDB作为其后台调试工具

从Xcode 3.1开始附带iOS SDK,作为iOS的开发环境。

zxing

github样例github仓库

Zxing是一个开放源码的,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口;Zxing可以实现使用手机的内置的摄像头完成条形码和二维码的扫描与解码;Zxing可以实现条形码和二维码的编码与解码。

基于zxing的二维码扫码可能会出现扫码速率比较低的问题。

zxing源码是截取的扫码聚焦框里面的图像数据信息来解码,这里可以改成获取全屏的图像信息。实现代码如下:

1
2
3
public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
return new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false);
}

尽量减少支持的扫码类型。zxing源码默认是支持所有的扫码类型。我们项目中使用的话,一般不需要支持这么多。仅支持BarcodeFormat.QR_CODE(二维码)、BarcodeFormat.CODE_128(一维码)就可以应对很多场景了。

添加 hints.put(DecodeHintType.TRY_HARDER, true);语句,能够提高扫码精确度,准确率。

以上参考 http://www.xmamiga.com/1237/

北斗

官网介绍

北斗卫星导航系统(以下简称北斗系统)是中国着眼于国家安全和经济社会发展需要,自主建设运行的全球卫星导航系统,是为全球用户提供全天候、全天时、高精度的定位、导航和授时服务的国家重要时空基础设施。

发展特色

北斗系统具有以下特点:一是北斗系统空间段采用三种轨道卫星组成的混合星座,与其他卫星导航系统相比高轨卫星更多,抗遮挡能力强,尤其低纬度地区性能优势更为明显。二是北斗系统提供多个频点的导航信号,能够通过多频信号组合使用等方式提高服务精度。三是北斗系统创新融合了导航与通信能力,具备定位导航授时、星基增强、地基增强、精密单点定位、短报文通信和国际搜救等多种服务能力。


以上引自官网,以下引自维基百科

北斗卫星导航系统(简称北斗系统)是一个卫星导航系统,能为全球用户提供全天候、全天时、高精度的定位、导航和授时服务。北斗系统发展共有三代,自第二代开始的北斗系统被正式称为“北斗卫星导航系统”。

北斗一号系统(第一代北斗系统)由三颗卫星提供区域定位服务。从2000年开始,该系统主要在中国境内提供导航服务。2012年12月,北斗一号的最后一颗卫星寿命到期,北斗卫星导航试验系统停止运作。

北斗二号系统(第二代北斗系统)是一个包含16颗卫星的全球卫星导航系统,分别为6颗静止轨道卫星、6颗倾斜地球同步轨道卫星、4颗中地球轨道卫星。2012年11月,第二代北斗系统开始在亚太地区为用户提供区域定位服务。

北斗三号系统(第三代北斗系统)由三种不同轨道的卫星组成,包括24颗地球中圆轨道卫星(覆盖全球),3颗倾斜地球同步轨道卫星(覆盖亚太大部分地区)和3颗地球静止轨道卫星(覆盖中国)。北斗三号于2018年提前开放了北斗系统的全球定位功能。北斗三号系统于2020年7月31日完整开通。

北斗卫星导航系统(BDS)、美国全球定位系统(GPS)、俄罗斯全球导航卫星系统(GLONASS)和欧盟伽利略定位系统(Galileo)为联合国卫星导航委员会认定的全球卫星导航系统四大核心供应商。

打包党

推荐阅读

“Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。

二次打包问题只是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场、论坛发布。

对于打包党对于移动App带来的危害有以下几种:

  • 插入自己广告或者删除原来广告;
  • 恶意代码, 恶意扣费、木马等;
  • 修改原来支付逻辑。
一、混淆代码

Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

二、整体Dex加固

Dex加固是对Dex文件进行加壳防护,防止被静态反编译工具破解而泄露源码,最刚开始出现的是整体加固技术方案。整体加固技术的原理包括替换application/classes.dex、解密/动态加载原classes.dex、调用原application相关方法、将原application对象/名称设置到系统内部相关变量四大环节。其中最为关键的一步就是解密/动态加载原classes.dex,通过加密编译好的最终ex源码文件,然后在一个新项目中用新项目的application启动来解密原项目代码并加载到内存中,再把当前进程替换为解密后的代码,能够很好地隐藏源码并防止直接性的反编译。

三、拆分Dex加固

随着业务规模发展到一定程度,不断地加入新功能、添加新的类库,代码在急剧膨胀的同时,相应的apk包的大小也急剧增加,那么简单的整体加固方案就不能很好地满足安全需求,在整体加固方案之外又出现了拆分加固的技术方案。

但是Dex文件在加固时,针对中间缺失的一部分数据会以解密后的数据来替换,有的时候这种拆分替换也会导致数据不准确。那么到底应该拆分什么样的数据呢?就需要了解一下Dex文件的数据结构。

Dex文件结构极为复杂,以下图示选取了其中较为重要的内容。事实上,Dex文件是一个以class为核心组装起来的文件,其中最重要的是classdata和classcode两部分,有其特定的接口和指令数据,选取这两部分来拆分的话,即使拆分出来也不会泄露class数据和字节码数据,反编译出来也不完整,安全性较高。