真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android基礎(chǔ),Android基礎(chǔ)實(shí)訓(xùn)報(bào)告

Android基礎(chǔ)『V1V2V3簽名』

基礎(chǔ)概念

創(chuàng)新互聯(lián)專注于彌勒網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供彌勒營銷型網(wǎng)站建設(shè),彌勒網(wǎng)站制作、彌勒網(wǎng)頁設(shè)計(jì)、彌勒網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造彌勒網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供彌勒網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

簽名:在 APK 中寫入一個「指紋」。指紋寫入以后,APK 中有任何修改,都會導(dǎo)致這個指紋無效,Android 系統(tǒng)在安裝 APK 進(jìn)行簽名校驗(yàn)時(shí)就會不通過,從而保證了安全性。

摘要算法: 使用一段簡單的看上去隨機(jī)的不可逆向的固定長度的字符串來表示一個文件的唯一性。 常見的摘要算法如MD5(128個比特位)、SHA-1算法(160/192/256個比特位)。

公鑰密碼體制:也稱非對稱算法,特點(diǎn)是 公鑰是公開的 ,私鑰是保密的。常見的如:RSA。

展開討論一下RSA:

Android中的簽名方案

V1 :基于jarsigner(JDK自帶工具,使用keystore文件進(jìn)行簽名) 或 apksigner(Android專門提供的,使用pk8、x509.pem進(jìn)行簽名)。keystore和pk8/x509.pem可以相互轉(zhuǎn)換。

簽名原理:首先keystore文件包含一個MD5和一個SHA1摘要。 這也是很多開放平臺需要我們上傳的摘要數(shù)據(jù) 。

簽名APK后會在META-INF文件夾下生產(chǎn)CERT.RSA、CERT.SF、MANIFEST.MF三個文件。

在apk中,/META-INF文件夾中保存著apk的簽名信息,一般至少包含三個文件,[CERT].RSA,[CERT].SF和MANIFEIST.MF文件。這三個文件就是對apk的簽名信息。

MANIFEST.MF中包含對apk中除了/META-INF文件夾外所有文件的簽名值,簽名方法是先SHA1()(或其他hash方法)在base64()。存儲形式是:Name加[SHA1]-Digest。

[CERT].SF是對MANIFEST.MF文件整體簽名以及其中各個條目的簽名。一般地,如果是使用工具簽名,還多包括一項(xiàng)。就是對MANIFEST.MF頭部信息的簽名,關(guān)于這一點(diǎn)前面源碼分析中已經(jīng)提到。

[CERT].RSA包含用私鑰對[CERT].SF的簽名以及包含公鑰信息的數(shù)字證書。

??是否存在簽名偽造可能:

修改(含增刪改)了apk中的文件,則:校驗(yàn)時(shí)計(jì)算出的文件的摘要值與MANIFEST.MF文件中的條目不匹配,失敗。

修改apk中的文件+MANIFEST.MF,則:MANIFEST.MF修改過的條目的摘要與[CERT].SF對應(yīng)的條目不匹配,失敗。

修改apk中的文件+MANIFEST.MF+[CERT].SF,則:計(jì)算出的[CERT].SF簽名與[CERT].RSA中記錄的簽名值不匹配,失敗。

修改apk中的文件+MANIFEST.MF+[CERT].SF+[CERT].RSA,則:由于證書不可偽造,[CERT].RSA無法偽造。

V2 :7.0新增的

簽名后的包會被分為四部分

1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)

2. APK Signing Block

3. ZIP Central Directory

4. ZIP End of Central Directory

新應(yīng)用簽名方案的簽名信息會被保存在區(qū)塊2(APK Signing Block) 中, 而區(qū)塊1( Contents of ZIP entries )、區(qū)塊3( ZIP Central Directory )、區(qū)塊4( ZIP End of Central Directory )是受保護(hù)的, 在簽名后任何對區(qū)塊1、3、4的修改都逃不過新的應(yīng)用簽名方案的檢查 。

V3 :9.0新增的

格式大體和 v2 類似,在 v2 插入的簽名塊(Apk Signature Block v2)中,又添加了一個新快(Attr塊) 。

在這個新塊中,會記錄我們之前的簽名信息以及新的簽名信息,以 密鑰轉(zhuǎn)輪的方案,來做簽名的替換和升級。這意味著,只要舊簽名證書在手,我們就可以通過它在新的 APK 文件中,更改簽名 。

v3 簽名新增的新塊(attr)存儲了所有的簽名信息,由更小的 Level 塊,以 鏈表 的形式存儲。

其中每個節(jié)點(diǎn)都包含用于為之前版本的應(yīng)用簽名的簽名證書,最舊的簽名證書對應(yīng)根節(jié)點(diǎn),系統(tǒng)會讓每個節(jié)點(diǎn)中的證書為列表中下一個證書簽名,從而為每個新密鑰提供證據(jù)來證明它應(yīng)該像舊密鑰一樣可信。

這個過程有點(diǎn)類似 CA 證書的證明過程,已安裝的 App 的舊簽名,確保覆蓋安裝的 APK 的新簽名正確,將信任傳遞下去。

注意: 簽名方式只支持升級不支持降級,如安裝了V2的包,不能覆蓋替換為V1的包。

參考

Android App簽名(證書)校驗(yàn)過程源碼分析

新一代開源Android渠道包生成工具Walle

Android 簽名機(jī)制 v1、v2、v3

Android基礎(chǔ)知識:Activity(3)Activity之間的跳轉(zhuǎn)

本文我們來學(xué)習(xí)Activity之間的跳轉(zhuǎn)

主界面放一個Button,用于跳轉(zhuǎn),Second界面就放一個TextView

MainActivity.java

activity_main.xml

SecondActivity.java

activity_second.xml

AndroidMainfest.xml

界面跳轉(zhuǎn)主要是通過構(gòu)建Intent,然后調(diào)用Activity的startActivity方法去啟動

Intent接收兩個參數(shù),一個是Context,一個是需要跳轉(zhuǎn)的Activity(Context有三種,分別是Application、Activity、Service,具體區(qū)別之后會發(fā)專門的文章來分析)

隱式啟動也需要構(gòu)建Intent,不過Intent傳入的參數(shù)是一串字符,這串字符是由你自己定義的

我們先來修改AndroidManifest.xml

action自定義一個字符串,按自己喜歡的風(fēng)格命名就行了

categroy也是由自己定義,但這里我們就用一個默認(rèn)的字符串

接著修改MainActivity.java

注意這個Intent傳入的參數(shù)要和之前定義的action一樣

如果在AndroidManifest.xml中加了自己的category,那么就要這樣寫

我們在啟動時(shí)要匹配所有的category才能啟動

這時(shí),你會發(fā)現(xiàn)我沒有將android.intent.category.DEFAULT加進(jìn)去

這是因?yàn)閟tartActivity的時(shí)候,系統(tǒng)會自動自動幫我們加上

這個就是隱式啟動。

Android基礎(chǔ)之常用五種布局

所有東西依次都放在左上角,會重疊,這個布局比較簡單,也只能放一點(diǎn)比較簡單的東西。

分為垂直布局( android:orientation="vertical" )和水平布局( android:orientation="horizontal" )。

垂直布局時(shí),每一行就只有一個元素,多個元素依次垂直往下;

水平布局時(shí),只有一行,每一個元素依次向右排列。

用X,Y坐標(biāo)來指定元素的位置,這種布局方式也比較簡單

在屏幕旋轉(zhuǎn)時(shí),往往會出問題,而且多個元素的時(shí)候,計(jì)算比較麻煩。

可以理解為某一個元素為參照物,來定位的布局方式。

主要屬性有:

相對于某一個元素 android:layout_below 、 android:layout_toLeftOf

相對于父元素的地方 android:layout_alignParentLeft 、 android:layout_alignParentRigh ;

每一個 TableLayout 里面有表格行 TableRow , TableRow 里面可以具體定義每一個元素。每一個布局都有自己適合的方式,這五個布局元素可以相互嵌套應(yīng)用,做出美觀的界面。

北大青鳥java培訓(xùn):學(xué)習(xí)Android開發(fā)要具備這些基礎(chǔ)?

互聯(lián)網(wǎng)移動設(shè)備已經(jīng)普及,Android,一個開放性平臺,對于各科技公司吸引力在持續(xù)上升,這不只是體現(xiàn)在翻倍上升的Android手機(jī)銷量上,Android市場在被迅猛的拓展開。

學(xué)習(xí)Android開發(fā)漸漸成為一種潮流。

那么,成都電腦培訓(xùn)介紹學(xué)習(xí)Android開發(fā)要具備哪些基礎(chǔ)呢?首先要熟悉學(xué)習(xí)Android開發(fā)要具備哪些基礎(chǔ)知識。

Java作為學(xué)習(xí)Android開發(fā)的基礎(chǔ)編程語言,掌握J(rèn)ava開發(fā)基礎(chǔ)知識是非常重要的。

另外,還要重點(diǎn)掌握針對Android平臺而特有的Activity、Service、Broadcast、ContentProvider、Handler等知識。

在學(xué)習(xí)Android開發(fā)時(shí)還應(yīng)該了解Android的開發(fā)工具。

學(xué)習(xí)關(guān)于AndroidSDK的相關(guān)知識。

AndroidSDK內(nèi)含一整套工具,能夠利于構(gòu)建應(yīng)用程序、設(shè)計(jì)圖形及布局。

另外一些工具能夠幫助進(jìn)行性能的調(diào)優(yōu)和剖析。

可見,掌握開發(fā)工具是非常必要的。

學(xué)習(xí)過程中,要時(shí)刻調(diào)整自己的學(xué)習(xí)狀態(tài)。

不要認(rèn)為Android開發(fā)大多應(yīng)用在Android手機(jī)上,做的都是小項(xiàng)目。

其實(shí),一個成功的項(xiàng)目開發(fā)必須有完整的流程,要有詳細(xì)的規(guī)范、進(jìn)度,專業(yè)的工程師和設(shè)計(jì)師,還要有測試人員以及后期維護(hù)等。

僅僅停留在基礎(chǔ)技能范疇,肯定是不能滿足的。

要想具備開發(fā)項(xiàng)目的能力,就要多學(xué)習(xí),積累經(jīng)驗(yàn)。

Android基礎(chǔ)知識

一、activity

1.一個activity就是一個類,繼承activity;

2.需要復(fù)寫onCreate()方法;

3.每一個activity都需要在AndroidMainfest.xml清單上進(jìn)行配置;

4.為activity添加必要的控件。

二、布局

線性布局:LinearLayout

1.填滿父空間:fill_parent、match_parent

2.文本多大空間就有多大:warp_content

3.文字對齊方式:gravity

4.占屏幕的比例:layout_weight="1" ?水平方向,則width=0,垂直方向,則height=0

5.一行顯示,空間不夠會省略:singleLine="ture"? false會換行

6.背景:background="#ffffff"

7.水平布局:orientation="horizontal"

垂直布局:orientation="vertivcal"

表格布局:TableLayout

1.內(nèi)邊距:padding

2.外邊距:marginLeft\Start、Right\End、Top、Bottom

三、RelativeLayout相對布局

layout_above 將該控件的底部置于給定ID控件之上

layout_below 將該控件的頂部置于給定ID控件之下

layout_toLeftOf 將該控件的右邊緣和給定ID控件的左邊緣對齊

layout_toRightOf 將該控件的左邊緣和給定ID控件的右邊緣對齊

layout_alignBaseline 該控件的baseline和給定ID的控件的Baseline對齊

layout_alignBottom 該控件的底部邊緣和給定ID的控件的底部邊緣對齊

layout_alignLeft 該控件的左邊緣和給定ID的控件的左邊緣對齊

layout_alignRight 該控件的右邊緣和給定ID的控件的右邊緣對齊

layout_alignTop 該控件的頂部邊緣和給定ID的控件的頂部邊緣對齊

layout_alignparentBottom 如果該值為true,則該控件的底部和父控件的底部對齊layout_alignParentLeft 如果該值為true,則該控件的左邊和父控件的左邊對齊

layout_alignParentRight 如果該值為true,則該控件的右邊和父控件的右邊對齊

layout_alignParentTop 如果該值為true,則該控件的上邊和父控件的上邊對齊

layout_centerHorizontal 如果該值為true,則該控件將被置于水平方向的中央

layout_centerInParent 如果該值為true,則該控件將被置于父控件水平和垂直方向的中央

layout_centerVertival 如果該值為true,則該控件將被置于垂直方向的中央

四、一個Intent對象包含一組信息

1.Component name

2.Action

3.Data

4.Category

5.Extras

6.Flags

Intent intent = new Intent(this, SecondActivity.class);

startActivity(intent);? //startActivity方法

intent.putExtra("Key", "Value");? //鍵值對

intent = getIntent();

String value = intent.getStringExtra("Key");? ? //通過鍵提取數(shù)據(jù)

五、初級控件:EditText、TextView、Button

1.獲取EditText的值

String value = EditText.getText().toString();

2.將值放到Intent對象中

Intent intent = new Intent();

intent.putExtra("one",value )

intent.setCalss(Activity.this, OtherActivity.class);

3.使用這個Intent對象來啟動Otheractivity

Activity.this.startActivity(intent);

4.將監(jiān)聽器的對象綁定到按鈕對象上

button.setOnclickListener(new Listener());

5.得到Intent對象當(dāng)中的值

Intent intent = getIntent();

String value1 = intent.getStringExtra("one");

int value2 = Integer.parseInt(value);

六、其他初級控件使用

①ImageView

②RadioGroup和RadioButton

setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())

③Checkbox

setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())

④Menu

1.當(dāng)客戶點(diǎn)擊MENU按鈕的時(shí)候,調(diào)用onCreateOptionMenu()方法

public boolean onCreateOptionMenu(Menu menu){

menu.add(0,1,1,R.string.id);

}

2.當(dāng)客戶點(diǎn)擊MENU內(nèi)部的具體某一個選項(xiàng)時(shí),調(diào)用onOptionItemSelected()方法

public boolean onOptionItemSelected(MenuItem item){

if(item.getItemId() == 1){

finish();

}

return super.onOptionItemSelected(item);

}

七、Activity的生命周期

1.第一次創(chuàng)建時(shí)調(diào)用

protected void onCreat(Bundle saveInstanceState);

2.顯示出來時(shí)調(diào)用

protected void onStrat();

3.獲得用戶焦點(diǎn)時(shí)調(diào)用(可操作)

protected void onResume();

4.點(diǎn)擊彈出第二個Activity時(shí)調(diào)用

protected void onPause();

5.當(dāng)?shù)谝粋€Activity不可見時(shí)調(diào)用

protected void onStop();

6.當(dāng)返回第一個Activity時(shí)調(diào)用,代替OnCreate,因?yàn)闆]被銷毀

protected void onRestart();

7.當(dāng)返回第一個Activity時(shí)調(diào)用(先執(zhí)行onStop,在執(zhí)行,因?yàn)榈诙€Activity被銷毀,不能返回獲取,只能通過onCreat,onStart,onResume再創(chuàng)建)

protected void onDestory();

八、Task

1.Task是存放Activity的Stack棧。當(dāng)點(diǎn)擊啟動第二個Activiry時(shí),第一個Activtiy會被壓入Stack棧當(dāng)中,第二個Activity會位于棧的頂部;當(dāng)返回第一個Activtiy時(shí),第二個Activity會被彈出Stack,第一個Activity會位于棧的頂部,以此類推。

注釋:當(dāng)調(diào)用finish()時(shí),當(dāng)前的Activity會被Destory掉,棧中的Activity會消失。

2.當(dāng)Activity都從Stack退出后,則就不存在Task。

九、高級控件

①進(jìn)度條ProgressBar

水平進(jìn)度條style="?android:attr/progressBarStyleHorizontal"

圓圈進(jìn)度條style="?android:attr/progressBarStyle"

用戶可視的visibility="gone"

②列表ListView

十、其他控件

A.下拉菜單Spinner

1.創(chuàng)建一個ArrayAdapter:

ArrayAdapterCharSequence adapter = ArrayAdapter.createFromResource(

this, //指上下文對象

R.array.plant_array, //引用了在文件中定義的String數(shù)組

android.R.layout.simple_spinner_item);//用來指定Spinner的樣式,可替換自定義

adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);//設(shè)置Spinner當(dāng)中每個條目的樣式

2.得到Spinner對象,并設(shè)置數(shù)據(jù):

spinner=(spinner)findViewById(R.id.spinnerId);

spinner.setAdapter(adapter);

spinner.setPrompt("測試");//標(biāo)題

3.創(chuàng)建監(jiān)聽器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView? adapterView,//整個列表對象

View view,//被選中的具體條目對象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView? adapterView){

S.o.p("nothingSelected");

}

}

4.綁定監(jiān)聽器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

注:第二種動態(tài)設(shè)計(jì)

1.創(chuàng)建ArrayList對象

ListString list = new ArrayListString();

list.add("test1");

2. 調(diào)用方法

ArrayAdapter adapter = new ArrayAdapter(

this, //指上下文對象

R.layout.item, //引用了指定了下拉菜單的自定義布局文件

R.id.textViewId,//id

list);//數(shù)據(jù)

3.得到Spinner對象,并設(shè)置對象

spinner.setAdapter(adapter);

spinner.setPrompt("測試");//標(biāo)題

3.創(chuàng)建監(jiān)聽器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView? adapterView,//整個列表對象

View view,//被選中的具體條目對象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView? adapterView){

S.o.p("nothingSelected");

}

}

4.綁定監(jiān)聽器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

B.DatePicker和DatePickerDialog

1.聲明一個監(jiān)聽器,使用匿名內(nèi)部類

DatePickerDialog.OnDateSetListener onDateSetListener

= new DatePivkerDialog.OnDateSetListener(){

public void onDateSet(

DatePicker view,

int year,

int monthOfYear,

int dayOfMonth){

S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)

}

}

2.復(fù)寫onCreateDialog(int id)方法:

@override

protected Dialog onCreateDialog(int id){

switch(id){

case DATE_PICKER_ID:

return new DatePickerDialog(this,onDateSetListener,2019,11,25);

}

return null;

}

3.使用時(shí)調(diào)用showDialog()方法

showDialog(DATE_PICKER_ID);

C.AutoCompleteTextView

B.Widget

C.Animatin

十一、實(shí)現(xiàn)ContentProvider過程

1.定義一個CONTENT_URI常量

2.定義一個類,繼承ContentProvider

3.實(shí)現(xiàn)query、insert、update、delete、getType和onCreate方法

4.在AndroidManifest.xml當(dāng)中進(jìn)行聲明


網(wǎng)頁標(biāo)題:android基礎(chǔ),Android基礎(chǔ)實(shí)訓(xùn)報(bào)告
本文網(wǎng)址:http://weahome.cn/article/hojgcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部