利用bat实现Android的自动化编译
本文将介绍利用Bat指令以及Git等工具实现自动化拉取远程分支,同时使用gradle自动编译打包发送邮件到指定邮箱的过程,实现自动化编译与通知功能,因为当时的需求只有自动打包与通知,所以也没有加入异常处理机制,日志记录也不完善,但是整体思路是一致的,其余的是体验上的加强。
前言一些基础的东西这里将不作赘述,如git、gralde、bat指令等,以及过程中涉及的各个工具的环境搭建,这些都可以自行百度,资料非常多。
配置文件为了使用上的便利,最好能提供给使用者自行配置具体项目具体参数的文件,毕竟不是所有人都了解bat,下面提供该编译工具配置所需要的git资源的样例:
git邮箱|git密码|git地址|git分支|该分支具体某次提交记录(放空默认最新)|git项目名打包完成后邮件地址配置样例:
发件人邮箱
发件人邮箱密码
这是邮件标题
这是具体邮件内容
收件人1邮箱
收件人2邮箱
自动编译bat文件内容因为git内容比较多,所以具体的讲解我直接注释在代码里面,bat的注释以rem开头,其中一些重要命令也会稍加注释,如果有一些没有注释的又不清楚的可以百度了解一下。
@ ...
Android 应用层面屏蔽状态栏下拉方法总结
第三方应用 由于StatusBarManager在SDK中没有提供,所以需要使用反射来调用该类的方法代码部分如下:
Object service = getSystemService("statusbar");
try {
Class statusBarManager = Class.forName("Android.app.StatusBarManager");
Method expand = statusBarManager.getMethod("disable",int.class);
expand.invoke (service,0×00000001);
} catch (Exception e) {
e.printStackTrace();
}
禁用通知栏需要添加以下权限并使用系统签名:
</code></pre>如果没有使用系统签名则会报如下错误:
Caused by: Java.lang.SecurityException: StatusBarManag ...
Android拦截电源键长按
注册一个BroadcastReceiver来监听Intent.ACTION_CLOSE_SYSTEM_DIALOGS
当接收到该intent时,重发发送一条广播:context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));之前以为该条广播会替换掉原始的电源键长按广播,但是这条广播没有其他数据,如category、extra等,不符合系统所要监听的电源键长按广播,所以系统不进行接收和处理,但是最后实验后发现应该是我们发送了这条intent去请求关闭系统关机对话框
上述方法在有些机型上会存在频繁发送该Intent进而导致通知栏下拉透明,但是其实通知栏已经被下拉了的问题,改善方法为发送有序广播,然后添加一个我们设置的参数,当拦截到该参数时则abort当前的广播即可,abort只对有序广播有效
防止Service因进程被杀死而销毁解决方法调查
一般情况下一个服务没有自己独立的进程,它一般是作为一个线程运行于它所在的应用的进程中
有些Intent无法静态注册导致如果由Service来启动广播接收者进而广播接收者动态注册相应Intent来处理事件的话,这种情况下Service如果被kill掉,那么广播接收者只能监听到静态注册的intent
提高Service的存活率 1.前台Sevice,需要设置notification,不一样所有应用都适合做这种操作,即使是透明背景的notification也会被用户发现 2.在onDestroy的时候重启自身,只能保证用户手动关闭服务的时候重启,强制杀死整个进程的话是不会调用这个函数的 3.使自己的程序变为系统级应用程序,设置android:persistent=”true”,还需设置FLAG_SYSTEM,此时需要使用adb命令来将应用放在/system/app/目录下,不可行,而且这种做法会存在如果该种应用过多而系统崩溃的问题
android:process=”:remote”设置该属性使service在指定进程上运行,无效,原因应该是虽然是在另一个进程运行,但是用户使用强制关闭所有进 ...
当使用Gralde编译出现某jar包或库重复依赖的各种解决方案
这是半年前做项目时遇到的问题,因为项目有好几个依赖库,其中有个库的httpmime这个jar包在多个地方重复出现了,最终编译打包的时候报错对同一个jar包重复打包了,试了各种方法都无效,花了两三天才找到一个方法,用三行代码搞定,因为时间过了比较久所以可能记得也不是很清楚,只能凭印象记录下来。
compile fileTree(dir: 'libs', include: '*.jar', exclude:'android-support-v4.jar')这种方法适用于在主项目中排除libs目录下的v4等重复包,由于依赖库中已有这些包所以即使排除了也不会出现异常,exclude标签也可以用于排除具体依赖库中的每个依赖,但是于我当时的情况下不适用,具体原因忘了
设置依赖的scope,这点gradle类似于maven,这里贴上maven的scope含义说明,更具体的有兴趣的可以查资料和验证,具体的设置方式即在build.gralde中更改每项依赖的前面标识符,如compile,或者通过设置module的dependency也可依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含 ...
FindBugs 规则整理:Internationalization
DM_DEFAULT_ENCODING
翻译Found a call to a method which will perform a byte to String (or String to byte) conversion, and will assume that the default platform encoding is suitable. This will cause the application behaviour to vary between platforms. Use an alternative API and specify a charset name or Charset object explicitly.某方法将字节转换为字符串,并且假定默认的平台编码是合适的,这会导致程序在不同平台上存在异常情况,请使用指定的字节编码进行转码
原因在进行字符串转换时没有指定特定编码
解决方案添加Charset.defaultCharset()
DM_CONVERT_CASEConsider using Locale parameterized versio ...
FindBugs 规则整理:Performance
BX_BOXING_IMMEDIATELY_UNBOXEDPrimitive value is boxed and then immediately unboxed对原始值进行装箱,然后立即取消装箱。这可能是在一个未要求装箱的地方进行了手动装箱,从而迫使编译器进行立即撤消装箱的操作
BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCIONPrimitive value is boxed then unboxed to perform primitive coercion对原始值进行装箱然后立即把它强制转换为另外一种原始类型。例如:new Double(d).intValue()应该直接进行强制转换例如:(int) d
DM_BOXED_PRIMITIVE_TOSTRINGMethod allocates a boxed primitive just to call toString仅仅为了调用封装类的toString()而对原始类型进行封装操作。比这种方法更有效的是调用封装类的toString(…)方法例如:new Integer(1).toS ...
FindBugs 规则整理:Security & Experimental
DMI_CONSTANT_DB_PASSWORDHardcoded constant database password代码中创建DB的密码时采用了写死的密码。
DMI_EMPTY_DB_PASSWORDEmpty database password创建数据库连接时没有为数据库设置密码,这会使数据库失去必要的保护。
HRS_REQUEST_PARAMETER_TO_COOKIEHTTP cookie formed from untrusted input此代码使用不受信任的HTTP参数构造一个HTTP Cookie。
HRS_REQUEST_PARAMETER_TO_HTTP_HEADERHTTP Response splitting vulnerability在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。
SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTENonconstant string passed to execute method on an SQL statement该方法以字符串的形式来调用SQLs ...
FindBugs 规则整理:Multithreaded Correctness
DL_SYNCHRONIZATION_ON_BOOLEANSynchronization on Boolean could lead to deadlock该代码同步一个封装的原始常量,例如一个Boolean类型private static Boolean inited = Boolean.FALSE;
...
synchronized(inited) {
if (!inited) {
init();
inited = Boolean.TRUE;
}
}
...由于通常只存在两个布尔对象,此代码可能是同步的其他无关的代码中相同的对象,这时会导致反应迟钝和可能死锁
DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVESynchronization on boxed primitive could lead to deadlock该代码同步一个封装的原始常量,例如一个Integer类型。private static Integer count = 0;
...
...
FindBugs 规则整理:Malicious Code Vulnerability
EI_EXPOSE_REPMay expose internal representation by returning reference to mutable object返回一个易变对象引用并把它保存在对象字段中时会暴露对象内部的字段描述,如果接受不守信任的代码访问或者没有检查就去改变易变对象的会涉及对象的安全和其他重要属性的安全。返回一个对象的新副本,在很多情况下更好的办法。
EI_EXPOSE_REP2May expose internal representation by incorporating reference to mutable object此代码把外部可变对象引用存储到对象的内部表示。如果实例受到不信任的代码的访问和没有检查的变化危及对象和重要属性的安全。存储一个对象的副本,在很多情况下是更好的办法。
FI_PUBLIC_SHOULD_BE_PROTECTEDFinalizer should be protected, not public一个类中的finalize()方法必须声明为protected,而不能为public类型
MS_EXPOSE_REPPu ...