基于android的app開發步驟,Android應用基礎開發入門

 2023-12-09 阅读 29 评论 0

摘要:本文寫給Android小白,起步入門參考,不過還是喜歡從原理上盡量多講一點東西。 本文從以下四個方面展開,重點介紹前3節: 第一節:什么是apk? 第二節:android開發 工具介紹 第三節:我們開發中常用的一些方法 第四節ÿ

本文寫給Android小白,起步入門參考,不過還是喜歡從原理上盡量多講一點東西。

本文從以下四個方面展開,重點介紹前3節:

第一節:什么是apk?

第二節:android開發 工具介紹

第三節:我們開發中常用的一些方法

第四節:使用手機調試的方法

第五節:學習方法

?

第一節:什么是apk?

1,APK:AndroidPackage的縮寫,即Android安裝包。

2,apk本質上就是一個zip文件,將apk后綴名改為zip,解壓以后如下:

提前爆料一下,java文件會被編譯為.dex文件,因為Android虛擬機的可執行文件為dex格式。

xml文件會被轉化成二進制文件,因為

(1) 二進制格式的XML文件占用空間更小。

(2) 二進制格式的XML文件解析速度更快。

所以你是無法直接通過解壓apk直接看里面的代碼或者xml的。圖片等資源是可以的,assets下面的資源也是沒問題的,具體下面再詳細的說。

下面是編譯前的源碼目錄:

apk解壓后的文件與編譯前源碼比較還是能看出一些大概來。

3,問題來了,一個apk到底是怎么生成的呢?IDE工具(eclipse或者Android Studio)或者mm命令 做了哪些事情呢?

?

這個圖是google給出的apk打包過程,也就是IDE為我們做的事情。

(1)打包資源文件。

(2)處理aidl文件,生成相應java 文件。對于沒有使用到aidl的android工程,可以跳過此步驟。

(3)編譯工程源代碼,生成相應class 文件。

這一步調用了javac編譯工程src目錄下所有的java源文件,生成的class文件位于工程的bin\classes目錄下,上圖假定編譯工程源代碼時程序是基于android SDK開發的,實際開發過程中,也有可能會使用android NDK來編譯native代碼,因此,如果可能的話,這一步還需要使用android NDK編譯C/C++代碼,當然,編譯C/C++代碼的步驟也可以提前到第一步或第二步。通過Java Compiler編譯R.java、Java接口文件、Java源文件,生成.class文件。

(4)轉換所有class文件,生成classes.dex文件。Android虛擬機的可執行文件為dex格式,所以需要此步驟。

(5)打包生成apk。打包后的res文件夾(除res/raw資源被原裝不動地打包進APK之外)、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發的話)、resources.arsc、assets、AndroidManifest.xml打包成apk文件。

(6)對apk文件進行簽名。

(7)對簽名后的apk文件進行處理。在 Android SDK 中包含一個名為 “zipalign” 的工具,它能夠對打包后的 app 進行優化。 即對簽名后的apk進行對齊處理。

?

?????? 理論上來說,你可以不借助IDE,只用linux工具和命令完成整個android的打包過程。感興趣的同學可以試一試,如果你能成功,相信你對apk的打包過程已經有了十分清晰的認識。

????? 一般來說,你可以替換一些資源而不需要源碼,這是被允許的。但資源僅限于打包的時候沒有做轉化的,比如res下面的一些圖片或者視頻,音樂等資源,或者asserts下面的所有資源。步驟如下:apk改名為zip,并解壓,替換同樣規格的資源,將zip改名為apk。將apk重新進行簽名。此時這個apk就是被篡改過的apk。有同學會問,如果我想修改一些代碼中的邏輯可以么,這樣我就可以在別人的應用中植入自己的廣告了?可以的,這就需要修改其中的.dex文件,但是這個文件修改不是那么容易的,需要比較深入一些的android逆向技術。已經超過《Android應用基礎開發入門》的大綱。如果大家對這方面感興趣,可以作為一個課題專項研究。關于android逆向,大神寫的文章,有興趣的可以學習一下:https://www.52pojie.cn/thread-732298-1-1.html

?

第二節:android開發 工具介紹

?????? Google官方的IDE僅僅支持Android Studio,原來的時候eclipse也可以,但是在15年左右,google已經停止對eclipse的支持,這意味著,對于最新版的SDK,有可能用eclipse因為某些工具版本問題,是編譯不過去的且得不到官方的支持。

?????? 對于我們來說,就是盡量的不要用eclipse編譯,但是有一些源碼中的工程結果是eclipse的工程結構,并且還是無法用eclipse編譯的,只能用源碼mm進行編譯,這種情況依然建議使用eclipse作為編輯器,因為操作比較方便,鏈接的比較準確。在使用eclipse的時候,即使編譯不過,也請在右鍵-->>Propertytiews中選擇Android,選擇一個Android版本,這樣會能鏈接到一些Android的一些api。提高編程效率。

?

????? Android Studio是谷歌出品,在Android開發上有一些先天優勢,在查找類等平時開發工作中點點滴滴都會覺得方便,大家用的多了就能體會到優勢。Studio查看源碼也是非常方便,不加留意你甚至都分不清那些類自己的,那些類時Android的。下面著重介紹一下Android studio的一些用法:

?????? 為了更加全面的介紹,我用我自己實現的一些demo進行演示

1,Android Studio非常的依賴網絡,可以說,沒有網絡,AndroidStudio寸步難行。生活體驗,有網絡2分鐘能搞定的事情,如果studio由于某些原因無法直接連接網絡,那么工作量直接變為3天。而平時我們編譯工程遇到最多的問題,也是下載某個模塊卡住下載不動,下載超時等的編譯問題。

2,之所以出現上面的網絡的問題,根本原因在于AndroidStudio使用了gradle作為它的打包管理工具。喜歡gradle的人贊譽真方便,不喜歡它的人會抱怨gradle好詭異,怎么弄都不行,正所謂成也蕭何,敗也蕭何。何為gradle?gradle在apk編譯過程中做了那些事情?

????? 簡單的說,Gradle是一個構建工具,它是用來幫助我們構建app的,構建包括編譯、打包等過程。有時候

我們要自己在系統默認構建規則上做一些修改。這時候我們就要自己向Gradle”下命令“了,這時候我們就需要用Gradle能聽懂的話了,也就是Groovy。Groovy是一種基于JVM的動態語言。

????? 關于gradle還是比較復雜的,剛接觸android studio的同學會有被折磨的感覺,要學習的話也有很多的內容需要學習,這里不去系統的學習,只將我們最常用的一些代碼做簡單講解。

?

buildscript {

repositories {

jcenter() //構建腳本中所依賴的庫都在jcenter倉庫下載

}

dependencies {

//指定了gradle插件的版本

classpath 'com.android.tools.build:gradle:1.5.0'

? ?}

}

?

allprojects{

repositories{

google()

jcenter()

?

maven{

url"https://maven.google.com"

}

gradle.projectsEvaluated{

tasks.withType(JavaCompile){

options.compilerArgs.add('-Xbootclasspath/p:app/sdk/android.jar');

}

}

?

}

}

?

//指定應用插件,也就指定了編譯類型,是app還是jar,aar包

applyplugin:'com.android.application'

?

android{

compileSdkVersion23

buildToolsVersion"28.0.2"

useLibrary'org.apache.http.legacy'

defaultConfig{

applicationId"com.kingboard.settings"

minSdkVersion21

targetSdkVersion23

versionCode1

versionName"1.0"

}

signingConfigs{

release{

storeFilefile('../tools/platform_debug.keystore')

keyAlias'androiddebugkey'

keyPassword'android'

storePassword'android'

}

?

debug{

storeFilefile('../tools/platform_debug.keystore')

keyAlias'androiddebugkey'

keyPassword'android'

storePassword'android'

}

}

buildTypes{

release{

//混淆

minifyEnabledtrue

//移除無用的resource文件

shrinkResourcestrue

//Zipalign優化

zipAlignEnabledtrue

proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

signingConfigsigningConfigs.release

}

?

debug{

minifyEnabledtrue

shrinkResourcestrue

zipAlignEnabledtrue

proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

signingConfigsigningConfigs.debug

}

}

?

}

?

defgetLayoutLibPath(){

return"${android.getSdkDirectory().getAbsolutePath()}"+"/platforms/"+android.compileSdkVersion+"/data/layoutlib.jar"

}

?

dependencies{

implementationfileTree(dir:'libs',include:['*.jar'])

compileOnlyfiles('sdk/android.jar')

//implementation'com.android.support:support-v4:23.1.0'

implementation'com.android.support:support-v4:25.3.0'

implementation'com.android.support:appcompat-v7:23.1.0'

implementation'com.android.support:leanback-v17:23.1.0'

implementation'com.android.support:design:23.1.0'

implementation'com.jakewharton:butterknife:8.8.1'

annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'

implementation'me.yokeyword:fragmentation:1.3.6'

//implementationfiles('libs/mstar.jar')

//implementationfiles('libs/klog.jar')

}

?

????? 在這里面修改最多的,無疑就是導包了,一般來說,一個android的app,會依賴很多很多的包,很多的項目,而引用方式是極其簡單。

???????? Android studio版本更新至3.0,更新中,連帶著com.android.tools.build:gradle 工具也升級到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作為gradle的編譯版本,該版本gradle編譯速度有所加速,更加欣喜的是,完全支持Java8。當然,對于Kotlin的支持,在這個版本也有所體現,Kotlin插件默認是安裝的。

?

?

?????

??????? Android studio3.0中,compile依賴關系已被棄用,被implementation和api替代,provided被compile only替代,apk被runtime only替代,剩下的看名字就知道了。

????

implementation:只能在內部使用此模塊,比如我在一個libiary中使用implementation依賴了gson庫,然后我的主項目依賴了這個libiary,那么,我的主項目就無法訪問gson庫中的方法。這樣的好處是編譯速度會加快,推薦使用implementation的方式去依賴,如果你需要提供給外部訪問,那么就使用api依賴即可。如果你懶得搞懂這個關系,那么簡單,你在implementation和API之中,永遠選擇implementation,除非因為這個包編譯不過,再改為API。

compile(api)

api:跟2.x版本的 compile完全相同。用api指令編譯,libiary內部依賴對app Module 是可見的,app Module也可以使用Library內部依賴。這種是我們最常用的方式,使用該方式依賴的庫將會參與編譯和打包。

?

provided(compileOnly)

只在編譯時有效,不會參與打包?

可以在自己的moudle中使用該方式依賴一些比如com.android.support,gson這些使用者常用的庫,避免沖突。

?

apk(runtimeOnly)

只在生成apk的時候參與打包,編譯時不會參與,很少用。

?

testCompile(testImplementation)

testCompile 只在單元測試代碼的編譯以及最終打包測試apk時有效。

?

debugCompile(debugImplementation)

debugCompile 只在debug模式的編譯和最終的debug apk打包時有效

?

releaseCompile(releaseImplementation)

Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包。

3,Android studio有非常清晰的工程Project和模塊Module的概念,看一下工程結構。

查看代碼,studio提供了這么幾種方式,我們最常用的是Android和project兩種方式。

Android:為android開發提供的瀏覽方式,好處是開發android比較方便,找文件很容易找到。

Project:這個就是文件的物理存儲路徑,有的時候也非常有用。

????

????? 我們切換到Android視圖,其中的build.gradle有一個是project,其他的每一個module對應著一個。混淆規則,proguard-rules.pro每個module對應一個。

其他的文件很簡單,一看便知。除此以外,就是沒有module的具體代碼了。

?

4,Android Studio 常用的快捷鍵

雙擊shift : 查找文件

Alt+Enter: 提示,自動補全

Ctrl+E : 最近使用的文件

Ctrl+X: 刪除一行

?

?

第三節:我們開發中常用的一些方法

?

1,adb命令

??? adb devices

???? adb root

???? adb pull 電視目錄?? 電腦目錄

??? adb ush? 電腦目錄 電視目錄

???? mount -o remount,rw /system

?? cp:拷貝替換apk

?? adb install -r 電腦目錄

2,PackageManager方法 ActivityManager方法

?? pm install -r 電腦目錄

??? pm disable/enable com.jbd.tvwizard/.PagerActivity

??? am start? 包名

??? am start -n 包名/類名

???? am start -a action

??? am broadcast -a action --ei(es) key value

? 3, dumpsys方法

??????? dumpsys package

???????? dumpsys meminfo

???????? dumpsys activity activities | grep -E "Hist #|Stack #|Task id #"

???????? dumpsys |grep BroadcastRecord

??????? dumpsys input可以查看輸入設備使用的keylayout文件

??????? dumpsys window | grep mCurrentFocus

???? shareuserid android:sharedUserId="android.uid.system"

??? 4,app標志

?????? applicationId+簽名

5,apk安裝過程

???????? PackageManagerService是管理者,Settings中保存了應用中的各種包,整個邏輯很復雜,這里只從我們日常需要接觸的地方上,簡單了解一下apk的安裝過程。

?

1,應用安裝涉及到的目錄

/system/app:系統自帶的應用程序,獲得adb root 權限才能刪除//其他系統應用路徑

/data/app:用戶程序安裝的目錄。安裝時把apk文件復制到此目錄

/data/data:存放應用程序的數據

/data/dalvik-cache:將apk中的dex文件安裝到dalvik-cache目錄下(dex文件是dalvik虛擬機的可執行文件,當然,ART-Android Runtime的可執行文件格式為.oat,啟動ART時,系統會執行dex文件轉換至oat文件)

/data/system:該目錄下的packages.xml文件。類似于Window的注冊表,這個文件是解析apk時由writeLP()創建的,里面記錄了系統的permissons,以及每個apk的name,codePath,flag,ts,version,userid等信息,這些信息主要通過apk的AndroidManifest解析獲取,解析完apk后將更新信息寫入這個文件并保存到flash,下次開機的時候直接從里面讀取相關信息并添加到內存相關列表中。當有apk升級,安裝或刪除時會更新這個文件。
-/data/system/package.xml與/data/system/package.list:packages.list指定了應用的默認存儲位置/data/data/com.xxx.xxx;package.xml中包含了該應用申請的權限、簽名和代碼所在的位置等信息系,并且兩者都有同一個userld。之所以每個應用都要一個userId,是因為Android在系統設計上把每個應用當做Linux系統上的一個用戶對待,這樣就可以利用已有的Linux用戶管理機制來設計Android應用,比如應用目錄,應用權限,應用進程管理等。

?

2,應用安裝總體流程

1:拷貝文件到指定的目錄:
在Android系統中,apk安裝文件是會被保存起來的,默認情況下,用戶安裝的apk首先會被拷貝到/data/app目錄下,/data/app目錄是用戶有權限訪問的目錄,在安裝apk的時候會自動選擇該目錄存放用戶安裝的文件,而系統出場的apk文件則被放到了/system分區下,包括/system/app,/system/vendor/app,以及/system/priv-app等等,該分區只有ROOT權限的用戶才能訪問,這也就是為什么在沒有Root手機之前,我們沒法刪除系統出場的app的原因了。

2:解壓縮apk,創建應用的數據目錄
為了加快app的啟動速度,apk在安裝的時候,會首先將app的可執行文件dex拷貝到/data/dalvik-cache目錄,緩存起來。然后,在/data/data/目錄下創建應用程序的數據目錄(以應用的包名命名),存放在應用的相關數據,如數據庫、xml文件、cache、二進制的so動態庫等。

由于DEX字節碼位于apk壓縮包中,因此,如果程序啟動的時候,每次都要從apk文件中解壓提取DEX字節碼,明顯效率不高,因此,Android系統設計了如下策略:

(1) 創建一個"dalvik-cache"文件夾,專門存放DEX字節碼,具體位于/data/dalvik-cache

(2) 系統第一次啟動時,掃描所有的預裝apk文件,提取程序的DEX字節碼,經過優化后,存放到dalvik-cache目錄中

(3) 每次安裝新的apk的時候,也同樣提取DEX字節碼,優化后放入dalvik-cache目錄中

(4) 用戶點擊應用圖標后,直接從dalvik-cache目錄中快速加載優化過的DEX字節碼,這樣程序就可以很快的啟動了。

因此Android正在優化的過程,也是就是提取字節碼DEX的過程。

3:解析apk的AndroidManifest.xml文件

4:顯示快捷方式。

?

第四節:使用手機調試的方法

1,適用場景:

????? UI實現

????? 個別android接口驗證

2,方法步驟:

????? a,安裝驅動,手機型號不是太久,一般不需要這一步

??????? b,設置或者安全關鍵等,打開允許安裝其他來源的應用,手機型號比較新的一般需要這一步。

??????? c,設置-》關于手機-》版本號 點擊6次,進入開發者模式。

????? d,在開發者選項中打開開發者選項開關和允許USB調試的開關。

????? e,adb devices 查看連接狀態。

第五節:學習方法

??? github 上面有大量的可以學習的程序源碼,各個種類的都有,對于想學android開發時很有幫助的。

??? android提供的demo: google為自己的api提供的一些驗證demo,在開發中對接口使用方法上很有幫助,時原生的android的官方api的demo,是最具權威的。目錄/development/samples/

?

參考鏈接:

https://www.jianshu.com/p/d29c37dda256

https://blog.csdn.net/lyc088456/article/details/82415369

基于android的app開發步驟。https://www.jianshu.com/p/f47e45602ad2

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/195160.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息