Android工程常用配置和开发技巧

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即可:

运行main

注意只能处理纯Java类,虽然可以调用Android的各种类如Activity,但是运行时会报错,因为缺少各种环境。

另外,这种用法有个缺陷:有点慢,会走gradle编译(permission:assemble debug),不过比编译App要好多了。

2.在Java Library中运行

这种做法稍微复杂,但可以运行一整个Module模块。

具体需要先新建一个Java libaray的Module。

新建Module
选择Java Library
设置Module的运行方式
添加Application

然后配置运行方式去运行这个Module

配置Main class

配置时注意两点:

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函数:

psvm

sout可以辅助打出print函数

sout

这些可以在setting中通过live templates配置

配置live templates


Activity样式

Activity可以配置很多样式,例如可以隐藏顶部状态栏,不显示顶部状态栏即为全屏,有两种设置方式:

1.在style.xml中定义一个样式,并在manifest文件中使用(针对整个app)。

定义全屏样式
在manifest中设置theme

2.在activity代码中设置属性(仅针对单个activity)。

代码设置全屏

MultiDex

App打包的dex有函数数量上限,app越做越大,就很容易超限,需要配置为multidex,在打包时把一个dex拆分为多个,规避数量上限问题。

google官方给出了配置方式,需要在gradle中引入multidex,并让app继承multidexapplilcation。

在gradle中引用multidex
在gradle中启用multidex

如果你的Application已经继承了其他的Applicatioin,你可以在你的Applicatioin里override一下attachBaseContext(),调用MultiDex.install(this)来支持multidex。

继承multidexapplication

(其实在Android里,很多情况下都需要你extend其他Application,这就限制了我们自己对Application的扩展方式,如果我们想自己抽象一些Application的行为,最好是使用接口和依赖注入方式去实现,这样耦合度低,容易扩展应用)

在manifest文件中使用继承的multidexapplication

混淆

apk打包时都需要混淆,这可以防止别人根据你的apk安装包逆向读懂你的代码,注意是读懂,他还是能读到代码的,但是里面的变量和类名都会变成a、b、c这样毫无意义的东西。

使用混淆的配置如下:

在gradle中启用混淆
打开项目对应的proguard文件
制定混淆策略,说明哪些类不混淆

AIDL

AIDL跨进程通信是app间调用的手段,主要是通过引用接口和bind到serviceconnection实现的。

引用对应的接口文件及其package
写一个serviceconnection去bind目标aidl
用intent去bindservice,需要传入aidl提供方约定的名称

然后就可以通过serviceconnection去调用aidl接口中提供的函数了

打包APK自动改名

我们提交apk时,需要给apk文件改名字,加上版本号,生成日期等,以便沟通和管理,这个工作可以在gradle里配置一下,自动完成。

打包apk时自动带上版本号和日期

请求权限

Android把权限分的很细,需要什么都需要在manifest文件中去配置

配置权限

但是Android现在对权限管理越来越严格了,很多权限不只需要manifest中配置,还需要用户打开app时手动确认,这需要在代码中动态检查和申请权限。

动态检查和请求权限

不止要申请权限,因为用户可能拒绝申请,所以还需要监听,在提出申请的Activity中,覆写指定函数,去监听用户的处理结果。

监听用户对权限申请的处理
处理权限申请的结果

数据库

Android中有很多数据库可用,例如原始的SQLite,能自动生成数据库的GreenDao,最近很火性能不错的Realm等。

这里先记录一下greendao的应用,首先在gradle中添加引用并配置生成策略,然后用注解的方式编写数据表的类文件,写完后build一下工程,greendao就会自动生成数据库相关文件

引用greendao
在gradle中设置相关策略
注解编写数据表的类文件
编译项目后,自动生成数据库相关文件

多版本及开发测试

AS支持多版本发布,可以同时生成多个不同渠道的apk,不过速度不是很快。

关于多渠道打包,可以参考《Gradle多渠道打包的原理、实践与辅助开发》

个人更喜欢用多版本来方便开发,在mock版本中模拟各种数据,测试业务场景,同时不对prod正式版造成任何影响。

配置过程如下:

在gradle中定义多版本

(多版本还可以帮助加速调试,你要为不同的版本配置不同的minSdkVersion,例如在开发的mock里设置minSdkVersion=21,这样在运行mock版本时编译速度更快)

在project视图下,为各版本编写不同的内容
在build variants中,切换版本进行编辑调试

搭好了多版本开发的基本架子,接下来就可以用多版本去辅助开发,例如,在mock开发版本中增加一个功能,即启动时清空数据库,同时prod正式版中没有这个特性。

在所有版本中增加一个Mock专用的类

可以在所有版本中增加一个类,启动时调用这个类的函数。

调用mock类

这个函数仅在mock版本中实现,在prod版本中,只是一个空函数,这样既能实现mock版本的特殊功能,又不会干扰到prod版本,最重要的是,发布前不需要改代码。

在debug时使用正式签名

按照一般的工程惯例,AS在开发时使用一个临时的apk签名,在release时使用另一个正式的签名,这样可以很好地把开发和发布区分开,也能很好地保护app产品。

但是,在实际开发过程中,经常需要在debug时会使用正式签名,例如,联调第三方库,或者在已经安装了正式版的设备上调试app,这时如果使用临时apk签名的话,签名会被拒绝,无法调试。

这时,我们可以通过gradle配置,在debug时使用正式签名,具体方法如下:

在gradle里配置signingConfigs项

注意,storefile这个参数里指向的路径,需要放一个正式签名的jks文件。

在defaultConfig下,增加signingConfig项
在buildTypes下,分布为release和debug设置使用的签名

这样,在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 <flag name="oldman"value="60" />

declare-styleable中的name是为自定义控件的代码准备的,代码根据这个名字找到自定义属性:

代码找到自定义的属性值

在xml文件中引用时,需要写一个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:

下载API源码

然后关闭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'

即可解决问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容