如何让Android系统或Android应用执行shell脚本
一、Android应用启动服务执行脚本
androidapp启动流程 android启动应用
androidapp启动流程 android启动应用
1 如何写服务和脚本
在android源码根目录下有/dev/tegatech/teg2/init.rc文件相信大家对这个文件都不陌生(如果不明白就仔细研读下android启动流程)。如果在该脚本文件中添加诸如以下服务:
serv ulp_test /data/setip/init.ulpmod.sh
oneshot
disabled
注解:每个设备下都会有自己对应的init.rc,init.设备名.rc脚本文件。oneshot disabled向我们说明了在系统启动的时候这个服务是不会自动启动的。并且该服务的目的是执行/data/setip/init.ulpmod.sh脚本。脚本的内容你可以随便写,只要符合shell语法就可以了,比如脚本可以是简单的设置0:
# ! //bin/sh //脚本的开头必须这样写。
2、如何在应用中启动服务
1)首先了解下在服务启动的流程
1. 在你的应用中让init.rc中添加的服务启动起来。
首先了解下在服务启动的流程:
在设备目录下的init.c(切记并不是syste继承自Activity是百试百灵,再也不需要在AndroidMnifest中注册了,但是发现继承AppCompatActivity还是会报错,我都不记得当时是怎么解决这个问题的,反正搞了好几天,我选择遗忘那段的时光。m/core/init/init.rc)
Main函数的for(;;)循环中有一个handle_property_set_fd(),函数:
for (i = 0; i < fd_count; i++) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_压力触控:唤出当前页面情景菜单fd())
handle_signal();
}}
这个函数的实现也在/core/init目录下,该函数中的check_control_perms(msg.value, cr.uid, cr.gid)函数就是检查该uid是否有权限启动服务(msg.value就是你服务的名字),如果应用为root或用户则直接返回1.之后就是调用handle_control_message((char) msg.name + 4, (char) msg.value),该函数的参数就是去掉1.ctl.后的start和2.你服务的名字。这个函数的详细内容:
void handle_control_message(const char msg, const char arg)
{if (!strcmp(msg,"start")) {
msg_start(arg);
} else if (!strcmp(msg,"stop")) {
msg_stop(arg);
} else if (!strcmp(msg,"restart")) {
msg_stop(arg);
msg_start(arg);
} else {
ERROR("unknown control msg '%s'n", msg);
}}
匹配start后调用msg_start.服务就这样起来了,我们的解决方案就是在检查权限的地方“下点功夫”,因为我们不确定uid,所以就让check_control_perms这个函数不要检查我们的uid,直接检查我们服务的名字,看看这个函数:
static int check_control_perms(const char name, unsigned int uid, unsigned int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;
/ Search the ACL /
for (i = 0; control_perms[i].serv; i++) {
if (strcmp(control_perms[i].serv, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}}
}return 0;
}这个函数里面是必须要检查uid的,我们只要在for循环上写上。
if(strcmp(“ulp_test”,name)==0) //ulp_test就是我们服务的名字。
return 1;
init.c和init.rc都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了。
如何在Android手机上开发出Android应用
你可以去应用之星网站来开发,无需编码技术,轻松就能生成一款Android应用
eclipse上编写安卓程序就可以啊,可以在手机运行也可以在虚拟机上运行
极其流行,同样也是竞争力极其大的一种商业模式。虽然国内软件开发公司都发展壮大起来了,但是各地软件开发公司的实力及资质仍然参不齐。下面为大家介绍下近期国内软件开发公司的排名汇总。
1:华盛恒辉科技有限公司
上榜理由:华盛恒辉是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在开发、建设到运营推广领域拥有丰富经验,我们通过建立对目标客户和用户行为的分析,整合高质量设计和极其新技术,为您打造创意十足、有价值的企业品牌。
在军工领域,合作客户包括:军委联合参谋(原总参)、军委后勤保障部(原总后)、军委装备发展部(原总装)、装备研究所、战略支援、军事科学院、研究所、航天科工、航天科技、船舶工业、船舶重工、研究所、训练器材所、装备技术研究所等单位。
在民用领域,公司大力拓展民用市场,目前合作的客户包括中铁电气化局、铁道科学研究院、如果按矢量图制作设计图按1X尺寸作图,后期放大成2X、3X;如果按传统的px作图应用尺寸(3X)作为画布。济南机务段、东莞轨道交通公司、京港地铁、国电、电力科学研究院、、、中信银行、华为公司等大型客户。
2:五木恒润科技有限公司
上榜理由:五木恒润拥有员工300多人,技术人员占90%以上,是一家专业的军工信息化建设服务单位,为军工单位提供完整的信息化解决方案。公司设有股东会、董事会、监事会、工会等上层机构,同时设置职位,由管理公司的具体事务。公司下设有研发部、质量部、市场部、财务部、人事部等机构。公司下辖成都研发中心、西安研发中心、沈阳办事处、天津办事处等分支机构。
浪潮有限公司是首批认定的规划布局内的重点软件企业,的企业管理软件、分行业ERP及服务供应商,在咨询服务、IT规划、软件及解决方案等方面具有强大的优势,形成了以浪潮ERP系列产品PS、GS、GSP三大主要产品。是目前高端企业管理软件者、企业管理软件技术领先者、的行业ERP与管理软件供应商、国内服务满意度的管理软件企业。
4、德格Da3. Android 系统服务 - PMS 的启动过程gle
德格智能SaaS软件管理系统自德国工业4.0,并且结合国内工厂行业现状而打造的一款工厂智能化信息平台管理软件,具备工厂ERP管理、SCRM客户关系管理、BPM业务流程管理、
OMS订单管理等四大企业业务信息系统,不仅满足企业对生产进行简易管理的需求,并突破局域网应用的局限性,同时使数据管理延伸到互联网与移动商务,不论是内部的管理应用还是外部的移动应用,都可以在智能SaaS软件管理系统中进行业务流程的管控。
app启动图标设计规范-技术干货:ApplewatchAPP设计规范
Roboto是Android系统的默认字体集,字体大小单位sp(可缩放像素数,scaleablepixels)androidapp界面设计规范(dpi,dp,px等)
PPI(Pixelsperinch):每英寸所拥有的像素数,即像素密度。
DPI(dotsperinch):即每英寸上,所能印刷的网点数,一般称为像素密度。ppi计算公式:ppi=屏幕对角线像素数/屏幕对角线英寸数,通过勾股定理计算屏幕对角线像素数。
ScreenSize(屏幕尺寸):手机屏幕尺寸大小,如3英寸、4英寸、4.3英寸、5.7英寸,指的是对角线的长度。
DIP(devindependentpixel):即dip/dp,设备像素。1px=1dp
density(由dpi决定)
Resolution(分辨率):指手机屏幕垂直和水平方向上的像素个数。eg分辨率480
800,指该设备垂直方向有800个像素点,水平方向有480个像素点。
px(Pixel像素):相同像素的ui,在不同分辨率的设备上效果不同。在小分辨率设备上会放大导致失真,大分辨率上被缩小。
AndroidDesign里把主流设备的dpi归成了四个档次:
120dpi、160dpi、240dpi、320dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照dpi之间的比例即2:1.5:1:0.75来给界面中的元素来进行尺寸定义。
也就是说如果以160dpi作为基准的话,只要尺寸的DP是4的公倍数,XHDPI下乘以2,HDPI下乘以1.5,LDPI下乘以0.75即可满足所有尺寸下都是整数pixel。但设以240dpi作为标准,那需要DP是3的公倍数,XHDPI下乘以1.333,MDPI下乘以0.666,LDPI下除以2。而以LDPI和XHDPI为基准就更复杂了。同时款Android设备(HTC的T-MobileG1)是属于160dpi的。鉴于以上各种原因,
标准dpi=160
谷歌对dp的解释如下:
AvirtualpixelunitthatyoushouldusewhendefiningUIlayout,toexpresslayoutdimensionsoritioninadensity-independentway.
Thedensity-independentpixelisequivalenttoonephysicalpixelona160dpiscreen,whichisthebaselinedensityassumedbythefora"medium"densityscreen.Atruntime,thetransparentlyhandlesanyscalingofthedpunits,asnecessary,basedontheactualdensityofthescreeninuse.Theconversionofdpunitstoscreenpixelsis:
px=dp(dpi/160).
Forexample,ona240dpiscreen,1dpequals1.5physicalpixels.Youshouldalwaysusedpunitswhendefiningyourapplication'sUI,toensureproperdisplayofyourUIonscreenswithdifferentdensities.
简单来说,以160dpi的设备为准,该设备上1dp=1px;如果屏幕密度大,1dip代表的px就多,比如在320dpi的屏幕上,1dip=2px(即1dp代表2个像素)。在app开发时,用dp来做界面的布局,以保证适配不同屏幕密度的手机。
dp和px的换算公式:
我的理解,该公式表示px的数值等于dp的数值(设备dpi/160)
注意,px、dp是单位,但density没单位。
applyDimension的源码如下,可参考:
android的尺寸众多,建议使用分辨率为
720x1280
的尺寸设计。这个尺寸720x1280中显示完美,在1080x1920中看起来也比较清晰;切图后的文件大小也适中,应用的内存消耗也不会过高。
app启动图标为4848dp,对应各dpi设备,图像资源像素如下:
|mdpi|hdpi|xhdpi|xxhdpi|
|---:|---:|---:|---:|---:|
|48
48px|72
72px|94
96px|144px
144px|
作栏图标为3232dp,对应各dpi设备,图像资源像素如下:其中图形区域尺寸是2424dp,可参考平时ui切图会有部分留白。
|mdpi|hdpi|xhdpi|xxhdpi|
|---:|---:|---:|---:|---:|
|32
32px|48
48px|64
64px|96px
96px|
通知栏图标为2424dp,对应各dpi设备,图标像素如下:
|mdpi|hdpi|xhdpi|xxhdpi|
|---:|---:|---:|---:|---:|
|24
24px|36
36px|48
48px|72px
72px|
某些场景需要用到小图标,大小应当是1616dp,其中图形区域尺寸1212dp。
|mdpi|hdpi|xhdpi|xxhdpi|
|---:|---:|---:|---:|---:|
|16
24px|32
32px|48px
48px|
APP界面标注及切图注意事项
一、App屏幕适配通用知识
1.标注时注意事项
一般情况要定位一个Icon只需给出上/下边距,左/右边距
标注图标距离只需标到可点击范围外
通用型模块只需单独标明一份,如导航栏
手机可视区域一般为宽度固定,长度超出边界可滑动,所以,标注物体宽度时可按比例说明
如果要标注内容上下居中,左右居中,或等比可不标注
当绘制的是一个列表时且每一条内容一样时,只需标注一条,如果每条内容有少许不同时,只需标明异____糠
当交付的是一张完整时,不需做机型适配,只需给高清图(19201080)即可,注意进行压缩
当背景是纯色时只需给出色值(iOS使用RGB色值,Android使用16进制色值)
图标应给出可点击区域
若图标在不同页面重复出现,且尺寸相不大,直接给出一份切图,并在圆形图标明尺寸,程序会根据需求缩放
可点击按钮通常要给出两种状态:普通/点击(选中)
按钮如果只是矩形、圆角矩形、圆形、椭圆形,给出尺寸和色值,可程序设置
渐变效果可通过程序实现,只需给出起始和结束色值跟范围
2.切图命名规范
背景:bg_
按钮:btn_xxx_
:img_
标签:tab_
图标:icon_
照片:pht_
导航:n_
图示:tip_
菜单:menu_
侧栏:sidebar_
二、iOS应用屏幕适配
1.iOS究竟要是适配多少种机型,以哪款机型分辨率作为设计尺寸
2016-3
iOS只需兼容iPhone4,完美兼容iphone5以上机型
以3X作为画布(12422208)难记且不能整除,我们可直接以1280(6402)作为宽度,完美缩放为1X、2X;
2X->3X以1.5来算尺寸和字号可得到较好效果
2.界面尺寸
设备分辨率状态栏高度导航栏高度标签栏高度
iPhone67501334px40px88px98px
iPhone5/5s/5c6401136px40px88px98px
iPhone4/4s640960px40px88px98px
iPad3/4/Air/Air2/mini220481536px40px88px98px
iPad1/21024768px20px44px49px
iPadmini1024768px20px44px49px
导航栏背景图中,如果考虑状态栏背景,则背景图尺寸为导航栏px+状态栏px,如果只改变导航栏颜色则只需要导航栏px
3.图标尺寸
设备AppStore程序应用主屏幕spotlight搜索标签栏工具栏和导航栏
iPhone6plus10241024px180180px144144px8787px7575px6666px
iPhone610241024px120120px144144px5858px7575px4444px
iPhone5/5s/5c10241024px120120px144144px5858px7575px4444px
iPhone4/4s10241024px120120px144144px5858px7575px4444px
iPad3/4/Air/Air2/mini210241024px180180px144144px100100px5050px4444px
iPad1/210241024px9090px7272px5050px2525px2222px
iPadmini10241024px9090px7272px5050px2525px2222px
按钮切图建议以等宽高尺寸切图,且像素必须>=88、88px,当本身宽度或高度不足时,补充空白像素(透明像素).一般情况下,只需要普通状态下按钮切图即可
(适配不建议等比放大)
4.参考文献
APP切图流程和APP切图命名规范详细完整版
APP切图详细规范指南
iOS和Android的app界面设计规范
APP界面切图命名和文件整理规范
三、Android应用屏幕适配
1.用px作为基础单位的缺陷
对比上图可以知道,ppi越低显示的越大,ppi越高显示的越小,造成不同手机上显示布局不统一!
使用dp作为单位所有机子显示统一
2.衡量一个屏幕清晰度单位————屏幕密度(dpi==ppi)
计算公式:屏幕dpi=√(屏幕长^2+屏幕宽^2)/屏幕尺寸
名称密度代表分辨率Android单位与像素换算
mdpi120dpi~160dpi3204801dp=1px
hdpi160dpi~240dpi4808001dp=1.5px
xhdpi240dpi~320dpi72012801dp=2px
xxhdpi320dpi~480dpi7201280/108019201dp=x
xxxhdpi480dpi~640dpi2k~4k1dp=4px
屏幕大小启动图标作栏图标上下文图标系统通知图标(白色)最细笔画
320480px4848px3232px1616px2424px不小于2px
480800px/480×854px/540×960px7272px4848px2424px3636px不小于x
7201280px9696px6464px3232px4848px不小于4px
10801920px144144px9696px4848px7272px不小于6px
3.究竟要适配多少种机型
2016-3
得出结论:只需适配高端的xxhdpi(7201280/10801920),低端的hdpi(480800)
4.度量单位与边框
可触摸控件都是以48dp为单位的
为什么是48dp?一般情况下,48dp在设备上的物理大小是9mm(会有一些变化)。这刚好在触摸控件的大小范围(7-10mm)内,而且这样的大小,用户用手指触摸起来也比较准确、容易。(xxhdpi标准下为144px)
边框注意留白界面元素之间的留白应当是8dp。
例:
5.字体排版
根据Android设计规范,使用12、14、16、20和34号,字体粗细可调
spHDPIXHDPIXXHDPI
12sp18px24px36px:
14sp21px28px42px
16sp24px32px48px
18sp27px36px54px
20sp30px40px60px
34sp51px68px102px
(注意:字号要为双数,且不可带小数位)
6.9-patch图制作
什么是9-patch图
为什么要用9-patch格式制作图
适应各种手机屏幕拉伸需求,有效缩减体积
什么情况下使用
当发现是背景时且可能拉伸被拉伸时,或过大时
如何制作patch9图
外层增加一全透明像素,在透明像素区花4条纯黑色边
1.宽度可拉伸区域
2.高度可拉伸区域
3.垂直内容区域
4.水平内容区域
8.参考文献
Android设计指南简体中文版4.x
MaterialDesign中文版
Android设计中的.9.png
技术干货:ApplewatchAPP设计规范
一、规范概要
层级式,通过当前页面点击跳转到另外页面的形式。适合应用于复杂产品,需要层层递进。
页面式,页面切换,滑动,类似轮播
AppleWatch导航形式任选其一,不得同时存在。
2.交互方式
轻触:列表、按钮、切换等控件的作
手势:纵向轻扫,界面滚动;横向轻扫,界面导航之间的查看;从屏幕左侧边缘向右轻扫,返回父级界面。
实体控件(手表旋钮):长页面浏览,避免手指长时间轻扫界面何遮挡界面
3.色彩
使用黑色作为APP的背景色,或者深色且高斯模糊的作为背景
高对比度的颜色使用于文字、图标、界面
4文字
SF和苹方
5.图标
通知图标、首屏图标和长看图标、短看图标
情景图标(App内功能图标)
6.布局
并排放置的图标一行不要超过三个
布局优先采用左对齐
二、设计尺寸
1.1屏幕尺寸
38mm(240px)
42mm(312390px)
1.2图标尺寸
通知图标48PX(38mm)55px(42mm)
首屏图标和常看图标80px(38mm)88px(42mm)
短看图标172px(38mm)196px(42mm)
菜单情景图标(App内的功能图标)
图标大小70px,实际图标大小46px。(38mm)
图标大小80px,实际图标大小54px。(42mm)
图标线宽不得小于4px
1.3图标
1.3.1
通知图标,系统通知弹出的图标
1.3.2
首屏图标,如下图所示。首屏图标80px(38mm)88px(42mm)
1.3.3长看图标,如下所示,左上角图标。常看图标80px(38mm)88px(42mm)
1.3.4短看图标,如下图所示。短看图标172px(38mm)196px(42mm)
2.字体和文字
2.1字体
SF和苹方
2.2文字(字号,常见字号单位是PT和PX,PT是开发单位,PX是设计单位,在@2X下换算关系1PT=2PX)
标题headline18PT
正文标题caption15PT
正文body15PT
备注、脚注、辅助文字footnote12PT、13PT
3.颜色
高对比度的颜色使用于文字、图标、界面
1.主色,如下图所示
2.辅助色、点睛色(控件、按钮)
按钮控件在设计中通常带有透明度
3.字体颜色和透明度
4.布局
1状态栏和下方和列表布局间距
38mm(30px),42mm(32px)
2状态栏和列表按钮布局间距
38mm(11px),42mm(1x)
3状态栏和下方文本布局间距
38mm(46px),42mm(50px)
4文字边距和分割线按钮列表边距
5.和按钮到屏幕两边距离
5.控件和列表
1单行控件和列表布局尺寸
38mm
42mm2、在欢迎界面,点击Import Project(注:也是可以直接在菜单选择Import project的)。
2.双行控件和列表布局尺寸
2.1正文+备注
38mm
42mm
2.2双行正文
38mm
42mm
3.三行控件和列表布局尺寸
38mm
42mm
4.多行控件和列表布局尺寸
38mm
42mm
5.控件和列表类型
_
Android插件化架构 - 拦截Activity的启动流程绕过AndroidManifest检测
这样做不会破坏android原本的结构友盟设备指数,不会有什么副作用。了解了Ja的设计模式之后,配合上一期的文章 Android插件化架构 - Activity的启动流程分析 ,那么接下来就需要亲自刀去拦截Activity的启动流程了。前面好事没少干,那么现在就来干干坏事,到底怎样才能让没有注册的Activity启动不报错呢?就是Hook下钩子。
怎么样去找Hook点是个问题,把钩子下在哪里呢?一般的套路肯定是静态,然后是接口,配合反射注入就可以了。Activity启动流程的源码我就不再贴了,如果不了解请移步这里 Android插件化架构 - Activity的启动流程分析 ,我这里直接下钩子。
上面我们已经拦截到了Activity的启动了,也能够看到startActivity方法的打印。但是如果不做任何处理还是会蹦,那么我们需要有一个Activity预先在AndroidMnifest.xml中注册一下,它是不怕太阳的,通过它可以做到借尸还魂。
还魂
总算走出了插件化架构的一小步,过程对于一般人来讲还是有点痛苦的,但是结果带来那种成就感还是值得的,后面我们解决一下资源和布局的加载问题,然后介绍一下360开源的插件化框架DroidPlugin,分析一下它的源码就直接拿过用吧。
所有分享大纲: 2017Android进阶之路与你同行
视频讲解地址:
Android 从点击应用图标到界面显示的过程
视频地址:[转] 一篇文章看明白 Android 从点击应用图标到界面显示的过程 (遵循CC 4.0 BY-SA版权协议)
从点击桌面应用图标到应用显示的过程我们再熟悉不过了,下面我们来分析下这个过程都做了什么。
本文主要对以下问题分析:
如不了解 Android 是如何从开机到 Launcher 启动的过程,请先阅读 Android - 系统启动过程
我们知道 Android 系统启动后已经启动了 Zygote,ServMar,System 等系统进程;ServMar 进程中完成了 Binder 初始化;System 进程中 ActivityMarServ,WindowMarSe16px|24rv,PackageMarServ 等系统服务在 ServMar 中已经注册;启动了 Launcher 桌面应用。
其实 Launcher 本身就是一个应用程序,运行在自己的进程中,我们看到的桌面就是 Launcher 中的一个 Activity。
应用安装的时候,通过 PackageMarServ 解析 apk 的 AndroidManifest.xml 文件,提取出这个 apk 的信息写入到 packages.xml 文件中,这些信息包括:权限、应用包名、icon、apk 的安装位置、版本、userID 等等。packages.xml 文件位于系统目录下/data//packages.xml。
同时桌面 Launcher 会为安装过的应用生成不同的应用入口,对应桌面上的应用图标,下面分析点击应用图标的到应用启动的过程。
点击 Launcher 中应用图标将会执行以下方法
在 _server 进程中的服务端 ActivityMarServ 收到 START_ACTIVITY_TRANSACTION 命令后进行处理,调用 startActivity() 方法。
从 Launcher 点击图标,如果应用没有启动过,则会 fork 一个新进程。创建新进程的时候,ActivityMarServ 会保存一个 ProcessRecord 信息,Activity 应用程序中的AndroidManifest.xml 配置文件中,我们没有指定 Application 标签的 process 属性,系统就会默认使用 package 的名称。每一个应用程序都有自己的 uid,因此,这里 uid + process 的组合就可以为每一个应用程序创建一个 ProcessRecord。每次在新建新进程前的时候会先判断这个 ProcessRecord 是否已存在,如果已经存在就不会新建进程了,这就属于应用内打开 Activity 的过程了。
进程创建成功切换至 App 进程,进入 app 进程后将 ActivityThread 类加载到新进程,并调用 ActivityThread.main() 方法
此时只创建了应用程序的 ActivityThread 和 ApplicationThread,和开启了 Handler 消息循环机制,其他的都还未创建, ActivityThread.attach(false) 又会最终到 ActivityMangerServ 的 attachApplication,这个工程其实是将本地的 ApplicationThread 传递到 ActivityMangerServ。然后 ActivityMangerServ 就可以通过 ApplicationThread 的 ApplicationThreadProxy 来调用应用程序 ApplicationThread.bindApplication,通知应用程序的 ApplicationThread 已和 ActivityMangerServ 绑定,可以不借助其他进程帮助直接通信了。此时 Launcher 的任务也算是完成了。
在 _server 进程中的服务端 ActivityMarServ 收到 ATTACH_APPLICATION_TRANSACTION 命令后进行处理,调用 attachApplication()。
发送送完 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,还会发送 BIND_APPLICATION_TRANSACTION 命令来创建 Application。
在 app 进程中,收到 BIND_APPLICATION_TRANSACTION 命令后调用 ActivityThread.bindApplication()。
ApplicationThreadProxy.bindApplication(…) 会传来这个应用的一些信息,如ApplicationInfo,Configuration 等,在 ApplicationThread.bindApplication 里会待信息封装成AppBindData,通过
将信息放到应用里的消息队列里,通过 Handler 消息机制,在 ActivityThread.handleMeaasge 里处理 H.BIND_APPLICATION 的信息,调用 AplicationThread.handleBindApplication。
这时 Application 就创建好了,这点很重要,很多资料里说 Application 是在performLaunchActivity() 里创建的,因为 performLaunchActivity() 也有mInstrumentation.newApplication 这个调用,newApplication() 函数中可看出会先判断是否以及创建了 Application,如果之前已经创建,就返回已创建的 Application 对象。
上面 fork 进程时会发送 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,在 app 进程中,收到 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令后调用 ApplicationThread.scheduleLaunchActivity()。
与 Window 进行关联,具体过程详见: Activity,Window,View 之间的关系
Activity 的整体启动流程如图所示:
Linux全命令行作下配置Mysql+TomcatAndroidApp基本步骤?
if (ufds[i].rnts == POLLIN) {在linux中可以实现用户定制的Tomcat实例。如果多个开发人员需要共享安装的tomcat,但是他们需要自己的实例,那么非常的有用。要实现这个需要设置CATALINA_BASE.exportCATALINA_BASE=$HOME/tomcat如果环境中不存在,那么CATALINA_BASE将自动被设置为CATALINA_HOME。下面,需要在主目录下建立Tomcat目录,并且创建或者拷贝特定目录。cd$HOMEmdtomcatcdtomcatmdlogdwebappdworkmdtemp如果希望拷贝tomcatwebapps目录的内容,可以把他们拷贝到新的webapps目录。修改conf/server.xml文件,替换以下的端口以免冲突。如果将Tomcat配置成为Apache的侦听端口8009,那么可以在server.xml文件中注释该元素而禁用该连接器。其38mm和42mm边距相同他可能需要修改的端口:8080默认的连接端口8443SSL的连接端口8009Apache的侦听端口8005用于停止Tomcat的端口修改完成后,可以使用CATALINA_HOME/bin目录中的常见的startup.sh与shutdown.sh脚本来启动和停止Tomcat。此时候因为文件权限设置为你的用户使用,所以不要使用tomcat用户。
应用启动流程梳理(二)-Input传递流程
,具体见如下表格。接上篇,上篇简单介绍了下应用安装流程,以及附加梳理了编译和加载相关的一些内容。这个过程很多知识点启动流程会涉及到,所以先打个底。那么其实从这篇开始才正式进入应用的启动流程梳理。
大致流程:
2.1. TP形成 :屏幕的Firmware按一定频率扫描到电流变化开始计算触摸的位置并上报,报点信息通过TP driver处理最终写入相关设备(/dev/input/ntXXX)。
2.2. 获取 :EventHub收集底层硬件设备tp报点。打开"/dev/input/"目录下的input设备,并将其注册到epoll的队列中。一旦对应设备上有可读的input,马上包装成nt,上报给InputReader。
2.3. 读取 :InputReader获取到后,通过DevId和对应的InputMapper来确认是什么设备的什么类型,并对其进行首次数据结果封装,结果放入InputDispatcher的mInboundQueue中等待被分发处理。
2.4. 分发 :InputDispatcher从mInboundQueue队头取出,寻找焦点窗口,确认InputChannel连接是否有效(InputChannel注册是在WMS创建窗口时候做的),一切就绪就把当前放入outBoundQueue, 然后将发送给应用进程,同时将当前对象从outBoundQueue转移到waitQueue.这里要注意ANR的问题,如果下一个Input到来,发现当前waitQueue队列不为空,且头分发超过了500ms,那么就开始ANR计时,超过5S会生成ANR对应的command命令,在下一次触发command命令时走ANR流程。
Input在系统层面传递的整体流程图如下:
2.6. 分发 :dispatchTouchEvent(分发)、onInteceptTouchEvent(过滤)、onTouchEvent(处理)。其中onInteceptTouchEvent只有ViewGroup才有。
好了Input就梳理这么多,具体细节老规矩还是参考之前的文章:
Android Input(一)-相关模块iPhone6plus12422208px60px132px146px初始化
Android Input(二)-输入子系统
Android Input(三)-InputReader获取
Android Input(四) -InputDispatcher分发
Android Input(五)-InputChannel通信
Android Input(六)-ViewRootImpl接收
Android Input(八)- ANR原理分析
Android Input(九)-Input问题分析指北
Android Input(十)-整体流程图
Android WMS(三)- Input管理
Android应用程序被系统回收后处理
Instrumentation:在android中如果一个应用程序被按Home键回到桌面了,这个时候应用程序就处于后台运行状态,后台运行状态的应用在系统内存不足的情况下有可能会被系统回收掉。我们可以用Android DDMS模拟一下把进程kill掉。然后重新进入应用的重启情况。
这个是app从启动-退出后台-系统kill-重启的一个流程3、浪潮
android studio怎么使用
通用型颜色、字体单独标明一份要使用Android studio要先从eclipse中导出代码,并导入到studio中,Eclipse迁移到Android studio步骤如下:
Android Input(七)-ViewRootImpl处理一、从Eclipse中导出:
1、将你的ADT插件版本升级到22.0以上。
2、在Eclipse中,选择File-->Export。
3、在弹出的导出窗口中,打开Android的文件夹,选择“Generate Gradle Build Files”。
4、选中你想要导入到Android Studio中的项目,Finish。
注意:导出的项目将会和原来的项目在同一目录,覆盖原来的同时,会新增一个叫build.gradle的文件,导入Android Studio时将首先读取这个文件。
二、导入到Android Studio:
1、在Android Studio 中,首先关掉你当前的打开的项目。
3、选中Eclipse中导出的项目,展开目录,点击build.gradle文件,然后OK。
4、在之后的弹出对话框中,会要求你选择Gradle的配置,选中Use gradle wrapper.(注:也可以自定义你本机装的Gradle)。
注意:如果没有Grade build文件,也是可以将普通的安卓项目导入到Android Studio中,它会用现有的Ant build.但为了更好地使用之后的功能和充分使用构建变量,还是强烈地建议先从ADT插件中生成Gradle文件再导入Android Studio。
Android 四大组件 - 进程的 fork 创建过程
相关文章链接:
1. A1.导航形式ndroid Framework - 学习启动篇
2. Android 系统服务 - AMS 的启动过程
4. Android Framework - 开机启动 Zygote 进程
相关源码文件:
无论是点击桌面图标调用 startActivitySIfconfig 0 172.16.100.206 netmask 255.255.0.0 up//设置ip的命令afely 还是直接调用 startActivity 在源码中都是调用的 startActivityForResult 方法。由于 Activity 的启动流程有些复杂,因此本文先从进程的 fork 创建过程来入手分析。
activity 的启动过程中会掉用 startSpecificActivityLocked 方法,首先会根据 processName 和 uid 来判断进程是否有创建,如果没有创建进程则需要先创建进程,processName 默认情况是包名,uid 是由 PMS 在启动的过程中解析计算好的,其具体的计算赋值过程可以参考 《Android 系统服务 - PMS 的启动过程》
如果当前进程没有创建,则调用 Process 的 startViaZygote 方法去创建进程,就是向 Zygote 进程发起创建进程的请求,这里跨进程通信采用的是 Socket 套接字的方式。注意,其中有一个重要的参数 entryPoint 是 android.app.ActivityThread 。
Zygote 启动后会循环处理客户端发过来的请求,当接收到请求后会调用 ZygoteConnection 的 runOnce 方法,解析到客户端的参数后会调用 native 底层的 fork 的方法,至此进程才真正创建完毕。进程 fork 完毕后,Zygote 进程会将信息返回给 AMS,新创建的进程会调用 commonInit 、nativeZygoteInit 和 applicationInit 三个核心方法:
进程 fork 后会执行 ActivityThread 的 main 方法,该方法又会向 AMS 发起绑定 IApplicationThread 请求,这里 IApplicationThread 是一个可以跨进程通信的 Binder 对象,然后 AMS 又会调用 IApplicationThread 的 bindApplication 方法去创建应用的 Application,等应用的 Application 创建完毕后,才会真正的开始创建启动 Activity 。
视频密码:6fzw