前言
少壮不努力,老大徒伤悲。在弱冠通往而立的道路上,我们应该努力为自己,为家庭奋斗,时刻想着心中的坚守!
一个Android项目非常之复杂,即便一个最简单的项目,包含的文件也有几十个,但我们只需了解与开发有关的文件。接下来我们来看一下一个项目中的各个文件。
1.模块及其下属文件。
2.gradle scripts目录及其下属文件。
3.项目打包签名生成的.apk文件结构。
一、模块及其下属文件介绍
如上图,我们以上一个创建的最简单的app来看看(用Android视图),显然,可以看到manifests,java,java(generated),res,4个大文件夹:
1.manifests目录下只有一个xml文件:AndroidManifest,xml。
这个文件是一个模块(app)的清单配置文件,以后会看到,一个app的名字,版本号,使用到的权限,组件等等都需要在此文件中声明。
2.java文件夹:这里面有三个包com.example.firstapplication,com.example.firstapplication(androidTest)和com.example.firstapplication(test),显然,后面两个包是AS自动生成的测试文件,不需要关心。来看第一个包中的文件MainActivity.java,打开后看见这是一个继承自AppCompatActivity的activity类(以后会知道一个activity就是一个屏幕,是四大组件之一),MainActivity见名知意,相当于main入口函数。
当然,以后我们会编写额外的类和各种源文件,大多数情况把自定义的包java文件放在java目录下的第一个包里,只需要鼠标右键->点击new快速生成各种文件,相当便捷,而不用去点击file状态栏生成。。。
3.java(generated)文件夹:这也是AS 自动生成的,不需要了解。
4.res文件夹:存放一个app所用到的各种资源,如图片,音乐,视频,字典等等,这有4个原生的目录:
(1)drawable:存放图片资源
(2)layout:存放界面布局文件(.xml文件)
(3)mipmap:一般用于存放app的logo,优点是图片渲染速度快
(4)value:存放字符串,颜色,样式文件等
往以上文件夹添加文件只需Ctrl+v粘贴进文件夹中,删除用delete键。
在这里强烈建议各位把与Android开发用到的单词学好,做到见名知意,推荐使用扇贝单词,选择android开发单词书。
熟悉开发用的单词是每一个程序员的基本素养!
二、gradle scripts目录及其下属文件
gradle 是自动化构建工具,由于一个Android项目中的文件实在是太多了,所以AS需要一个快速,高质量的工具来管理构建这些文件。gradle 使用groovy语言来编写构建文件,如果不会也没关系,因为AS会为项目自动生成构建文件,我们只需要知道几个与开发Android相关的关键字即可。来看一下每个文件
由图可知,该目录中build.gradle(project),build.gradle(module)对应整个工作区间的构建文件和一个app对应的构建文件
(1)build.gradle(project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {//关键字:repositories:代码仓库,指明从哪里下载依赖的文件
google()
jcenter()
}
dependencies {//关键字:dependencies ,依赖,指明此项目用到的文件
classpath 'com.android.tools.build:gradle:3.5.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {//关键字:task ,声明一个构建任务
delete rootProject.buildDir
}
注意此工作区间用到的build文件一般不要手动修改,AS会自动根据文件的变更来动态调整的!
(2)build.gradle(module)
apply plugin: 'com.android.application'//关键字:apply plugin,此app构建用到的插件(插件就是包含一系列构建命令的集合)
android {
compileSdkVersion 28//指定编译用的SDK版本号为28(Android 9)
buildToolsVersion '28.0.3'//指定编译工具的版本号,这里的头两位数字必须和compileSdkVersion保持一致,具体的版本号可在SDK安装目录找到。
defaultConfig {
applicationId "com.example.firstapplication"//指定该模块的应用编号及app的包名,该参数为自动生成,无需修改。
minSdkVersion 23//指定app运行在最低SDK版本号。
targetSdkVersion 28//指定目标设备的SDK版本,app最希望在哪个版本的安卓上运行
versionCode 1//指定app的应用版本号。
versionName "1.0"//版本名称。
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//AS的测试器。
}
buildTypes {
release {
minifyEnabled false//指定开启/关闭代码混淆。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//混淆规则的文件。
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])//关键字:implementation 定义app源代码的依赖。只有指定了这些依赖才能够调用安卓的API。这里指定libs目录下的所有.jar包
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'//指定 test测试的依赖。
androidTestImplementation 'com.android.support.test:runner:1.0.2'//androidTest目录的依赖
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
我们导入别人的项目或者模块,导致初始化失败,绝大多数情况下都是这个文件出问题。请仔细检查需要导入的模块中指定的编译工具的版本号,以及当前模块已经安装的编译工具版本号,只有两者匹配才能够正常编译。
(3)杂项文件
gradle.properties:该文件用于配置编译工程的命令行参数,一般无需改动。
proguard-rules.pro:该文件用于描述java文件的代码混淆规则。
local.properties:项目的本地配置,一般无需改动。比如SDK的本地路径和NDK的本地路径等。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这里只是粗略的讲了Android视图下的文件结构,整个项目详细的文件结构,需要打开project视图查看。
三、项目打包生成的.apk文件结构
当一个app打包签名成为.apk文件后,其文件结构在构建工具下产生了较大的变化。我们用AS自带的apk分析工具看一看(此处还没有打包,但结果无差异),点击file–>open,打开一下路径然后OK:
出现:
由图可知,这出现了大量新的文件,其中:
classes.dex
是dex 可执行文件。众所周知,Java程序,首先把Java文件编译成class文件,字节码都保存在了class文件中,Java虚拟机可以通过解释执行这些class文件。
而Dalvik虚拟机是在Java虚拟机进行了优化,执行的是Dalvik字节码,而这些Dalvik字节码是由Java字节码转换而来,一般情况下,Android应用在打包时通过AndroidSDK中的dx工具将Java字节码转换为Dalvik字节码。dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的。
当然,对apk的逆向工程大部分都是修改这个文件。
META-INF
保存应用的签名信息,签名信息可以验证APK文件的完整性。AndroidSDK在打包APK时会计算APK包中所有文件的完整性,并且把这些完整性保存到META-INF文件夹下,应用程序在安装的时候首先会根据META-INF文件夹校验APK的完整性,这样就可以保证APK中的每一个文件都不能被篡改。以此来确保APK应用程序不被恶意修改或者病毒感染,有利于确保Android应用的完整性和系统的安全性。
META-INF目录下包含的文件有CERT.RSA,CERT.DSA,CERT.SF和MANIFEST.MF,其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,CERT.SF、MANIFEST.MF记录了文件中文件的SHA-1哈希值。
res目录没有太大变化,同上。
AndroidManifest.xml 同上。
resources.arsc
用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。
当然也可能包含其他文件夹:
assets 存放需要打包到 APK 中的静态文件
lib 存放应用程序所依赖的 native 库
四、doc文档下载及其使用
对于一个开发人员来说,Doc文档是必不可少。没有哪一个人知道每一个类的具体用法。我们只有通过查阅安卓官方提供的使用文档才能够了解每一个类正确用法。这里推荐使用在线文档进行查阅,跳转速度快,而且更方便。
当然也可以离线下载查阅,那么怎么下载呢?首先我们在AS里点setting,使用搜索框搜索Android SDK找到里面的SDK Tools。如图:
打勾,然后点击apply,ok,等着下载。下载后用浏览器打开打开这个文件中的index.html文件,出现:
点击Develop–>API Guide,假如对activity不了解的话,点击左边进入activity的描述页:
不要为英文感到头痛!使用网页翻译功能可以快速了解大概意思。总之,语言不是我们面对的阻碍,无论是编程语言还是交流语言!
总结
粗略的了解了Android项目和.apk的文件结构,了解了如何查阅Android的API。接着总算开始步入正轨了,问大家一个问题:在中等噪音下,你是如何快速入睡的?