乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

C++中类的构造函数和析构函数

发表于 2019-12-05

构造函数

对象创建的时候执行

1
student s //空参构造函数 栈内存中
1
student s("测试")//带参构造函数 栈内存中

或者

1
student *s=new student//空参构造函数 堆内存中
1
student *s=new student("测试")//带参构造函数 堆内存中

析构函数

对象销毁的时候执行

1
delete s

在构造函数中分配的堆内存空间需要在析构函数中进行释放

带参构造函数变量重名问题 使用关键字this解决

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android系统的启动流程详解

发表于 2019-12-05

Android系统启动流程.

1.当系统引导程序启动Linux内核时, 内核会加载各种数据结构和驱动程序. 有了驱动之后, 开始启动Android系统并加载用户级别的第一个进程init(system/core/init/Init.c).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, char **argv)
{
...

// 创建各种文件夹和挂载目录.
mkdir("/dev", 0755);

...

// 初始化日志.
log_init();

// 解析配置文件.
init_parse_config_file("/init.rc");

...

return 0;
}

2.加载Init.rc文件. 主要启动了一个Zygote(孵化器)进程, 此进程是Android系统启动关键服务的一个母进程.

1
2
3
4
5
6
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd

3.Zygote进程的初始化在App_main.cpp文件中开启, 代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, const char* const argv[])
{
// 定义Android运行时环境.
AppRuntime runtime;
int i = runtime.addVmArguments(argc, argv);

...

bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");

// 使用运行时环境启动Zygote的初始化类.
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);

...
}

4.现在从c或c++代码进入到java代码中, ZygoteInit.java初始化类, 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public static void main(String argv[]) {
// 加载系统运行依赖的class类.
preloadClasses();

...

if (argv[1].equals("true")) {
// Zygote孵化器进程开始孵化系统核心服务.
startSystemServer();
} else if (!argv[1].equals("false")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}

...
}

private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,3001,3002,3003",
"--capabilities=130104352,130104352",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
};

...

// 孵化器分叉开启SystemServer类, 并且把上面定义的参数.
// 传递给此类. 用于启动系统关键服务.
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);

...
}

5.Zygote进程分叉出SystemServer类, main函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
...

// 加载本地的动态链接库.
System.loadLibrary("android_servers");

// 调用动态链接库中的c函数.
init1(args);
}

// 这里init1的函数定义在frameworks\base\services\jni\com_android_server_SystemServer.cpp下的方法.
native public static void init1(String[] args);

6.comandroidserver_SystemServer.cpp的代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// 把native方法init1, 映射到android_server_SystemServer_init1. (这里是定义的函数指针)
{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
// 转调
system_init();
}

// 此方法没有方法体.
extern "C" int system_init();

7.system_init方法的方法体, 在System_init.cpp类中. 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extern "C" status_t system_init()
{
...

// 开启一些硬件相关的服务.
SensorService::instantiate();

...

// 获取Android运行时环境
AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services.\n");
// 调用SystemServer类中静态方法init2. 从native层转到java层.
runtime->callStatic("com/android/server/SystemServer", "init2");

...
}

8.SystemServer下init2方法如下:

1
2
3
4
5
6
7
8
public static final void init2() {
Slog.i(TAG, "Entered the Android system server!");

// 进入Android系统服务的初始化.
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}

9.ServerThread中的run方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public void run() {
...

// 初始化系统的服务, 并且把服务添加ServiceManager中, 便于以后系统进行统一管理.
ServiceManager.addService("entropy", new EntropyService());

...

// 调用了ActivityManagerService的systemReady的方法.
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
...
}
});

...
}

10.ActivityManagerService下的systemReady方法如下:

1
2
3
4
5
6
public void systemReady(final Runnable goingCallback) {
...

// 调用了ActivityStack中的resumeTopActivityLocked去启动Activity
mMainStack.resumeTopActivityLocked(null);
}

11.ActivityStack中的resumeTopActivityLocked方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final boolean resumeTopActivityLocked(ActivityRecord prev) {
// 找到第一个当前没有关闭的Activity, 系统刚刚系统没有任何Activity执行, 所以next为null
ActivityRecord next = topRunningActivityLocked(null);

// Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false;

if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
if (mMainStack) {
// 开启Launcher应用的第一个Activity界面.
return mService.startHomeActivityLocked();
}
}
}

12.home界面显示, 这时Android系统启动完毕. 进入到待机画面.

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Source Insignt4.0的基本使用

发表于 2019-12-05

第一步 创建新工程

选择默认配置即可

第二步 加载源码文件

这里有三个Add选项

  • Add : 添加指定文件
  • Add All: 将选中目录的所有文件加入到工程中
  • Add Tree: 递归加入所有文件,它采用了部分打开文件的方式,没有用到的文件不会打开,所以,加入数千个文件也不用担心加入的文件超出程序的所能容忍的最大值 推荐使用这种

源码加载完成后关闭该窗口

第三步 熟悉主界面和源码搜索

第四步 更改字体大小

面板字体设置

代码显示窗口字体设置

常用快捷键介绍

各工具栏命令如下:

img对应的文件菜单的功能

New(快捷键ctrl+N) 新建一个文件

Open(快捷键ctrl+O) 打开一个文件

Save(快捷键ctrl+S) 保存当前打开的文件

Save As(快捷键ctrl+shift+S) 将当前打开的文件保存为其它名子的文件

Save All(快捷键ctrl+A) 保存所有打开的和修改过的文件

Print 打印当前打开的文件

img对应的编辑菜单功能

Cut(快捷键ctrl+X)

Copy(快捷键ctrl+C)

Paste(快捷键ctrl+V)

Undo(快捷键ctrl+Z)

Redo(快捷键ctrl+Y)

img对应查找菜单功能

Search(快捷键ctrl+F) 在当前打开的文件中查找

Search Backward(快捷键F3) 在当前光标位置进行向后查找

Search Forward(快捷键F4) 在当前光标位置进行向前查找

Search Files(快捷键ctrl+shift+F) 在多文件(Source Insight工程中)中查找

Replace(快捷键ctrl+H) 在当前文件中进行查找和替代

img

对应于窗口功能,与普通的多文档编辑器相同,用来设置打开多个文件时窗口显示方式和规则。

img

用来设置Project窗口、Context窗口、Relation窗口和Clip窗口的显示或关闭。当快捷键点亮时,所对应的窗口显示。

img

Jump To Definition(快捷键ctrl+=) 跳转到当前光标所在位置的函数或变量的定义处(并打开文件)

Symbol Info 弹出一个窗口来显示当前光标位置的函数或变量的定义原型

Browse Project Symbols(快捷键F7) 在整个工程中查找一个函数或变量的出现位置

Lookup Reference(快捷键ctrl+/) 建立一个Reference链接,所对应的链接处会出现一个链接标志,通过链接标志可以方便的进行函数的查看。

img

Go To Previous Link 跳转到前一个Reference链接(此功能必须先建立一个Reference链接)

Go To Next Link(shift+F9) 跳转到前一个Reference链接(同上)

Go Back(Alt+)) 光标调转到前一个历史操作位置

Go Forward(Alt+.) 光标调转到后一个历史操作位置

Go To Line(F5) 跳转到指定的行位置

Bookmark(ctrl+M) 书签

img

帮助功能

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android系统架构简介

发表于 2019-12-05

Android系统架构师安卓系统的体系机构,Android的系统架构和其他操作系统一样,采用了分层的架构,共分为4层,从高到低分别是Android应用层,Android应用架构层,Android系统运行层和Linux内核层。

1. 应用程序

顶层中有所有的Android应用程序,包括通讯录、浏览器等,你写的应用程序也被安装在这层;所有的的应用程序都是使用Java语言编写的。

2. 应用框架层

这一层主要提供构建应用程序是可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用API来构建自己的应用程序

活动管理者(Activity Manager):控制应用程序生命周期和活动栈的所有方面

内容提供器(Content Providers):允许程序之间发布和分享数据。

资源管理器(Resource Manager):提供对非代码嵌入资源的访问,如字符串、颜色设置和用户界面布局。

通知管理器(Notification Manager):允许应用程序显示对话框或者通知给用户

视图系统(View System):一个可拓展的视图集合,用于创建应用程序用户界面

3. 系统运行库层

1) 程序库

Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。他们通过Android应用程序框架为开发者提供服务,以下是一些核心库:

  • 系统C库(libc):一个从BSD继承来的标准C系统函数库,他是专门为基于embedded linux的设备定制的媒体库(Media Framework):基于Packet Video opencore; 该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括 MPEG4。H264、MP3、AAC、AMR、JPG、PNG。
  • Surface Manager:对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。
  • SGL:底层的2D图形引擎
  • 3D libraries:基于OpenFLES1.0 APLs实现,该库可以使用硬件3D加速或者使用高度优化3D软加速
  • FreeType:位图(bitmap)和矢量(vector)字体显示
  • SQLite:一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

2) Android运行库

Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。

每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该个税文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由java编译器编译,然后通过SDK中的”dx”工具转化成 .dex格式由虚拟机执行

Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

4. Linux内核层

Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了底层驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,WIFI驱动,电源管理等

区别DVM与JVM

  1. 首要差别

1Dalvik:基于寄存器,编译和运行都会更快些

JVM:基于栈,编译和运行都会慢一些

  1. 字节码的区别

Dalvik:执行.dex格式的字节码,是对.class文件进行压缩后产生的,文件变小

JVM:执行.class格式的字节码

  1. 运行环境的区别

Dalvik: 一个应用启动都运行一个单独的虚拟机运行在一个单独的进程中

JVM:只能运行一个实例,也就是所有应用都运行在同一个JVM中

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android系统的启动过程大致介绍

发表于 2019-12-05

安卓手机从开机到桌面显示的这个过程,即为Android系统启动过程,那么在这个过程中, Android系统内部都做了哪些操作呢?

首先咱们来看一张Android系统架构图:

Android系统的启动是由下往上进行的

从系统核心库Init.c的main函数开始执行—>Android Runtime—>执行init1函数初始化native也就是Libraries层—>执行init2函数初始化Framework层—>最后是Application层

具体流程图如下:

具体时序图如下:

当然 还有详细的思维导图供大家参考

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

2019主流能用的前端混合开发框架都有哪些

发表于 2019-12-04

目前可用框架

  • MUI
  • ReactNative
  • Weex
  • Cordova
  • Ionic
  • Flutter

1.MUI

mui是最接近原生App体验的前端框架。

体积极小:100k的js文件,60k的css文件。

原生编写,不依赖任何三方框架

极强:xcode和Android studio里所有原生控件都具备

高性能:精练的代码、适时的5+原生动画调用,达到原生应用的体验

多端发布:编写一套代码,iOS、Android、浏览器、微信App、百度直达号、流应用全覆盖

2 . ReactNative

Facebook出品

文档全

社区成熟

组件丰富

劣势

需要维护两套代码,即 iOS,Android 各一套。并且开发调试 iOS 只能使用 Mac 设备

对开发设备有要求,调试不方便

3.Weex

iOS, android, H5 共用一套代码,

基于vue

但是

社区极度不成熟

文档不全

组件有限

资料少

4.Cordova

前身是PhoneGap,后被Adobe公司收购, 目前已经捐赠给Apache开源

优势

集成方便

文档全

组件丰富

劣势

流畅度欠缺

5.ionic

优势

基于Angular语法,简单易学

开发效率高(如果熟悉Angular的话)

劣势

受限于Angular

流畅度一般

可定制性差

6.Flutter

google出品

性能强

组件丰富

跨平台

但是

开发门槛稍高 需要学习Dart语言

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Source Insight 4.0 安装与破解(附下载地址)

发表于 2019-12-04

Source Insight4.0简介

Source Insight 4.0是一款功能强大的程序编辑器和代码浏览器,只要你拥有相应的程序语言包就能够进行程序分析, 比如说目前最好的开源语言java

作为一个android开发人员, 如果你想在windows平台上阅读程序源码, 那么Source Insight是你的布尔首选

Source Insight4.0 下载地址

如果您已经安装了sourceinsight4.0,只是需要破解,则直接下载以下资源:

链接: https://pan.baidu.com/s/1dFWD4YX 密码: icjm

解压密码: biu 因可能被检测版权问题,故必须加密打包分享。

如果需要全部重新安装,请下载 完全安装包+破解exe+lisence 压缩包:

链接: https://pan.baidu.com/s/1eSZtsbw 密码: 3kjj

解压密码: biu 因可能被检测版权问题,故必须加密打包分享。

备用破解版下载:

https://545c.com/f/21042697-503735264-7eb2bc
(访问密码:312306)

Source Insight4.0破解方法

第一步 安装Source Insight4.0

第二步 替换Source Insight.exe文件

第三步 加载lic注册文件

第四步 点击“Next”破解成功!

附录二:

如果安装或者安装后提示有问题,请进行完全卸载后,再重装一遍即可。

完全卸载方式:

1、清除注册表信息:

  • “win ”+ R 或者 “开始” -> “运行”,输入“regedit”,回车;
  • 在弹出的注册表管理器中,选择“编辑”-> “查找”->“source insight”,或按照下述路径展开:HKEY_CURRENT_USER -> software -> Source Dynamics -> Source Insight;
  • 将该项下面的source insight 需要清除的对应版本项目选中,右键“删除“。

2、删除全局配置信息:

  • 在 ./user/document/source insight 3.0/4.0 下的所有文件及该文件夹
  • 注意此处的路径可能不同 也可能是:“库”->“用户”(也可能是你的名字) -> 文档 -> source insight3.0/4.0
  • 或者 你上次安装的时候所指定的其他位置

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Java面试题之面向对象的设计原则 一次性记忆

发表于 2019-11-28

六大原则

  • 单一职责原则——SRP
  • 开闭原则——OCP
  • 里式替换原则——LSP
  • 依赖倒置原则——DIP
  • 接口隔离原则——ISP
  • 迪米特原则——LOD

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android面试题之Handler内存泄漏处理 一次性记忆

发表于 2019-11-28

为什么会内存泄漏

内部类持有外部类对象引用,导致外部类无法被回收

如何解决内存泄露

  • 使用静态内部类
  • Activity销毁时handler.removeCallback()
  • 使用弱引用

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android面试题之Service 一次性记忆

发表于 2019-11-27

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。

这两个方法都 可以启动Service,但是它们的使用场合有所不同。

  • 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服 务仍然运行。

  • 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的 特点。

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…45464748

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

479 日志
139 标签
RSS
© 2024 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%