Windows下搭建基于Jenkins+Git+Gradle的Android持续集成

下载Jenkins


官网下载,如果官网下载存在问题,也可以在本站下载Jenkins

下载Gradle


目前Android Studio支持的是Gradle 2.8版本,因此下载2.8版本的即可。Gradle 2.8,也可以本站下载

安装Tomcat


官方主页Apache Tomcat。Windows下面建议下载32-bit/64-bit Windows Service Installer版本。
DownloadTomcat9

安装Jenkins


将下载的jenkins.war包直接放到tomcat下的webapps目录,启动tomcat,在浏览器输入:http://127.0.0.1:8080/jenkins

安装Git plugin,Gradle plugin,Android Lint Plugin插件


点击Jenkins首页的"Manage Jenkins"链接,如下图:
ManageJenkins

进入设置,点击"Manage Plugins",添加Git plugin,Gradle plugin,Android Lint Plugin

ManagePlugins在打开的页面中,搜索并且安装插件

PluginManagerInstall

系统配置


返回首页,点击" Manage Plugins",然后进入页面中选择Configure System,配置JDK,Gradle,Git的选项。

JenkinsConfigure
设置JDK
SettingJava

SettingJavaManual

新建项目


首页点击"创建一个新任务",如下图:
NewJenkinsJobs
在接下来的页面中,输入工程的名字,并且选择"Freestyle project"

NewJobsCreateSelect
设置Git中源代码的路径,如果是使用SSH证书认证的登陆,则在Credentials中进行配置,如下图:

JenkinsJobAndroidConfigureGitNew

接下来配置触发构建的条件,目前我们设置为每天晚上3点,注意里面输入的是H 3 * * *,每个字符之间都有一个英文的空格。

JenkinsJobAndroidConfigureTrigger

接下来,配置Gralde的编译,在构建项目中选择"Invoke Gradle Script",如下图:
InvokeGradleScript
在选项的Tasks栏目中输入clean build --stacktrace --debug,如下图:

InvokeGradleScriptTasks
接下来,配置构建后操作,一般增加Publish Android Lint results,Archive the artifacts这两项即可,具体的配置参考下图:

InvokeGradleScriptTasksAfterBuild

构建项目


BuildNow

检验构建结果


构建完成以后检查一下,如果在:

当前用户目录\.jenkins\jobs\Android\workspace\app\build\outputs\apk\

下面成功生成了APK文件,则说明配置是成功的。

参考链接


基于Jenkins+git+gradle的android持续集成,jenkinsgradle

Android:flags:value

最近用到了Android flag的机制,把Android现在所有的flag列出来,供参考。

FLAG_GRANT_READ_URI_PERMISSION 0x00000001
FLAG_GRANT_WRITE_URI_PERMISSION 0x00000002
FLAG_FROM_BACKGROUND 0x00000004
FLAG_DEBUG_LOG_RESOLUTION 0x00000008
FLAG_EXCLUDE_STOPPED_PACKAGES 0x00000010
FLAG_INCLUDE_STOPPED_PACKAGES 0x00000020
FLAG_GRANT_PERSISTABLE_URI_PERMISSION 0x00000040
FLAG_GRANT_PREFIX_URI_PERMISSION 0x00000080
自定义 0x00000x00
自定义 0x00001000
FLAG_ACTIVITY_RETAIN_IN_RECENTS 0x00002000
FLAG_ACTIVITY_TASK_ON_HOME 0x00004000
FLAG_ACTIVITY_CLEAR_TASK 0x00008000
FLAG_ACTIVITY_NO_ANIMATION 0x00010000
FLAG_ACTIVITY_REORDER_TO_FRONT 0x00020000
FLAG_ACTIVITY_NO_USER_ACTION 0x00040000

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 0x00080000
FLAG_ACTIVITY_NEW_DOCUMENT 0x00080000

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 0x00100000
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 0x00200000
FLAG_ACTIVITY_BROUGHT_TO_FRONT 0x00400000
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 0x00800000
FLAG_ACTIVITY_PREVIOUS_IS_TOP 0x01000000
FLAG_ACTIVITY_FORWARD_RESULT 0x02000000
FLAG_ACTIVITY_CLEAR_TOP 0x04000000

FLAG_ACTIVITY_MULTIPLE_TASK 0x08000000
FLAG_RECEIVER_NO_ABORT 0x08000000

FLAG_RECEIVER_FOREGROUND 0x10000000
FLAG_ACTIVITY_NEW_TASK 0x10000000

FLAG_RECEIVER_REPLACE_PENDING 0x20000000
FLAG_ACTIVITY_SINGLE_TOP 0x20000000

FLAG_RECEIVER_REGISTERED_ONLY 0x40000000
FLAG_ACTIVITY_NO_HISTORY 0x40000000

repo如何取消本地改动(How to discard changes using repo)

Android源代码中经常出现同步问题,最常见的就是本地无意修改了某些文件,那么,如何取消掉这些更改呢?

执行如下命令:

$repo forall -vc "git reset --hard"

如果执行完成后,依旧提示某个目录有改动,则切换到有问题的目录,继续执行

$git reset --hard

完成后,删除所有没有增加到Git中的文件即可。

参考链接:
How to discard changes using repo

Ubuntu 15.10 使用Ubuntu Make简化Android开发环境配置

Ubuntu 15.10 中,已经可以使用Ubuntu Make简化Android开发环境配置了,具体方法如下:

1.安装Ubuntu Make

$ sudo apt-get install ubuntu-make

2.配置Android开发环境

$ umake android

然后根据提示,一步一步操作就可以了。

一会之后,就会发现Android Studio已经安装成功了。

就是这么简单!

java.util.concurrent.TimeoutException: com.android.internal.os.BinderInternal$GcWatcher.finalize() timed out after 10 seconds

最近在查看上传到服务器上的应用崩溃信息的时候,发现两个比较奇怪的崩溃栈,如下:

java.util.concurrent.TimeoutException: com.android.internal.os.BinderInternal$GcWatcher.finalize() timed out after 10 seconds
at com.android.org.conscrypt.NativeCrypto.EVP_MD_CTX_destroy(Native Method)
at com.android.org.conscrypt.OpenSSLDigestContext.finalize(OpenSSLDigestContext.java:27)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:191)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:174)
at java.lang.Thread.run(Thread.java:818)
java.util.concurrent.TimeoutException: com.android.internal.os.BinderInternal$GcWatcher.finalize() timed out after 10 seconds
at java.lang.Daemons$Daemon.isRunning(Daemons.java:79)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:171)
at java.lang.Thread.run(Thread.java:818)

百思不得其解,最后在网上查到了貌似可以解释这个现象的原因:

The reason for this timeout can come from two options:
1. A problem in the finalize code - trying to perform complex logic in the native destroy part.
2. CPU/Screen timeouts - the screen will dim and power off, followed by a System deep sleep state. the deep sleep can happen in a Garbage collection run, and when the device wakes up - a timeout can happen.

参考链接:


APK反编译工具Apktool

开发Android的时候,难免会遇到需要反编译一下APK,观察是否打包都正确的情况,这个时候就需要ApkTool来上场了。

APKTool的官方地址是http://ibotpeaches.github.io/Apktool/

正常情况下,从这个地址直接下载编译好的Jar包就可以了,但是由于他编译好的Jar包存储在bitbucket.org上面,由于众所周知的原因,这个网站是无法正常下载文件的,因此我们可以通过自己编译代码的方式来生成这个Jar包。

1.从GitHub下载代码

$ git clone --recursive git://github.com/iBotPeaches/Apktool.git

2.切换到代码目录

$ cd Apktool

3.合并smali的补丁代码,用来生成brut.apktool.smali的目录

Linux

$ ./gradlew applyPatches

Windows

$ gradlew.bat applyPatches

4.编译代码

Linux

$ ./gradlew build fatJar

Windows

$ gradlew.bat build fatJar

编译好的Jar包在

./brut.apktool/apktool-cli/build/libs/apktool-xxxxx.jar

已经编译好的Apktool 2.0.3可以在在这里下载

5.执行命令,解包APK

$ apktool d test.apk

对于Mac用户来说,使用如下命令

$ java -jar apktool.jar d test.apk

Android常用命令 dumpsys

1.查看手机各类服务的项目:

$adb shell service list;

2.查看应用的内存使用情况:

$adb shell dumpsys meminfo $package_name or $pid

3.查看应用的正在运行的service

$adb shell dumpsys activity services

4.显示activity相关的信息

$adb shell dumpsys activity

5.显示状态栏相关的信息

$adb shell dumpsys statusbar

6.查看应用版本信息

$adb shell dumpsys package $package_name