AndroidAndroid 知识点及效果

Android项目构建

2019-11-11  本文已影响0人  瑟闻风倾

1. Android Studio项目目录

(1) 区别Project和Module

(2) 项目结构
说明:项目结构大体上分为编译系统gradle配置文件应用模块Module。具体项目文件如下

Module目录.png

2. Android项目构建

2.1 Android项目构建流程(从源代码到apk文件的打包流程)

说明:Android项目构建流程一句话总结为:java文件经过编译生成.calss字节码文件,之后经过打包生成android可执行的classes.dex文件,然后和资源文件合并为未签名包,最后经过签名生成完整的包。
备注:一个Android Project经过编译打包后生成apk文件,然后再经过签名,就可以安装到设备上。

打包简略流程.png
打包详细流程.png
(1) 通过aapt打包res资源文件,生成R.java和resources.arsc
(2) 处理.aidl文件,生成对应的Java接口文件
(3) 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
(4) 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
(5) 通过apkbuilder工具,将classes.dex和aapt生成的resources.arsc一起打包生成apk
(6) 通过Jarsigner工具,对上面的apk进行debug或release签名
(7) 通过zipalign工具,将签名后的apk进行对齐处理。

2.2 jenkins 持续集成构建

3. Git版本控制

(1) 区别工作区和gitignore

(2) 常用git命令

备注:可通过git --help查看所有的git命令。

(3)2种主流的git工作流

4. Gradle

说明:新创建项目时会同时生成3个gradle文件。


gradle.png

(1) Project下的settings.gradle:多模块开发时使用,配置各个模块的属性

include ':app', ':newmodulle'

(2) Project下的build.gradle:声明项目自身需要的资源,如依赖项、第三方插件和仓库地址等信息

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        
        // 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) {
    delete rootProject.buildDir
}

(3) Module下的build.gradle:每个Module独有的配置文件,可覆盖Project下的build.gradle的配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.2'
    defaultConfig {
        applicationId "comi.example.liy.mytestdemo"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.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'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'org.jetbrains:annotations-java5:15.0'
}

5. ProGuard代码混淆技术

(1) ProGuard及功能:ProGuard技术用于angroid打包时压缩优化混淆我们的代码。

说明:ProGuard已经集成到android的构建系统中,所以在开发中不需要手动去调用它,但我们要了解它的原理。只有构建应用并发布到应用市场时才会使用ProGuard技术,在debudge时不需要进行代码混淆,即:在debug模式下不会开启ProGuard,而在release模式下会自动开启ProGuard代码混淆技术。ProGuard是一种可选的技术,不使用也能运行我们的代码,但是最好使用,它能影响应用的体积和安全性。

    buildTypes {
        release {
            minifyEnabled true   //开启混淆
            zipAlignEnabled true  //压缩优化
            shrinkResources true  //移出无用资源
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //默认的混淆文件以及我们指定的混淆文件
        
        }

    }

备注:开启了混淆还需在proguard-rules.pro文件编辑混淆规则,混淆规则网上也有很多,自行百度即可。
(2) ProGuard工作原理
EntryPoint类:标识不会被处理的类和方法
非EntryPoint类:对非EntryPoint类进行混淆重命名
(3) 为什么要使用ProGuard
java是一种跨平台的解释性语言,java的源码会被编译成.class字节码文件;由于跨平台的需要,字节码文件中包含了很多java源码的信息(如:变量名和方法名,可通过变量名和方法名来访问变量和方法),这个信息对程序运行无用但却容易被反编译。所以需要ProGuard代码混淆技术来移除并混淆.class字节码文件,即对将要发布的应用进行处理,使处理后的代码和处理前的代码不同,但却能实现相同的功能。因此时apk不用被反编译,获取就算被反编译代码也不易看懂,无法知道代码的真正作用。

上一篇下一篇

猜你喜欢

热点阅读