Android入門:系統整體結構,專案組成結構,Activity和應用功能清單組態檔,res,APK,打包的過程

2020-10-02 11:00:35

Android系統整體結構圖

在這裡插入圖片描述
先是從底層看起:(它是從Linux核心裡面抽取出來的一部分)
DisplayDriver(顯示驅動),CameraDriver(相機驅動),BluetoothDriver(藍芽驅動)
FlashMemoryDriver(快閃記憶體驅動),USBDriver(USB驅動),後面的鍵盤驅動,WIFI驅動,音訊驅動,電池驅動
然後是第二層:
libraies(類庫)
SurfaceManager(顯示管理器),MediaFramework(多媒體框架),SQLite(資料庫,小型資料庫),OpenGL|ES(3D相簿引擎),SGL(2D相簿引擎),FreeType(免費開發的文字顯示框架),SSL(一個安全協定),WebKit(瀏覽器核心),libc(c語言核心庫)
Android RunTime(安卓執行時)
裡面有DalvikVirtualMachine(DVM),是從jvm裡面改進過來的
CoreLibraries(Java的核心庫)
然後是第三層(都是Java寫的)
對應:活動管理器,視窗管理器,內容提供者,檢視系統,通知管理,包管理,電話管理器,資源管理器,定位管理器,XMPP及時通訊協定
然後是第四層
Home(桌面),Contacts(聯絡人),Phone(電話),Browser(瀏覽器)

區別DVM與JVM
首要差別
Dalvik: 基於暫存器,編譯和執行都會更快些
JVM: 基於棧, 編譯和執行都會慢些

位元組碼的區別
Dalvik: 執行.dex格式的位元組碼,是對.class檔案進行壓縮後產生的,檔案變小
JVM: 執行.class格式的位元組碼

執行環境的區別    
Dalvik : 一個應用啟動都執行一個單獨的虛擬機器器執行在一個單獨的程序中
JVM: 只能執行一個範例, 也就是所有應用都執行在同一個JVM中

專案組成結構

在這裡插入圖片描述
在這裡插入圖片描述
自動生成的R.java類裡面的結構和對應資源的值
在這裡插入圖片描述

在這裡插入圖片描述

Activity和應用功能清單組態檔

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

/**
 * 主介面Activity類,主介面就是點選應用圖示啟動的介面
 */
public class MainActivity extends AppCompatActivity
{
    /**
     * 重寫方法onCreate:在當前類(activity)物件建立的時候自動呼叫
     * 就是回撥方法:不是我們自己呼叫的,是系統在一定條件下自動呼叫的,
     * 而且在Android中基本是以on開頭,這些方法我們不需要呼叫,一般是重寫
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //先呼叫父類別做一些預設的初始化工作
        super.onCreate(savedInstanceState);
        //設定視窗要顯示的內容檢視(介面或者佈局)
        //其中引數是一個int型別的數值,是要指定佈局檔案在R所對應的變數
        //這樣就可以載入佈局檔案,讓它顯示到視窗中
        setContentView(R.layout.activity_main);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<!--
    package屬性:指定當前應用唯一包名,這是應用的標識,不同的應用不一樣
    versionName屬性:指定應用的版本號
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication" >

    <!--
        icon:應用的圖示
        label:應用的名稱
        theme:應用的主題
    -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <!--
            activity標籤:設定我們的Activity類
            name屬性:要寫全類名的,但是可以省略包名部分
            label屬性:介面的標題
        -->
        <activity android:name=".MainActivity" >
            <!--讓當前Activity成為主介面Activity-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

res資料夾

res資料夾是資原始檔夾,裡面還分了很多資料夾
	mipmap-xxxdpi:有一系列的這種資料夾,這些是圖片資料夾,
			而為什麼有這麼多的資料夾呢?而且每一個資料夾裡面存放的圖片都是一樣的
			那是因為手機有好有壞,解析度不一樣,解析度壞的手機顯示這一張圖片剛剛好
			而解析度好的手機再顯示這一張圖片,那麼就會變得小了一點,所以這是為了適配不同解析度的手機

	layout:介面的佈局檔案,功能類似HTML
	values:常數資料夾
			比如strings.xml裡面,就包含固定的字串,在佈局中參照的方式:@string/變數的名稱

APK檔案

在這裡插入圖片描述

應用打包的過程

在這裡插入圖片描述

Android系統檔案目錄結構

Android系統就是類似Linux系統一樣,裡面的儲存結構沒有分什麼C槽D槽之類的
就只有一個盤,裡面的
/ 代表系統的根目錄
/data/app/ 存放的是第三方的apk檔案
/system/app/ 這是系統中安裝好的應用檔案
/data/data/packagename/ 存放的是以應用對應的檔案,在應用安裝時自動生成,應用解除安裝的時候自動刪除
/storage/sdcard/ 就是sd卡的資料夾
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

SDK檔案目錄結構

/docs
	是檔案的目錄,點選index.html就能檢視API檔案
/platforms
	是每一個版本執行所需要的jar包
/platform-tools
	包含一些開發工具,比如adb.exe(真機模擬的連執行緒式),sqlite3.exe
/samples
	一些Google提供的樣例專案工程
/source
	包含系統的部分原碼
/tools
	包含一些開發工具,比如hierarachyviewer.bat

在這裡插入圖片描述
/platforms
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

介紹三個工具

ADB

Android 偵錯橋(Android Debug Bridge)是多種用途的偵錯工具幫助你管理裝置或模擬器的狀態,就是類似之前你們一直使用的debug視窗
常用的命令

adb shell  //就是進入你的當前執行的Android系統的根目錄,使用ls可以檢視當前系統的目錄檔案
ctrl+c		//退出shell,就是退出系統根目錄
cls			//清屏
adb install –r apkPath           -push this package file to the device install,就是安裝一個apk檔案,就是幫手機安裝一個應用,-r意思是如果這個應用已經存在就先刪除

在這裡插入圖片描述

DDMS

全稱是Dalvik Debug Monitor Service
Android 開發環境中的Dalvik虛擬機器器偵錯監控服務
Eclipse中提供的Android應用開發的偵錯工具
它有四個重要的視窗

Logcat : 檢視紀錄檔輸出:
File Explorer:檢視系統內部檔案
Devices:顯示關聯的Android裝置
Emulator Control:操作控制關聯的Android裝置

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

工具類Log

工具類Log提供了五種的輸出的方法,分別是:
v() //對應Verbose級別,顯示全部的資訊
d() //對應debug級別,顯示偵錯資訊
i() //info級別,顯示一般資訊
w() //warming級別,顯示警告資訊
e() //Error,顯示錯誤資訊
測試

package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity
{

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i("jane", "執行了Log.i()");
		Log.e("jane", "執行了Log.e()");
	}
}

發現LogCat視窗列印的資訊超級多,所以使用過濾器進行過濾找到我們想要的資訊
這裡我們根據包名來過濾,因為一個應用對應一個包名,所以這裡肯定是我們寫的這個程式輸出的資訊
在這裡插入圖片描述
在這裡插入圖片描述

下載功能的模擬

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/MainButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="35dp"
        android:text="下載" />

</RelativeLayout>
package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/*
Toast: 用來顯示短時間提示文字的類
	static Toast makeText(...) : 建立一個toast物件
	show(): 顯示小提示

R: 應用的資源類
	R.drawable: 包含所有圖片資源標識的內部類
	R.layout: 包含所有佈局資源標識的內部類
	R.id: 包含所有檢視id標識的內部類
	R.string: 包含所有字串標識的內部類

 */
public class MainActivity extends Activity
{
	//一般會將要操作的元件放在類的變數裡面
	private Button button;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		//載入佈局檔案,並在記憶體中生成對應的檢視物件
		setContentView(R.layout.activity_main);
		Log.i("jane", "ִ執行了Log.i()");
		Log.e("jane", "ִ執行了Log.e()");
		//根據id在記憶體中查詢對應的檢視物件
		button = (Button) findViewById(R.id.MainButton);
		//給這個button設定監聽
		button.setOnClickListener(new View.OnClickListener()
		{
			//這是匿名內部類,下面是點選button的回撥方法
			@Override
			public void onClick(View v)
			{
				/*
				 * 下面的回撥方法主要的操作是:
				 * 1.顯示文字小提示
				 * 2.將button的內容更新為下載中...
				 * 首先是Toast需要的引數問題,需要一個Context類
				 * 經過檢視發現Context介面的實現類有Activity,那麼我們現在的類就是,
				 * 所以就將本類傳進去,但是這裡是匿名內部類,想得到外部類的當前物件,就使用類名.this獲得
				 * 第三個引數是duration,
				 *      * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
                 *      {@link #LENGTH_LONG}
                 * 通過註釋可以發現是顯示的時間,只有兩個取值
				 */
				Toast toast = Toast.makeText(MainActivity.this, "開始下載...", Toast.LENGTH_LONG);
				toast.show();
				button.setText("下載中...");
			}
		});
	}
}

手機單位相關的概念

手機的尺寸: 螢幕對角線的長度,單位為英寸(2.54cm)
手機的解析度: 螢幕能顯示的畫素的數量, 一般用在長方向上數量*寬方向上數量來表達
手機的畫素密度: pixels per inch,也稱PPi,即每英寸螢幕能顯示的畫素數,
畫素密度越大,顯示畫面細節就越豐富。
計算:畫素密度={1+√ [(長度畫素數-1) ^ 2 +(寬度畫素數-1)^2]}/螢幕尺寸

DPI: Dots Per Inch(每英寸所列印的點數或線數)的縮寫,
用來表示印表機列印解析度, 但有時也會用dpi來代指ppi

手機的密度: Density, 以160ppi為基準, 即畫素密度為160時Density為1
ldpi 120ppi 0.75
mdpi 160dpi 1.0
hdpi 240dpi 1.5
xhdpi 320dpi 2.0

px: pixels(畫素)
1px就的長度就對應螢幕一個畫素點的大小,但是這個單位在不同的手機一個畫素點的大小不一樣
比如手機的大小都一樣的情況下,如果好的手機在橫的方向能放下的畫素點有800個
不好的手機橫方向能放下的畫素點400個,那麼一個畫素點在壞的手機的大小是好手機兩倍

dp/dip: device-independent pixels(裝置無關畫素)
換算的方法有三種:
1dp = (dpi / 160) px
1dp = density px 160–>1px 120–>0.75 320–>2px
1px = 1/density dp

sp:scaled pixels(可縮放畫素)
與dp類似,但是可以根據使用者的字型大小偏好設定進行縮放

注意: Android在執行時會自動將dp/dip/sp為單位的尺寸轉換為畫素單位的值

dp與px的比較?
以px為單位的長度, 在差手機上會變大, 在好手機上變小
以dp為單位則不會變化

dp與sp的比較?
使用者可以在系統設定中設定文字的大小
如果字型大小使用sp為單位, 設定有效果
如果字型大小使用dp為單位, 設定沒有效果

在佈局檔案檢視的寬高儘量用match_parent/wrap_content
如果必須指定特定值, 使用dp/dip做單位
文字大小使用sp做單位