文章目录
1.1安卓系统架构
- 2003年 Andy Rubin 创办Android公司–> 2005谷歌收购–>抄袭ios–>Linux内核–>甲骨文java–>70%操作系统份额
- Linux内核–>系统运行层–>应用框架层–>应用层
- Linux内核—>Android 系统是基于
Linux 2.6 内核
的,这一层为 Android 设备的各种硬件提供了底层的驱动
,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。 - 系统运行层–>这一层通过一些
C/C++库
来为 Android 系统提供了主要的特性支持
。如 SQLite库提供了数据库的支持,OpenGL|ES 库提供了 3D 绘图的支持,Webkit 库提供了浏览器内核的支持等。
同样在这一层还有Android 运行时库
,它主要提供了一些核心库,能够允许开发者使用 Java 语言来编写 Android 应用
。另外 Android 运行时库中还包含了Dalvik 虚拟机,它使得每一个 Android 应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik 虚拟机实例
。相较于 Java 虚拟机,Dalvik 是专门为移动设备定制的,它针对手机内存、CPU 性能有限等情况做了优化处理 - 应用框架层–>这一层主要提供了
构建应用程序时可能用到的各种 API
,Android 自带的一些核心应用是使用这些 API 完成的,开发者也可以通过使用这些 API 来构建自己的应用程序。 - 应用层–>app
- Linux内核—>Android 系统是基于
1.2Android四大组件
分别是活动、服务、广播接收器、内容提供器
- 活动:是所有Android应用程序的门面,应用中能看到的东西都是放在活动中的
- 服务:在后台运行,即使用户退出应用,服务仍然是可以继续运行
- 广播接收器:允许应用接收和发送广播消息
- 内容提供器实现:应用程序之间共享数据
1.3项目结构
章节连接: https://weread.qq.com/web/reader/7c532360718ff6317c5255dkaab325601eaab3238922e53
- gradle和.idea:都是AS自动生成的一些文件
- app:项目中的代码与资源等内容几乎都放置在该目录
- build 包含编译时自动生成的文件
- gradle 包含了gradle wapper的配置文件
- gitignore 将指定的目录或文件排除在版本控制之外
- build.gradle 项目全局的gradle构建脚本
- gradle.properties 全局的gradle配置文件
- gradlew和gradlew.bat 用于在命令行执行gradle命令
- ActivityTest .iml 标识此项目是IntelliJIDEA项目(AS基于此开发)
- local. properties 指定本机中Android SDK路径
- settings.gradle 指定项目中所有引入的模块
1.4app目录结构
- build ,这个目录和外层的build目录类似,主要也是
包含了一些在编译时自动生成的文件
,不过它里面的内容会更加更杂,我们不需要过多关心。 - libs,如果你的项目中使用到了
第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
- androidTest ,此处是用来编写Android Test
测试用例
的,可以对项目进行一些自动化测试。 - java,目录是放置我们所有Java代码的地方
- res这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的
所有图片、布局、字符串等资源
都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下
,所以你不用担心会把整个res目录弄得乱糟糟的。 - AndroidManifest.xml这是你整个Android项目的配置文件,你
在程序中定义的所有四大组件都需要在这个文件里注册
,另外还可以在这个文件中给应用程序添加权限声明
。 - proguard-rules.pro这个文件用于
指定项目代码的混淆规则,
当代码开发完成后打成安装包文件,如果不希望代码被别人破解
,通常会将代码进行混淆,从而让破解者难以阅读。
1.5 项目运行原理
-
首先在AndroidManifest.xml中注册活动,
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
这两句表示这个活动是主活动,最先启动这个活动<activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.HelloWorld.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
-
从mainactivity可以看出 它继承AppCompatActivity,这是一个活动基类,活动中还有一个onCreate()方法,这是一个活动创建时必须执行的方法
public class MainActivity extends AppCompatActivity { private AppBarConfiguration appBarConfiguration; private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());// 这个函数引进布局 setSupportActionBar(binding.toolbar); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); binding.fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action尼玛的", Snackbar.LENGTH_LONG) .setAction("Action121", null).show(); } }); } 其实Android程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的, 更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。 布局文件写在res目录下的layout文件下
1.6 res目录详解
-
所有以drawable开头的文件夹都是用来放图片的,
-
所有以mipmap开头的文件夹都是用来放应用图标的,
-
所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的,
-
layout文件夹是用来放布局文件的。
-
res/values/strings.xml文件,内容如下
<resources> <string name="app_name">HelloWorld</string> <string name="action_settings">Settings</string> <!-- Strings used for fragments for navigation --> <string name="first_fragment_label">First Fragment</string> <string name="second_fragment_label">Second Fragment</string> <string name="next">Next</string> <string name="previous">Previous</string> <string name="hello_first_fragment">Hello first fragment</string> <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string> </resources>
可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。在代码中通过
R.string.app_name
可以获得该字符串的引用。在XML中通过@string/app_name
可以获得该字符串的引用。
1.7 详解build.gradle文件
-
不同于Eclipse, Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种烦琐配置。
-
项目中有两个build.gradle文件,一个外层,一个在内层,最新版安卓有改动,gradle文件被专门放置在Gradle Scripts文件夹下,两个build.gradle文件分别用于项目和模块
-
先看用于项目的build.gradle,
// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id 'com.android.application' version '7.1.3' apply false id 'com.android.library' version '7.1.3' apply false } // 插件 task clean(type: Delete) { delete rootProject.buildDir }
-
再看用于模块的build.gradle
plugins { id 'com.android.application' } android { compileSdk 32 defaultConfig { applicationId "com.example" // 项目包名 minSdk 29 // 最低兼容版本 targetSdk 32 // 目标版本 versionCode 1 // 项目版本号 versionName "1.0" // 项目版本名 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false // 代码混淆 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 混淆文件 } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } buildFeatures { viewBinding true } } dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.navigation:navigation-fragment:2.3.5' implementation 'androidx.navigation:navigation-ui:2.3.5' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
1.8 日志工具的使用
- Android中的日志工具类是Log(android.util.Log),这个类中提供了如下5个方法来供我们打印日志。
- Log.v()。用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
- Log.d()。用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比verbose高一级。
- Log.i()。用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。对应级别info,比debug高一级。
- Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比info高一级。
- Log.e()。用于打印程序中的错误信息,比如程序进入到了catch语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别error,比warn高一级。
- Log.d()方法中传入了两个参数:第一个参数是tag,一般传入当前的类名就好,主要用于对打印信息进行过滤;第二个参数是msg,即想要打印的具体的内容。
- 快捷输入,输入logd,然后输入tab键自动补齐
- 日志过滤器,可以过滤级别和名称
1.9 Android Studio 安装
书参考:https://weread.qq.com/web/reader/7c532360718ff6317c5255dkc51323901dc51ce410c121b
添加代理,vpn的代理服务器填上去