4月 082017
 

一、下载Android6.0源码

大家可以从清华的镜像站下载源码库,具体参数https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/和网络上的教程

二、安装编译时需要的软件

直接连接Ubuntu速度比较慢,而且Ubuntu官方没有openjdk7的安装包了,所以更换更新源到国内的源,我把阿里和163的源都放进去了

1.先备份更新源

2. 增加阿里的源

3. 增加163的更新源

4. 执行一行apt-get update

5. 安装编译时需要的软件

三、开始编译

四、常见错误及解决办法

1.编译时出现unsupported reloc 43,解决方法如下:

It works to me:
in file /art/build/Android.common_build.mk, find out:

change to :

If it still not works,try this in your android root path: cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

 Posted by on 2017-04-08
3月 202017
 

一、jni背景知识

  jni是Java Native Interface的缩写,jni并不是Android开发的特性,而是在java的早期版本中就已经支持了,用于java层和Native层进行通讯的中间桥梁,大部分情况下使用c和c++进行编写,也可以使用其他的语言编写,只要满足约定的接口就可以。

二、Jni的副作用

  Jni有以下副作用:

1、不再具有跨平台可移植性,如果移植到其他平台,需要开发Native层的相关代码

2、Native层的程序如果有问题将会导致java层的程序崩溃

三、开发步骤简述(Ubuntu 16 + openjdk-8-jdk)

  1、在java代码中定义Native函数,比如java文件名为JniTest.java

  2、使用javac编译java文件,javac JniTest.java

  3、使用javah工具传入java类名,生成native层的头文件,javah JniTest,此时目录下会有一个JniTest.h

  4、新建一个JniTest.cc的文件,并添加如下内容:

  5、将navtive层的代码编译成so库,命令如下:

  6、在java层使用System.loadLibrary(“jnitest”);加载动态库,并调用函数,见第1中的java代码

 

参考链接:

https://baike.baidu.com/item/JNI/9412164?fr=aladdin

 

 Posted by on 2017-03-20
3月 012017
 

  本文总结了几种常用的补间动画效果,具体的使用方法请参考网络上的其他文章:

  先总结几点注意事项:

  • 如果是多个动画组成的动画系统,duration值最好会设置成相同的,否则Activity切换的时候会出现黑底
  • overridePendingTransition有的时候需要rebuild项目才有效果

  1.放大效果(附加淡入效果)

  在res/anim目录下新建zoomin.xml,并粘贴下面的代码

  2.缩小效果(附加淡出效果)

  在res/anim目录新建zoomout.xml,并粘贴下面的代码

  3. 淡入效果

  在res/anim目录新建fadein.xml,并粘贴下面的代码

  4. 淡出效果

  在res/anim目录下新建fadeout.xml,并粘贴下面的代码

  5. 纵向布幕拉开效果(自中间往上下拉开)

  在res/anim目录下新建open_verticaly_from_middle.xml,并粘贴下面的代码

  6.纵向布幕关闭效果(自上下往中间关闭) 

  在res/anim目录下新建close_verticaly_to_middle.xml,并粘贴下面的代码

  7. 从顶部进入

  在res/anim中建立文件slide_in_from_top.xml, 并粘贴下面的代码

  8. 从底部进入

  在res/anim中新建文件slide_in_from_bottom.xml, 并粘贴下面的代码

  9. 从顶部划出

  在res/anim中新建文件slide_out_to_top.xml, 并粘贴下面的代码

  10. 从底部划出

  在res/anim中新建文件slide_out_to_bottom.xml, 并粘贴下面的代码

 

 

 Posted by on 2017-03-01
2月 212017
 

首先调用Activity.java中的startActivity

调用了另外一startActivity函数,增加了options参数,为避免过于复杂,我们使用options为null

实际上又调用到了startActivityForResult函数

同样,带options参数的startActivityForResult

我们这里假设mParent为null

然后调用Instrumentation的executeStartActivity

然后调用ActivityManagerService里的startActivity和startActivityAsUser

mStackSupervisor.startActivityMayWait函数

mStackSupervisor.startActivityLocked函数

调用函数mStackSupervisor.startActivityUncheckedLocked

调用函数ActiviyManagerService.checkGrantUriPermissionFromIntentLocked

调用函数ActivityStack.startActivityLocked

调用WindowManagerService.prepareAppTransition

调用函数ActivityStack.resumeTopActivityLocked

调用函数ActivityStack.startPausingLocked 开始pause当前Activity

调用函数ActivityManagerService.updateUsageStats 更新电池电量统计

调用函数mStackSupervisor.setFocusedStack

调用WindowManagerService.findFocusedWindowLocked 

调用函数WindowManagerService.updateFocusedWindowLocked

调用函数:mStackSupervisor.allPausedActivitiesComplete

 Posted by on 2017-02-21

对HandlerThread的理解

 分类:Android, Java 阅读 (1,782)  1 Response »
2月 202017
 

1.什么场景下需要使用HandlerThread

1). 比较耗时,不易于放在主线程中执行的操作(不考虑第2点使用其他线程方式也可以)

2). 有多个耗时操作需要后台执行(如果不嫌麻烦也可以考虑使用多个TThread)

2.HandlerThread的使用步骤

1). 创建HandlerThread对象

2). 执行start方法,启动HandlerThread的Looper循环

3). 在主线程中创建Handler对象并引用HandlerTherad的looper

4). 在Handler对象中加入各种消息的处理

5). 在需要的时候给步骤3创建的Handler对象发送消息

6). 不再需要HandlerThread的时候调用quit或者quitSafely停止HandlerThread

示例代码如下(没做各种错误处理,仅供参考):

测试时多次点击Download1和Download2按钮,handler对象就会按点击的顺序多次下载网页baid.com和bcoder.com

3. 要不要像Thread那样写一个HandlerThread的子类?

完全没有必要,因为真正程序执行部分都在handler的消息处理里

4. quit和quitSafely的区别?

 

5. HandlerThread的其它特点

1). HandlerThread中的多个操作是串行按序执行的,即任务1\任务2\任务3....,所以如果你想尽早的获得运行结果,不建议使用HandlerThread这种方式

6. 测试代码下载

LocaleTest

1月 272017
 

  今天在使用switch控件的时候,发现他的宽度太大了,很丑

  因为给它设置了android:track属性,用算定义图片来显示开和关的状态,以为是这个图片引起的,去掉后发现宽度没有变化,换了一堆属性switchPadding, thumbTextPadding,发现修改后都无效,设置固定宽度layout_width会造成switch的背景显示不全,看Switch的源码,发现有一个mSwitchMinWidth变量,并且该变量参与了宽度的计算,修改后发现起作用了,特此记录...

  控制宽度的方法:

1.修改android:switchMinWidth属性

2.修改android:scaleX属性:也可以达到效果,但是缩小后左右会有空白(未深度研究)

1月 252017
 

  我相信通过给drawable资源设置不同的参数还可以实现很多不错的效果,今天我们就展示一个类似树叶效果的按钮,先看一下完成的效果图:

  这其实还是一个rectangle形状的shape资源,只是我们给两个斜对角圆角半径设置了一个非常大的值,下面将讲述如何在android工程中实现此效果。

  第一步,新建一个正常状态下的按钮的样式,在res/drawable目录新建文件leaf_btn_normal.xml,并将下面代码复制到文件中

  第二步,在res/drawable目录下新建一个鼠标按下状态时的按钮样式文件,文件名leaf_btn_pressed.xml,并复制如下代码到文件中:

  第三步,使用selector资源把两个文件组合起来,在res/drawable目录下新建文件leaf_btn_selector.xml,并复制如下代码到文件中

  第四步,为按钮设置一个样式文件,为按钮设置我们刚建立的背景效果和padding等属性

  最后,为按钮设置style为此样式就完成了。如下:

 

 

 Posted by on 2017-01-25
1月 252017
 

  本文将介绍不使用外部图片,通过android的drawable资源实现圆角按钮的效果,并且在按钮按下时背景也会发生变化。使用到的drawable资源类型,shape和selector,效果图如下所示:

  首先在res/drawable中新建一个资源文件,全名为round_rect_btn_normal.xml,文件内容为;

  第二步再为按钮按下时创建一个相关的背景资源,在res/drawable中新建一个名为round_rect_btn_pressed.xml的文件,文件内容为:

  第三步,把这两个资源组合起来,使背景同时具有正常状态和按下状态的效果,在res/drawable中新建一个名为round_rect_btn_selector.xml的文件,并复制以下内容到文件中:

  注意:不带state的item一定要放到最后一行。

  第四步,如果现在就就想看效果的话,可以给TextView或者Button的background属性设置为@drawable/round_rect_btn_selector就能看到效果了;

  第五步,为了保持代码的风格良好和以后的扩展方便,我们还是先建一个style吧,在res/values/style.xml中新建一个style,如下:

  最后,把TextView或者Button的style属性设置为@style/round_rect_btn_bkg就可以,如下所示:

  好了,赶紧点击运行按钮试一下效果吧!

  大家可以根据自己的需求,改变round_rect_btn_normal.xml和round_rect_btn_pressed.xml里的颜色值和边框属性等,以和自己的app的风格搭配。

 

 Posted by on 2017-01-25
1月 252017
 

  运用好Android的drawable资源,在开发中就可以减少图片的使用量,这样既缩小了app的体积,也省去了设计图片的时间,而且也容易适配不同的屏幕尺寸。

  今天首先来讲讲shape资源的使用。

1. Shape的属性介绍

  shape共支持四种形状,在根节点通过android:shape=””来定义

rectangle 方形
oval 椭圆形
line 线形,需要<stroke>节点来定义其属性
ring 环形

  我们常用的应该是rectangle和oval形状,我们上个图来看一下总体效果:

  其中下面几个属性是环形时才会用到的:

android:innerRadius 尺寸。环内部(中间的孔)的半径,以尺寸值或尺寸资源表示。
android:innerRadiusRatio 浮点型。环内部的半径,以环宽度的比率表示。例如,如果 android:innerRadiusRatio=”5″,则内半径等于环宽度除以 5。此值被 android:innerRadius 覆盖。默认值为 9。
android:thickness 尺寸。环的厚度,以尺寸值或尺寸资源表示。
android:thicknessRatio 浮点型。环的厚度,表示为环宽度的比率。例如,如果 android:thicknessRatio=”2″,则厚度等于环宽度除以 2。此值被 android:innerRadius 覆盖。默认值为 3。
android:useLevel 布尔值。如果这用作 LevelListDrawable,则此值为“true”。这通常应为“false”,否则形状不会显示。当我们要设计一个圆形时必须设置它为false。

2.子节点之实色填充效果

  solid节点可以实现形状的填充效果,通过android:color属性设置颜色值,如下示例:

3.子节点之渐变填充效果

  gradient节点可以实现渐变的填充效果,示例如下:

4.子节点之实现边框效果

  各个属性值的解释:

android:color 线框的颜色
android:width 线框的宽度
android:dashGap 如果画虚线框,虚线框的间隙
android:dashWidth 如果画虚线框,虚线框的宽度

5.子节点之实现圆角效果

  为了美观,我们在画按钮时都会给按钮背影加个圆角效果,在shape里可以通过corner节点来实现圆角效果,如下所示:

  radius用于设置圆角的半径大小,也可以通过android:topLeftRadius,android:topRightRadius,android:bottomLeftRadius,android:bottomRightRadius分别设置四个角的圆角半径大小,比如在实现tab标签头部按钮时,我们可能只需要为左上和右上角设置圆角效果。比如还可以实现一些特殊形状的导航按钮等等。

6.padding节点

  padding节点用于设置形状相对于四边的内部间距,可以用于在layer-list中设置阴影的效果。

 Posted by on 2017-01-25
1月 172017
 

  在使用友盟统计的时候,我们需要在AndroidManifest.xml为每个不同的渠道设置一个渠道名称,然后修改一次打一次包,当渠道多的时候这样非常的麻烦。庆幸的是,gradle脚本有方便的方法可以实现多渠道一次打包。

  首先在AndroidManifest.xml中这样配置友盟的渠道信息:

  umeng_channel_holder相当于为gradle的脚本定义了一个变量,稍后会在gradle脚本中使用,你也可以定义成其他的名字,只要用${}括起来就可以了。

  下面我们在主gradle文件中为这个变量设置不同的配置信息,这段信息要放在android->productFlavors节点下,如下所示:

  如上代码我配置了wandoujia, baidu, xiaomi, tencent, jeoe共五个渠道,这样就配置完成了,点击Build->Generate Signed APK,在第三步的时候所选要打包的flavor就可以一次生成多个安装包了。

 Posted by on 2017-01-17