Android工程经常需要做一些基本设置,如混淆、多版本、申请权限等,在这里做一下汇总,以便查阅。
目录
Android Studio中直接运行Java的main函数
Android Studio的快捷代码(如psvm)
Activity样式
MultiDex
混淆配置
AIDL接口
打包APK自动改名
请求权限
数据库
多版本及开发测试
在debug时使用正式签名
一些好用的插件
清理空间
自定义属性
一些有趣的小问题
Android Studio中直接运行Java的main函数
很多时候,我们只想验证某些纯Java的API,或验证某些语言特性,在Android端运行这种代码需要经历漫长的编译-安装-运行的过程,太慢,繁琐,我们可以在AndroidStudio中直接运行纯Java的main函数(不能含有Android的API),有两种方法可以做到。
1.在Android工程中即可运行
可以直接运行一个有main函数的Java文件。
其实只要新建一个Java文件,然后屏蔽顶部的package即可:
注意只能处理纯Java类,虽然可以调用Android的各种类如Activity,但是运行时会报错,因为缺少各种环境。
另外,这种用法有个缺陷:有点慢,会走gradle编译(permission:assemble debug),不过比编译App要好多了。
2.在Java Library中运行
这种做法稍微复杂,但可以运行一整个Module模块。
具体需要先新建一个Java libaray的Module。
然后配置运行方式去运行这个Module
配置时注意两点:
1.选好Main class,一直选到class文件
2.在Use classpath of module中,选择lib
最后就可以像运行App那样去运行它了
这种运行方式速度较快,而且是以Module为单位运行的,可以实现一些复杂的逻辑。
参考:android studio编写运行java main的三种方法(亲测)
Android Studio的快捷代码(如psvm)
Android Studio脱胎于IntelliJ IDEA,后者支持通过特定字母组合打出特定代码段,大大加快我们写Bug(误)的速度,例如:
psvm可以辅助打出main函数:
sout可以辅助打出print函数
这些可以在setting中通过live templates配置
Activity样式
Activity可以配置很多样式,例如可以隐藏顶部状态栏,不显示顶部状态栏即为全屏,有两种设置方式:
1.在style.xml中定义一个样式,并在manifest文件中使用(针对整个app)。
2.在activity代码中设置属性(仅针对单个activity)。
MultiDex
App打包的dex有函数数量上限,app越做越大,就很容易超限,需要配置为multidex,在打包时把一个dex拆分为多个,规避数量上限问题。
google官方给出了配置方式,需要在gradle中引入multidex,并让app继承multidexapplilcation。
如果你的Application已经继承了其他的Applicatioin,你可以在你的Applicatioin里override一下attachBaseContext(),调用MultiDex.install(this)来支持multidex。
(其实在Android里,很多情况下都需要你extend其他Application,这就限制了我们自己对Application的扩展方式,如果我们想自己抽象一些Application的行为,最好是使用接口和依赖注入方式去实现,这样耦合度低,容易扩展应用)
混淆
apk打包时都需要混淆,这可以防止别人根据你的apk安装包逆向读懂你的代码,注意是读懂,他还是能读到代码的,但是里面的变量和类名都会变成a、b、c这样毫无意义的东西。
使用混淆的配置如下:
AIDL
AIDL跨进程通信是app间调用的手段,主要是通过引用接口和bind到serviceconnection实现的。
然后就可以通过serviceconnection去调用aidl接口中提供的函数了
打包APK自动改名
我们提交apk时,需要给apk文件改名字,加上版本号,生成日期等,以便沟通和管理,这个工作可以在gradle里配置一下,自动完成。
请求权限
Android把权限分的很细,需要什么都需要在manifest文件中去配置
但是Android现在对权限管理越来越严格了,很多权限不只需要manifest中配置,还需要用户打开app时手动确认,这需要在代码中动态检查和申请权限。
不止要申请权限,因为用户可能拒绝申请,所以还需要监听,在提出申请的Activity中,覆写指定函数,去监听用户的处理结果。
数据库
Android中有很多数据库可用,例如原始的SQLite,能自动生成数据库的GreenDao,最近很火性能不错的Realm等。
这里先记录一下greendao的应用,首先在gradle中添加引用并配置生成策略,然后用注解的方式编写数据表的类文件,写完后build一下工程,greendao就会自动生成数据库相关文件
多版本及开发测试
AS支持多版本发布,可以同时生成多个不同渠道的apk,不过速度不是很快。
关于多渠道打包,可以参考《Gradle多渠道打包的原理、实践与辅助开发》
个人更喜欢用多版本来方便开发,在mock版本中模拟各种数据,测试业务场景,同时不对prod正式版造成任何影响。
配置过程如下:
(多版本还可以帮助加速调试,你要为不同的版本配置不同的minSdkVersion,例如在开发的mock里设置minSdkVersion=21,这样在运行mock版本时编译速度更快)
搭好了多版本开发的基本架子,接下来就可以用多版本去辅助开发,例如,在mock开发版本中增加一个功能,即启动时清空数据库,同时prod正式版中没有这个特性。
可以在所有版本中增加一个类,启动时调用这个类的函数。
这个函数仅在mock版本中实现,在prod版本中,只是一个空函数,这样既能实现mock版本的特殊功能,又不会干扰到prod版本,最重要的是,发布前不需要改代码。
在debug时使用正式签名
按照一般的工程惯例,AS在开发时使用一个临时的apk签名,在release时使用另一个正式的签名,这样可以很好地把开发和发布区分开,也能很好地保护app产品。
但是,在实际开发过程中,经常需要在debug时会使用正式签名,例如,联调第三方库,或者在已经安装了正式版的设备上调试app,这时如果使用临时apk签名的话,签名会被拒绝,无法调试。
这时,我们可以通过gradle配置,在debug时使用正式签名,具体方法如下:
注意,storefile这个参数里指向的路径,需要放一个正式签名的jks文件。
这样,在debug时也可以使用正式的apk签名,可以更方便地去调试了。
一定注意,在上线的时候要删除掉这个签名文件,并且注释掉这段话!
一些好用的插件
1.GsonFormat 在AS上使用
可以方便地把json字符串映射为对应的Java数据对象
2.JSONView 在Chrome上使用
json字符串结构化显示
3.Octotree 在Chrome上使用
在github网站上能像在IDE一样查看源码
4.Postman 在Chrome上使用
监听和发起网络请求
5.Advertising Terminator 在Chrome上使用
屏蔽广告
6.Click&Clean 在Chrome上使用
分类查找和清理缓存
更多插件见:吐血推荐珍藏的 Chrome 插件
清理空间
Android Studio长期运行下来,很容易积累起十多个G的垃圾数据,而且是在C盘,清理方法如下:
打开C:\Users\{你的用户}\AppData\Local\Temp
清空
实际上,C:\Users\用户名\AppData里面一般有三个文件夹,分别是Local,LocalLow,Roaming,简单地来说,都是用来存放软件的配置文件和临时文件的,里面有很多以软件名称或软件公司命名的文件夹,理论上都可以删除。
代码检查
Android Studio提供了不错的Analyze工具,可以从代码级别自动帮你排查冗余、泄漏、SDK版本兼容等问题,平时可以多运行一下Analyze->Inspect Code
自定义属性
Android允许自定义控件属性,关键字declare-styleable,需要增加res/mystyle.xml文件,属性内容如下:
formate可以允许多种类型,如 format = "reference|color",就是既允许填引用@drawable/xxx,又允许直接填颜色值#00FF00
如果某个attr是需要选择一个数据填入的,如 android:gravity="top",还需要定义flag
declare-styleable中的name是为自定义控件的代码准备的,代码根据这个名字找到自定义属性:
在xml文件中引用时,需要写一个xml的命名空间,用来引用自定义的属性:
然后,在下面的控件中,就可以根据命名空间levideoview来配置自定义参数了。
更多内容可参考declare-styleable的使用(自定义控件) 以及declare-styleable中format详解
一些有趣的小问题
·关于MAC中找不到SDK文件夹的问题
需要在Users/用户名/ 这个文件夹下,右键,“查看显示选项”,勾选“显示资源库文件夹”,这样就可以看到用户目录下的Library文件夹,SDK的路径就在Library/Android/SDK中
·MAC中使用adb的问题
Mac装完AS后,不能直接使用adb,会报无效命令,需要步骤如下
1.打开终端,如下命令:
yourMacBook-Pro:~ you$ echo $HOME
/Users/you
yourMacBook-Pro:~ you$ touch .bash_profile
yourMacBook-Pro:~ you$ open -e .bash_profile
打开bash文件
2.bash文件默认为空,在文件中填写你的Android SDK的tools地址,然后保存文件
export PATH=${PATH}:/Users/you/Library/Android/sdk/platform-tools:/Users/you/Library/Android/sdk/tools
3.回到终端,刷新bash
yourMacBook-Pro:~ you$ source .bash_profile
搞定,可以用adb了
·关于MAC中配置API Source的问题
默认情况下,查看Android API部分的源码,只能看到函数的参数和范围,看不到代码细节,需要配置API Source源码。
最简单的做法是,在弹出的提示框中,选择download:
然后关闭AS再重新打开即可。
·关于R中的String换行问题:
1.对齐问题
我们知道,R中定义String换行,都要用\n,例如XXX\nYYY,就会把X和Y分成两行去输出
不过,我们会发现,为了阅读方便,我们更习惯在string.xml中这样定义:
XXX\n
YYY
乍看起来没有问题,但如果你把这样的String输出到界面上,你会发现,这两行
没对齐!
第二行YYY前面多了半个空字符。
如果把\n放到第二行呢?
XXX
\nYYY
这次对齐了!实际上,你把TextView的边框画出来,做个对比,就会发现,手动换行产生的那个空字符,换到了XXX的末尾,只不过平时看不出来罢了
2.\n变\\n问题
前后台交互时、用Intent传数据时,经常会发现\n被转义成了\\n,而且是各种环境自动转的。
所以,在收到传送来的\n时,先检查一下有没有\\n是一种什么行为?
是一种受惯了伤害,形成条件反射的行为啊。
·编译时在style里应用了Theme.AppCompat.Light.DarkActionBar,出现No resource found that matches the given name的问题
因为这个主题实在appcomat v7里引用的,如果你的app版本较低(最低兼容版本),就需要显式地引用appcompat v7,在gradle里添加compile'com.android.support:appcompat-v7:23.4.0'
即可解决问题