重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
开发调试环境: Ubuntu 14/display/IDEADEV/Inotify+Watches+Limit),具体内容如下图:四、解决源码中跳转错误问题 ①为当前工程设置正确的SDK和JDK②设置'Modules'的依赖先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了. 如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar) 点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:其它版本的代码在添加frameworks时可能会显示成:没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的. 如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可. 五、DEBUG源码 我们可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.可以按照上图中'1'和'2'来添加Android Framework支持.在代码中加断点,然后选择'Run'-'Attach debugger to Android process'或者直接点击下图所示的图标 在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可. 六、其它 代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion. 我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。 也可以考虑使用build.gradle来解决该问题。
成都创新互联公司主打移动网站、成都网站建设、成都做网站、网站改版、网络推广、网站维护、国际域名空间、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
创建文件 IMyApiService
文件路径 frameworks/base/core/java/android/os/
定义了一个计算和的方法。
在frameworks/base/Android.mk
LOCAL_SRC_FILES最后加入
创建文件 MyApiService.java
文件路径 frameworks/base/core/java/com/android/server/
实现aidl的接口,计算参数和。
(1)Context添加服务名
文件路径 frameworks/base/core/java/android/content/Context.java
添加
(2)添加启动服务
文件路径 frameworks/base/services/java/com/android/server/SystemServer.java
在startOtherServices方法中添加
创建 MyApiManager.java文件
文件路径 frameworks/base/core/java/android/app/
文件路径 frameworks/base/core/java/android/app/ContextImpl
添加registerService
记住make update-api
编译打包完成后,烧写新的固件。
jar主要为了在android studio编译环境中MyApiManager报错导致编译不通过问题。
也可以导入frameworks jar包或使用反射。
在源码目录packages/app下新建MyJar文件夹
并新建目录com/myapi/(包名)
在目录com/myapi/新建文件MyApi.java
具体Android.mk语法这里不做解释,可以自行查阅
在MyApi目录下直接运行mm编译命令(记得先source build/envsetup.sh)
待编译完成后,jar生成目录
out/target/common/obj/JAVA_LIBRARIES/Myapi_intermediates/javalib.jar
可更改为其他名称。
用eclipse + ADT作为android开发工具, 可以说是很方便的,在HelloActivity小程序里我们就感觉到eclipse功能的强大。那么,我们可以用 eclipse来开发android源码吗?如果我们直接把android源码里一个工程导入eclipse,一般来说都会出现错误,说许多类库(包)找 不到。
今天找到关于怎样使用eclipse来开发android源码的官方文档:
e7 V/ [: ]! l* P+ n0 `
从该文档和实践可以总结出几点:0 J* f" t: q/ i c
1、可以使用eclipse来编辑JAVA程序、检查错误(主要是类库包含和语法方面),但是不能在eclipse上编译运行android源码,还是得在shell中make(或mm或mmm)
2、android源码文件夹里提供有一些eclipse配置文件,. n; `4 E) z5 B8 G6 V, z1 x2 a
.claapath:eclipse工程的配置文件,方便我们直接把android源码相应的文件和JAVA包导入工程# ?% B9 J, m! t% n0 t* B9 P' ?; {
android-formatting.xml和android.importorder:这个很重要,主要是用来规范我们的编码风格,更容易使我们的代码风格一致
3、把android源码作为一个工程导入eclipse时,必须注意两点
1)、新建的工程必须是java project,不能是android project,否则会破坏android源码(一般是多添加文件/文件夹)
2)、导入前最好检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹)
总的来说:! P" A+ ~' ]% p9 I5 U7 V; S; B
1、用eclipse来编辑代码、检查错误
2、不在eclipse上编译、运行android源码程序,只能在命令行通过make(或mm或mmm)编译android源码
3、可以在eclipse上调试android源码程序(原理:eclipse通过ddms服务器在emulator上进行调试),并可以单步调试、断点调试。
下面,从官方文档总结出具体怎样用eclipse来开发android源码
1、建立基本的android开发环境3 {# ?0 q: D k# k) \$ R
请参考官方文档或
2、编译android源码
android源码根目录下通过make进行编译,请注意一些配置,具体可参考
3、把eclipse工程配置文件复制到android源码根目录下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the copy writable
4、修改eclipse程序的配置
1)、修改eclipse缓存设置
把eclipse.ini(在eclipse软件的安装目录下)的3个值改为下面的值:
-Xms128m/ i2 t! A4 p! Z% V/ q# o" J
-Xmx512m; J z8 E. @' z' D' D3 W
-XX:MaxPermSize=256m
2)、把android-formatting.xml和android.importorder导入eclipse
android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。( S8 q$ p' T* x" \/ H7 a
在window-preferences-java-Code style-Formatter中导入android-formatting.xml+ X" y* b! N$ m
在window-preferences-java-Code style-Organize Imports中导入android.importorder# F d5 X" H. X
3)、安装anyedit插件(可选)# G9 C; h/ Z q5 D! s8 z7 y9 _
在下载并导入eclipse中+ J. X# @5 ?3 r3 U
5、把android源码作为一个工程导入eclipse
导入前先检查.classpath里的文件在android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹),.classpath里多余的路径可删除- ]! U4 n$ @: ~9 b+ A1 |- z
新建Java Project(不是android project,否则会破坏android源码),选择从已存在的工程导入,工程名任意,完成。
导入时,eclipse要build工程,比较慢。导完后,一般都没有错误。" B( U i% w# w* y4 ]
6、eclipse上调试android里的程序。
先执行:$ K+ H, r. }, v. _ U5 q' x ~, I
cd android源码目录
. build/envsetup.sh
lunch 1 # to build the emulator
emulator # you should see a GUI picture of a phone$ q- {/ n6 z+ {. k0 O I0 \- p
ddms # you should get a splufty debugging console
然后在eclipse中配置调试类型和端口:5 z8 t( q* A+ o- g7 L# _
在Run-Debug Configurations-Remote java application上双击,然后,”Host:”设为localhost,”Port:”设为8700,”Connection Type”为Standard(Socket Attach)
然后“Apply”- Q7 I( \8 v4 B A9 R/ Q u
注意,在点击”Debug”时苦出错,说8700端口被占用,那么把DDMS程序关掉,重新打开DDMS就OK了。如果提供连不到VM错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行 Debug。. B% \* E! T, K7 N8 U b
在eclipse调试时,可以设断点、单步调试。估计google团队也是这样开发、调试android应用程序的 X: n6 t" |% B4 E
7、编译android源码2 ?: `9 i0 O1 U; E* |+ Z' ]/ r
执行:
cd android源码目录0 v1 Z; p1 P0 |$ V6 x5 A. @$ S2 o7 p
. build/envsetup.sh$ R! h! ^- l/ l: i5 P
那么就会多出mm/mmm等命令,mm/mmm用来编译模块(包括C、C++、JAVA程序)。我们也可以直接在 android源码根目录下执行“make 模块名”来编译模块。
来自开源中国网老枪的分享
点可以理解为选中态,在Android TV上起很重要的作用。一个视图控件只有在获得焦点的状态下,才能响应按键的Click事件。
相对于手机上用手指点击屏幕产生的Click事件, 在TV中通过点击遥控器的方向键来控制焦点的移动。当焦点移动到目标控件上之后,按下遥控器的确定键,才会触发一个Click事件,进而去做下一步的处理
在处理焦点的时候,有一些基础的用法需要知道。
首先,一个控件isFocusable()需要为true才有资格可以获取到焦点。如果想要在触摸模式下获取焦点,需要通过setFocusableInTouchMode(boolean)来设置。也可以直接在xml布局文件中指定:
keyEvent 分发过程:
而当按下遥控器的按键时,会产生一个按键事件,就是KeyEvent,包含“上”,“下”,“左”,“右”,“返回”,“确定”等指令。焦点的处理就在KeyEvent的分发当中完成。
首先,KeyEvent会流转到ViewRootImpl中开始进行处理,具体方法是内部类 ViewPostImeInputStage 中的 processKeyEvent :
接下来先看一下KeyEvent在view框架中的分发:
这里也是可以做焦点控制,最好是在 event.getAction() == KeyEvent.ACTION_DOWN 进行.
因为android 的 ViewRootlmpl 的 processKeyEvent 焦点搜索与请求的地方 进行了判断if (event.getAction() == KeyEvent.ACTION_DOWN)
• 首先ViewGroup会一层一层往上执行父类的dispatchKeyEvent方法,如果返回true那么父类的dispatchKeyEvent方法就会返回true,也就代表父类消费了该焦点事件,那么焦点事件自然就不会往下进行分发。
• 然后ViewGroup会判断mFocused这个view是否为空,如果为空就会return false,焦点继续往下传递;如果不为空,那就会return mFocused的dispatchKeyEvent方法返回的结果。这个mFocused其实是ViewGroup中当前获取焦点的子View
发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true
如果想要修改ViewGroup焦点事件的分发
• 重写view的dispatchKeyEvent方法
• 给某个子view设置onKeyListener监听
下面再来看一下如果一个页面第一次进入,系统是如何确定焦点是定位在哪个view上的
由于DecorView继承自FrameLayout,这里调用的是ViewGroup的requestFocus
descendantFocusability:
• FOCUS_AFTER_DESCENDANTS:先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
• FOCUS_BEFORE_DESCENDANTS:ViewGroup先对焦点进行处理,如果没有处理则分发给child View进行处理
• FOCUS_BLOCK_DESCENDANTS:ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
因为 PhoneWindow 给 DecoreView 初始化时设置 了 setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS),所以这里默认是FOCUS_AFTER_DESCENDANTS
到此第一次请求焦点的过程基本告一个段落
焦点移动的时候,默认的情况下,会按照一种算法去找在指定移动方向上最近的邻居。在一些情况下,焦点的移动可能跟开发者的意图不符,这时开发者可以在布局文件中使用下面这些XML属性来指定下一个焦点对象:
在KeyEvent分发中已经知道如果分发过程中event没有被消耗,就会根据方向搜索以及请求焦点View
流程一:查找用户指定的下一个焦点
流程二:获取搜索方向上所有可以获取焦点的view,使用算法查找下一个view
addFocusables() 获取搜索方向上可获得焦点的view
descendantFocusability属性决定了ViewGroup和其子view的聚焦优先级
• FOCUS_BLOCK_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点
• FOCUS_BEFORE_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点
• FOCUS_AFTER_DESCENDANTS:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
addFocusables 的第一个参数views是由root决定的。在ViewGroup的focusSearch方法中传进来的root是DecorView,也可以主动调用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦点。
FocusFinder.findNextFocus 查找焦点