当前位置:首页 » 安卓系统 » androidstd

androidstd

发布时间: 2023-05-22 03:47:43

① 如何在 android 系统中使用 std:stoul 和 std:stoull

为什么您不能使用函数的原因是相当根深蒂固和遗憾的是目前无法解决。
寻找到 libs/armeabi-v7a/include/bits/c++config.h 文件在 gnu stdlibc + + 文件夹中,你会看到这个:
...
/* Define if C99 functions or macros from <wchar.h>, <math.h>, <complex.h>,
<stdio.h>, and <stdlib.h> can be used or exposed. */
/* #undef _GLIBCXX_USE_C99 */
...

在上面,在下面的代码段从结合 bits/basic_string.h 咒语坏消息:
...
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

/* The definitions of Numeric Conversions [string.conversions] */
#endif
...

因此,这些函数是在 NDK 中无法使用。
根本原因:根本原因似乎是 C99 的功能用法岁举迅已在 GNU stdlibc + + 中由于事实 armeabi v7a 平台上被禁用仿生 libc 不支持复杂的数学 (Android 上的标准 C 库是仿生)。
可能修复 (未经测试):探讨CrystaX 的 Android NDK似乎对香草 Android NDK 有扩展的。
注: __GXX_EXPERIMENTAL_CXX0X__通过添加定义 -std=gnu++11 到 APP_CXXFLAGS 或 LOCAL_CXXFLAGS
详细测试日志:使用 NDK 版本 r8e 生成
jni/Application.mk:
APP_STL := gnustl_static
APP_CXXFLAGS += -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.7

jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cxx11
LOCAL_SRC_FILES := cxx11.cpp
include $(BUILD_EXECUTABLE)

jni/cxx11.cpp:
#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
#if defined(__GXX_EXPERIMENTAL_CXX0X__)
std::cout<<"__GXX_EXPERIMENTAL_CXX0X__ defined."<<std::endl;
#else
std::cout<<"__GXX_EXPERIMENTAL_CXX0X__ not defined."<乎此<std::endl;
#endif

#if defined(_GLIBCXX_USE_C99)
std::cout<<"_GLIBCXX_USE_C99 defined."<<std::endl;
#else
std::cout<<"_GLIBCXX_USE_C99 not defined."<<std::endl;
#endif

#if defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)
std::cout<<"_GLIBCXX_HAVE_BROKEN_VSWPRINTF defined."<<std::endl;
#else
std::cout<<"_GLIBCXX_HAVE_BROKEN_VSWPRINTF not defined."<<std::endl;
#endif

#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
std::string s="1";
std::cout<<"ll:"<<std::stoll(s)<<std::endl<<答燃"ul:"<<std::stoul(s)<<std::endl;
#else
std::cout<<"No support for stoll/stoul."<<std::endl;
#endif
return(0);
}

Nexus 4 (Android 4.3) 上的输出:
u0_a51@mako:/ $ /data/local/tmp/cxx11
__GXX_EXPERIMENTAL_CXX0X__ defined.
_GLIBCXX_USE_C99 not defined.
_GLIBCXX_HAVE_BROKEN_VSWPRINTF not defined.
No support for stoll/stoul.

② android stdaio logcat 在哪

下方run界面旁边有个简易的l,当闷州码然你可以用迹码android monitor里面的两个就背景和字体蚂哪颜色不同

③ android 基本文件操作命令

ADB (Android Debug Bridge)
说明:下面一些命令需要有root权限才能执行成功
快速启动dos窗口执行adb:
1. adb.exe所在路径添加到系统环境变量中
2. 配置快捷键启动dos
进入C:\WINDOWS\system32目录下,找到cmd.exe.
右击菜单 "发送到" -> 桌面快捷方式。
在桌面上右击"快捷方式 到 cmd.exe" -> "属性" -> "快捷方式"页
-> 光标高亮"快捷键" -> 按下自定义快捷键 (如:Ctrl + Alt + Z)

任何情况下,按下Ctrl + Alt + Z启动dos窗口就可以执行adb命令了

-----------查看设备连接状态 系列-----------
adb get-serialno 获取设备的ID和序列号serialNumber
adb devices 查询当前计算机上连接那些设备(包括模拟器和手机),输出格式: [serialNumber] [state]
adb get-state 查看模拟器/设施的当前状态.

说明:
序列号[serialNumber]——由adb创建的一个字符串,这个字符串通过自己的控制端口<type>-<consolePort>
唯一地识别一个模拟器/设备实例。一个序列号的例子: emulator-5554

-----------发送命令到设备 系列-----------
adb [-d|-e|-s <serialNumber>] <command>
-d 发送命令给usb连接的设备
-e 发送命令到模拟器设备
-s <serialNumber> 发送命令到指定设备

如启动手机设备shell: adb -d shell

adb forward <local> <remote>发布端口,可以设置任意的端口号,
做为主机向模拟器或设备的请求端口。如:adb forward tcp:5555 tcp:8000

adb reboot 重启手机
adb remount 将system分区重新挂载为可读写分区
adb kill-server 终止adb服务进程
adb start-server 重启adb服务进程
adb root 已root权限重启adb服务
adb wait-for-device 在模拟器/设备连接之前把命令转载在adb的命令器中
adb jdwp 查看指定的设施的可用的JDWP信息.
可以用 forward jdwp:<pid> 端口映射信息来连接指定的JDWP进程.例如:
adb forward tcp:8000 jdwp:472
jdb -attach localhost:8000

adb shell am 命令可以启动应用程序

adb shell input text <string> 向设备输入文本(光标所在的文本框)
adb shell input keyevent <event_code> 向设备发送按键事件
如:
在编辑短信时,往文本框输入文本:adb shell input text "hello"
向手机发送键值回Home:adb shell input keyevent 3
event_code 参考view/KeyEvent.java中的 KEYCODE_*
public static final int KEYCODE_SOFT_LEFT = 1;
public static final int KEYCODE_SOFT_RIGHT = 2;
public static final int KEYCODE_HOME = 3;
public static final int KEYCODE_BACK = 4;
public static final int KEYCODE_CALL = 5;
public static final int KEYCODE_ENDCALL = 6;

-----------安装卸载 系列-----------
adb install [-l] [-r] <file> - push this package file to the device and install it
('-l' means forward-lock the app)
('-r' means reinstall the app, keeping its data)
adb uninstall [-k] <package> - remove this app package from the device
('-k' means keep the data and cache directories)
如:
adb install d:\hello.apk
adb unstall com.huawei.hello
说明:如果带-r选项重新安装apk时,安装在 /data/local/tmp/目录下,手机重启后还是使用原来的apk.

-----------文件操作 系列-----------
adb push <local> <remote> - file/dir to device
adb pull <remote> <local> - file/dir from device

-----------基本linux shell命令 系列-----------
adb shell [command]
ls 列出目录下的文件和文件夹
cd 切换目录
rm 删除目录和文件
cat 查看文件内容
ps 可以看那个进程再跑
ps -x [PID] 查看单个进程的状态
top 可以看那个进程的占用率最高
su 切换到root用户
kill [pid] 杀死一个进程
chmod 777 <file> 修改该文件为可执行权限

详细使用情况可以登录一台Linux服务器在shell下查看帮助手册, man <command>

-----------查看系统状态和信息 系列-----------
adb shell procrank 查询各进程内存使用情况
adb shell service list 查看services信息
adb shell cat /proc/meminfo 查看当前的内存情况
adb shell cat /proc/cpuinfo 查看CPU信息(硬件)
adb shell cat /proc/iomem 查看IO内存分区

adb shell getprop 列出系统所有属性
adb shell getprop | findstr "gsm" 列出包含gsm的属性
adb shell setprop <key> <value> 修改系统属性

adb shell sqlite3 可以执行sql语句查看数据库信息, 具体使用情况待调查

-----------Log 系列-----------
adb logcat [ <filter-spec> ] - View device log

1~~~~~~~~~~~查看可用日志缓冲区:
adb logcat -b radio — 查看缓冲区的相关的信息.
adb logcat -b events — 查看和事件相关的的缓冲区.
adb logcat -b main — 查看主要的日志缓冲区

2~~~~~~~~~~~过滤日志输出:
过滤器语句按照下面的格式描tag:priority ... , tag 表示是标签, priority 是表示标签的报告的最低等级
adb logcat *:W 显示优先级为warning或更高的日志信息
adb logcat ActivityManager:I MyApp:D *:S

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签).
优先级有下列集中,是按照从低到高顺利排列的:
V — Verbose (lowest priority)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (highest priority, on which nothing is ever printed)

如果你电脑上运行logcat ,相比在远程adbshell端,你还可以为环境变量ANDROID_LOG_TAGS :输入一个参数来设置默认的过滤
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
需要注意的是ANDROID_LOG_TAGS 过滤器如果通过远程shell运行logcat 或用adb shell logcat 来运行模拟器/设备不能输出日志.

3~~~~~~~~~~~控制日志输出格式:
日志信息包括了许多元数据域包括标签和优先级。可以修改日志的输出格式,所以可以显示出特定的元数据域。可以通过 -v 选项得到格式化输出日志的相关信息.

brief — Display priority/tag and PID of originating process (the default format).
process — Display PID only.
tag — Display the priority/tag only.
thread — Display process:thread and priority/tag only.
raw — Display the raw log message, with no other metadata fields.
time — Display the date, invocation time, priority/tag, and PID of the originating process.
long — Display all metadata fields and separate messages with a blank lines.
当启动了logcat ,你可以通过-v 选项来指定输出格式:

[adb] logcat [-v <format>]
下面是用 thread 来产生的日志格式:

adb logcat -v thread
需要注意的是你只能-v 选项来规定输出格式 option.

4~~~~~~~~~~~Logcat命令列表
-b <buffer> 加载一个可使用的日志缓冲区供查看,比如event 和radio . 默认值是main 。具体查看Viewing Alternative Log Buffers.
-c 清楚屏幕上的日志.
-d 输出日志到屏幕上.
-f <filename> 指定输出日志信息的<filename> ,默认是stdout .
-g 输出指定的日志缓冲区,输出后退出.
-n <count> 设置日志的最大数目<count> .,默认值是4,需要和 -r 选项一起使用。
-r <kbytes> 每<kbytes> 时输出日志,默认值为16,需要和-f 选项一起使用.
-s 设置默认的过滤级别为silent.
-v <format> 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output Format

adb bugreport - return all information from the device
that should be included in a bug report.

adb shell dmesg 查询内核缓冲区信息
adb shell mpstate 各类信息,比如进程信息,内存信息,进程是否异常,kernnel的log等
adb shell mpcrash
adb shell mpsys 查询所有service的状态

-----------其他 -----------

模拟器使用镜像sdcard
用SDK里的mksdcard工具来创建FAT32磁盘镜像并在模拟器启动时加载它。这样创建镜像:? mksdcard <size> <file>,
比如我要创建一个64M的SD卡模拟文件,文件路径是在D:\workspace\sdcard.img
mksdcard 64000000 D:\workspace\sdcard.img

Emulator –sdcard D:\workspace\sdcard.img
或者在eclipse的run菜单的open run dialog对话框中配置启动参数。

#top
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num Maximum number of processes to display.
-n num Updates to show before exiting.
-d num Seconds to wait between updates.
-s col Column to sort by (cpu,vss,rss,thr).
-t Show threads instead of processes.
-h Display this help screen.

********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy

netstat -ano 查看网络连状态
显示协议统计信息和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-v] [interval]

-a 显示所有连接和监听端口。
-b 显示包含于创建每个连接或监听端口的
可执行组件。在某些情况下已知可执行组件
拥有多个独立组件,并且在这些情况下
包含于创建连接或监听端口的组件序列
被显示。这种情况下,可执行组件名
在底部的 [] 中,顶部是其调用的组件,
等等,直到 TCP/IP 部分。注意此选项
可能需要很长时间,如果没有足够权限
可能失败。
-e 显示以太网统计信息。此选项可以与 -s
选项组合使用。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接相关的所属进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是
下列协议之一: TCP、UDP、TCPv6 或 UDPv6。
如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议之一:
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-r 显示路由表。
-s 显示按协议统计信息。默认地,显示 IP、
IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项用于指定默认情况的子集。
-v 与 -b 选项一起使用时将显示包含于
为所有可执行组件创建连接或监听端口的
组件。
interval 重新显示选定统计信息,每次显示之间
暂停时间间隔(以秒计)。按 CTRL+C 停止重新
显示统计信息。如果省略,netstat 显示当前
配置信息(只显示一次)

pm
usage: pm [list|path|install|uninstall]
pm list packages [-f]
pm list permission-groups
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm list features
pm path PACKAGE
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH
pm uninstall [-k] PACKAGE
pm enable PACKAGE_OR_COMPONENT
pm disable PACKAGE_OR_COMPONENT

The list packages command prints all packages. Options:
-f: see their associated file.

The list permission-groups command prints all known
permission groups.

The list permissions command prints all known
permissions, optionally only those in GROUP. Options:
-g: organize by group.
-f: print all information.
-s: short summary.
-d: only list dangerous permissions.
-u: list only the permissions users will see.

The list instrumentation command prints all instrumentations,
or only those that target a specified package. Options:
-f: see their associated file.

The list features command prints all features of the system.

The path command prints the path to the .apk of a package.

The install command installs a package to the system. Options:
-l: install the package with FORWARD_LOCK.
-r: reinstall an exisiting app, keeping its data.
-t: allow test .apks to be installed.
-i: specify the installer package name.

The uninstall command removes a package from the system. Options:
-k: keep the data and cache directories around.
after the package removal.

The enable and disable commands change the enabled state of
a given package or component (written as "package/class").

查看stdout 和stderr
在默认状态下,Android系统有stdout 和 stderr (System.out和System.err )输出到/dev/null ,
在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用stdout 和stderr 和优先级 I.来记录日志信息

通过这种方法指定输出的路径,停止运行的模拟器/设备,然后通过用setprop 命令远程输入日志

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start系统直到你关闭模拟器/设备前设置会一直保留,可以通过添加/data/local.prop 可以使用模拟器/设备上的默认设置

UI/软件 试验程序 Monkey
当Monkey程序在模拟器或设备运行的时候,如果用户出发了比如点击,触摸,手势或一些系统级别的事件的时候,
它就会产生随机脉冲,所以可以用Monkey用随机重复的方法去负荷测试你开发的软件.
最简单的方法就是用用下面的命令来使用Monkey,这个命令将会启动你的软件并且触发500个事件.

$ adb shell monkey -v -p your.package.name 500
更多的关于命令Monkey的命令的信息,可以查看UI/Application Exerciser Monkey documentation page.

④ 如何更改androidsti的工作区间

在工作标签上单顷迅击鼠标右键,在弹出的菜单上有工团乎哪作标签颜色这个选项,单击它即可选择喜欢塌码的颜色啦 比如我把他改成红色了

⑤ android stdi怎么新建工程

工具:

win7

Android Studio

迅陪没方法:

  1. 在MyApplication右键,新建一个Mole

⑥ Android开机速度优化初探

Android的开机速度,基本上没人说快的,通常移植完系统后,马上要看的事情就是优化开机时间,以下是简单回忆以下以前做优化的那些事。

优化开机时间,通常做的首先是那有有没有BUG,明显不合理的先解决,由于开发阶段稳定性腊扰带问题,一些地方可能延时加的大,或者频率设的低,先记下来,后面定期还会再看。这些先不看的话,一般拿到机器,我们统计开机时间,主要看如下几个时间段分布:

开机按键时间、亮屏时间(基本固定,除非弄错了,基本检查一遍确定)

uboot启动时间

内核启动后到bootanim退出时间

可以通过添加打印mole init的李汪log,来check每个mole初始化时的时间。从而找到花费时间比较多的mole:

--- a/init/main.c

+++ b/init/main.c

@@-785,7+785,7@@int__init_or_mole

do_one_initcall(initcall_tfn)

if(initcall_blacklisted(fn))

return

-EPERM;

-if(initcall_debug)

+if(1)

                ret =

do_one_initcall_debug(fn);

-3 优化建议:

preloadClasses()与preloadResources()可以放到两个线程里面跑。

修改zygote的nice值,及thread priority。

http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#590

中增加如下的修改:

在  EventLog . writeEvent ( LOG_BOOT_PROGRESS_PRELOAD_START , 592 SystemClock . uptimeMillis ()); 593 preload (); 594 EventLog . writeEvent ( LOG_BOOT_PROGRESS_PRELOAD_END , 595 SystemClock . uptimeMillis ()); 前增加修改

/* 20151013 optimize android boot begin */

//get the default priority.

int defaultPriority = Process.getThreadPriority(Process.myPid()) ;

//increase the priority .

Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO) ;

在 gcAndFinalize (); 增加

Process.setThreadPriority(defaultPriority) ;

/*  20151013 optimize android boot end */

-2 系统剪裁也有助于提高系统轮芦的开机速度

提升CPU频率 - 将所有CPU切换至性能模式

adb shell stop perf-hal-1-0

adb shell "echo 1 > /sys/devices/system/cpu/cpu0/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu1/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu2/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu3/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu4/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu5/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu6/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu7/online"

adb shell "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,cpubw/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,mincpubw/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,memlat-cpu0/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom, memlat-cpu6/governor"

提升GPU频率

adb shell "echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel"

adb shell "echo 1 > /sys/class/kgsl/kgsl-3d0/force_clk_on"

adb shell "echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor"

-1 电源优化

on init

    # Disable UFS powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 0

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 0

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0

    write /sys/mole/lpm_levels/parameters/sleep_disabled Y

on property:sys.boot_completed=1

    # Enable UFS powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1

    write /sys/mole/lpm_levels/parameters/sleep_disabled N

on charger

    # Enable UFS powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1

    write /sys/class/typec/port0/port_type sink

    write /sys/mole/lpm_levels/parameters/sleep_disabled N

0 bootgraph 用来分析内核功能, 在kernel cmdline 增加 initcall_debug ,然后dmesg > boot.log  bootgraph.pl boot.log >  boot.svg

1通过一个比gzip更快的方式去解压内核镜像;

2 去掉系统中一些不必要的log打印;

3 去掉一些系统中不需要的驱动模块;

4 启动时即以最大频率(cpu/DDR)且多核一起跑;

5 将一些耗时大,对启动顺序没有要求的驱动通过异步方式进行加载(如下所示)

这里我们主要关注的是第三个,也是优化的重点。这部分时间,具体都在干啥,瓶颈是哪,可以通过bootchart很清楚的看到。以下结合以前抓的图,简要说一下(图是很久之前抓的,比较懒,没有再跑一遍过程)

上图中bootanim的退出时间没有截出来,实际图是有的,大约是33s的时候结束。

这里分析时,我们是分了几个时间段:

1 内核开始启动,到init进程开始执行。这个可以通过log看到。

2 init进程执行,主要是处理init.rc中的命令,到core和mainl类服务开始启动的时间,上图中可以看到,服务大体都在一个时间点起来的,约7.5S时,这之前的一大段空窗期,也是要重点看的

3 zygote启动时间

4 systemserver中各个服务启动时间

5 应用启动(systemui/launcher/keyguard..)

以上,具体分析看每段时间:

第一点另外处理,具体分析打印看是否有异常,这个值一般是很小的,不合理要和BSP同事一起查一下原因。

第二个主要是init.rc执行各种命令,这个可以通过在execute_one_command函数中统计测量 ,比如大于100ms的命令打印出来,再分析定位原因,这里命令执行时间长基本算BUG,要和BSP工程师一起解决。

第三点主要zygote启动问题,主要慢的原因,是加载资源和类库,这个要读nand,一般卡的时间比较长,图中可以看到,zygote进程一溜的小粉红,说明IO较多。这个preload过程消耗的时间,在logcat的log中,也会打印的,一般来说,都是在近10S左右。

第四个,zygote初始化完后,会fork system_server。 system_server进程启动,耗时也是较长的。根据以前统计分析的结果,这里的服务启动,基本上都是花在packageManagerService的PackageScan中,这又是一个读文件,卡在文件读取中,时间长短,和预制app及安装的app数量有关

第五个时间,是基本都准备ready后,启动launcher等应用了,启动完成后,systemServer请求SurfaceFlinger杀了bootanimation,就启动完成了。

以上时间中,主要要优化的,还是第三步和第四步的IO慢问题,其他可优化的不多。比如CPU,常开四核performance模式启动,也并没提升多少,一般我们就不管了这个了。

咋优化?

确定优化方向后主要看怎么优化这两段耗时的地方:

1. Zygote的preload 资源和class

2. PackageManagerService的包扫描

这里的第一个,最早之前有人直接是去掉preload或删减,虽然可以加快一点开机速度,但是捡了芝麻丢了西瓜,根本不能这样干~

我们最早做的实现方式,

2.1 是将preload做并行处理,毕竟现在都是多核处理器了,而且是preload是加载后还要解析处理的,并行会有一定幅度提升。

对于包扫描,这个不好拆成并行任务,不像preload那么简单干净。考虑过将PackageManager的信息序列化后存起来,下次开机就不扫了,不过看起来改动有点大,不太好搞,也放弃了。

PackageManagerService扫描、检查APK安装包信息

2.2 PMS对/system/framework,/system/app,/data/app,/data/app-private目录中的APK扫描耗费了大量的时间,如果预置的三方应用很多,这样启动的时间就会越长。

优化建议:

2.3 /system/app下的应用,如果是预置应用,在Android.mk建议加上LOCAL_DEX_PREOPT := true控制,在/system/vendor下的预置应用,如果此应用编译时间比较长的,也使用上LOCAL_DEX_PREOPT := true

2.4 尽量减少data区内置app的数量,这个会严重影响开机速度,特别是第一次的开机速度。放在system的app 尽量生成odex 这样会加快开机速度。

最后我们的实现的方式,就是linux上用的较多的readahead机制。具体实现细节就不展开说了,原理就是:

1. 统计开机过程中,读取的块数据信息,记录下来保存

2.再次开机,通过记录下来的块数据读取信息,直接起一个服务,预先开始读,zygote或packagemanagerservice要读文件的时候,文件数据已经在cache中了。

实际用下来,这一招特别好,优化非常明显。以下是实现了一个readahead后的bootchart图:

可以看到:

1. zygote和system_server都提速了

2. zygote和system_server的IO时间,都降低非常大

3. 主要IO时间,跑到readahead进程中去了。

不过,以上实现,还是有可优化的地方:

1. readahead进程可以再提前,在system分区挂载后立刻启动,这样zygote中的IO应该可以再减小

2. 对system_server的IO,此时readahead已经结束了,按理不应该有了,这里还是有IO,这一般是后装apk导致,这个可以把readahead做的更健壮一些,不要只学习开始的一两次。

其他NB的优化

另外还有一个很NB的技术,就是STD。这个我们也搞过,花费了大量的人力物力。STD开机时间,不算上uboot时间的话,基本都是在10S内,5~8S之间。不过这么NB的技术,目前基本上也是废弃了,用起来问题也挺多的:

1. 开机时间少了,关机时间拉长。

由于是STD(Suspend to Disk),关机时需要将内存数据写入nand,这块也是挺麻烦的事情

2. 稳定性

本身STD弄起来就比较复杂,BUG挺多的,另外使用STD,就相当于永不关机了,这也太考验系统软件的稳定性了...

3. 没毛用

   一开始还能忽悠客户,不过后来也没人怎么关心这个feature了,平白给自己找活干,大家都不乐意使能它了。

⑦ 如何安装android stdius

手机上首先要进行一些设置,设置——应用程序——勾选“未知源”
设置——应用程序——开发——勾选“USB 调试”
APK安装器就是将APK文件安装到手机上的一个PC端软件,我们首先需要下载一个USB驱动,在PC上安装好“APK安装器”,这个软件会自动关联你的APK程序,只一直以来不少机友都在为APK的安装问题困扰。每次安装APK文件,都要寻找APK文件的路径才可以安装,安装一个APK文件至少需要点击6次鼠标,为了您宝贵的时间还有鼠标的寿命,现在就来使用 【安卓网APK安装器】吧,双击APK文件即可轻松安装。
安卓网APK安装器(HiAPK Installer)v1.0 三大特点!
特点一:只需双击即可将APK文件轻松安装到你的手机。
特点二:无论你刷的是G1或是G2的ROM,都可以轻松安装使用。
特点三:【安卓网APK安装器(HiAPK Installer)】系统占用极小,文件大小只有856KB。
1.安装前首先确认您的PC是否已经安装USB 驱动。
压缩包里包括“X86”(一般选择这个就可以了) “AMD64” 还有一个“fastboot”,AMD64 当然是给 64 位系统使用的了,fastboot 是工程状态下刷机使用的,在更改开机图片和 G2 刷机时会用到。
2.安装前请设置好手机 设置——应用程序——勾选“未知源”
设置——应用程序——开发——勾选“USB 调
要双击一下APK程序就可以自动安装到你的手机里了

⑧ 如何在 android 系统中使用 std:stoul 和 std:stoull

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默启册漏认最小的C++运悄烂行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持姿团 stlport_static - 使用STLport作为静态库...

⑨ Android studio报错是怎么回事

一.认识android的架构
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。碰团厅
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
三.开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0;
}
在计算机网络笑隐原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return;
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化输或悉出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他采用了一个while死循环去监听客户端的请求。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Security.addProvider(new AndroidKeyStoreProvider());
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();
Looper.loop();
进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
// 在这里看到了一个循环监听消息
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}
msg.recycleUnchecked();
}
}

⑩ 关于Android打包不识别c++11 std::to_string的错误



改为:

热点内容
androidbutton自定义 发布:2025-05-17 16:58:34 浏览:168
android应用生命周期 发布:2025-05-17 16:53:16 浏览:778
珠海四层交换机怎么配置 发布:2025-05-17 16:50:17 浏览:219
服务器怎么变成3个电脑 发布:2025-05-17 16:50:11 浏览:284
sql存储数据 发布:2025-05-17 16:43:28 浏览:701
外贴算法 发布:2025-05-17 16:13:34 浏览:389
多出口ip服务器 发布:2025-05-17 16:04:50 浏览:661
双指针算法 发布:2025-05-17 16:04:04 浏览:705
媒体采访问答 发布:2025-05-17 15:59:44 浏览:692
androidstudiojni 发布:2025-05-17 15:59:42 浏览:167