帶確定和取消的對話框:
1.AlertDialog,Builer//對話框構建器創建
Alertdialog.Builer builer=newBuiler(this)//this當前上下文
getapplicationContext()也是獲取上下文,但這裏有問題
2.設置圖標,提示框的左上角顯示的圖標
builder.setIcon()
3.設置是標題
builer.setTitle();
4.設置內容
builer.setMessage();
5.設置按鈕樣式(一個,兩個還是三個)
builder.setPositiveButtion("確定",onClickListener()接口)//帶確定的按鈕
6.實現接口內方法
瀏覽網頁動作用隱式意圖
7.取消的點擊事件
builer.setNegativebuttion("取消",newOnClickListener接口,裏面的實現爲空,就代表用戶點擊取消對話框
8.創建對話框並顯示
Alertdialog dialog=builer.create();//用上面的參數建立一個對話框
dialog.show()//顯示對話框
onPause()方法是噹噹前activity失去焦點的時候調用的方法
對話框不會使當前activity失去焦點,因爲對話框是activity的一部分,彈出對話框不會讓activity失去焦點,對話框是這個activity的一部分,getApplicationContext沒有維護特有activity上下文的信息的,所以Builer這裏不能使用getApplicationContext,只能作this
activity.this跟getApplicationContext()
activity.this
代表的是上下文,裏面維護的有activity裏面的一些環境參數的引用,
getapplicationcontext()
整個應用程序的上下文,維護的引用要比activity.this少,但生命週期比activity長,應用程序的時候
如果想維護長時間的連接可以用例如打開數據庫長時間連接時使用getApplicatContext()
單選對話框:
1.AlertDialog,Builer//對話框構建器創建
Alertdialog.Builer builer=newBuiler(this)//當前上下文
getapplicationContext()也是獲取上下文,但這裏有問題
2.設置圖標
builder.setIcon()
3.設置是標題
builer.setTitle();
4.單選的條目
builer.setItems(items,listener);
itmes:字符串數據組,顯示的數據
listener:點擊事件OnClickListener
5.監聽事件的實現
6.創建對話框並顯示
Alertdialogdialog=builer.create();//用上面的參數建立一個對話框
dialog.show()//顯示對話框
顯示帶按鈕的對話框:
1.AlertDialog,Builer//對話框構建器創建
Alertdialog.Builer builer=newBuiler(this)//當前上下文
getapplicationContext()也是獲取上下文,但這裏有問題
2.設置圖標
builder.setIcon()
3.設置是標題
builer.setTitle();
4.單選帶按鈕的條目
builer.setSingleChoceItems(items,checkedItem,listener);
items:字符串數據組,顯示的數據
listener:點擊事件OnClickListener
checkedItem:默認勾選的條目,從零開始
5.監聽事件的實現
在這裏還要注意一點我們點了某一個條目是不會關閉這個彈出窗的我們需要在點擊事件最後用dialog.dismiss()方法關閉窗口
還有一種是dialog.cancel()也可以關閉窗口,實現上都我們調用cancel()程序會判斷我們傳過去的消息是否爲空,如果爲空就直接調用dialog.dissmiss()方法,也就是說我們可以dialog.setOnCancelListener()監聽cancel()事件,並響應事件
6.創建對話框並顯示
Alertdialogdialog=builer.create();//用上面的參數建立一個對話框
dialog.show()//顯示對話框
多選對話框:
1.AlertDialog,Builer//對話框構建器創建
Alertdialog.Builer builer=newBuiler(this)//當前上下文
getapplicationContext()也是獲取上下文,但這裏有問題
2.設置圖標
builder.setIcon()
3.設置是標題
builer.setTitle();
4.多選條目
builder.setMultiChoiceItems(items,checkedItems,listener);
itmes:字符串數據組,顯示的數據
listener:點擊事件OnClickListener
checkedItems:這個是條目選擇情況的一個boolean[]數組
在這個接口中有一個onClick的方法,(DialogInterfacedialog,intwhich,booleanisChecked)isChecked參數表示現在條目是否選中
5.監聽事件的實現
在這裏還要注意一點我們點了某一個條目是不會關閉這個彈出窗的我們需要在點擊事件最後用dialog.dismiss()方法關閉窗口
還有一種是dialog.cancel()也可以關閉窗口,實現上都我們調用cancel()程序會判斷我們傳過去的消息是否爲空,如果爲空就直接調用dialog.dissmiss()方法,也就是說我們可以dialog.setOnCancelListener()監聽cancel()事件,並響應事件
6.取消的點擊事件
builer.setNegativebuttion("取消",newOnClickListener接口,裏面的實現爲空,就代表用戶點擊取消對話框
7.創建對話框並顯示
Alertdialogdialog=builer.create();//用上面的參數建立一個對話框
dialog.show()//顯示對話框
進度度對話框
1.進度條對話框
ProgressDialogpd=newProgressDialog(this);
2.設置顯示樣式默認是不顯示具體進度條
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//這是顯示的水平進度條
pd.setMax(100);這是設置最大值
pd.setProgress(20);//這是默認值
3.顯示內容
pd.setMessage("正在下載數據");
4.顯示
pd.show();
進度條可以在子線程中去更新的,我們可以用子線程去更新這個進度條
單選框(RadioButton)
多選框(CheckBox)
下拉列表框<Spinner>內部實現跟listView原理是一樣的
1.main定義這個控件<Spinner>
2.spinner組件找到
3.設置數據
spinner.setAdapter(adapter)
android.widget.spinnerAdapter的接口,繼承是的adapter,
4.實現adapter的類newArrayAdapter<T>(context,resource,textViewResourceId,objects)
context:this,上下文
resource:這個是條目對應的資源文件,定義一個xml的佈局文件
textViewResourceId:想綁定的控件id
objects:顯示的條目數據
5.定義事件:
spinner.setOnItemSelectedListener(newOnItemSelectedListener()接口,裏面有兩個方法一個是onItemSelected(當條目被選擇時的事件),onNothingSelected(當一個條目都沒有被點擊的事件)
這個組件一般很少用因爲很難看,一般是定義一個ImageButtion,點擊後在下面顯示一個listView
自動補全文本的textView
AutocompleteTextView
1.定義提示數據:
String[]names={"老張","老方","老畢","李明","李麗","陳江","abc","acc"};
2.AutocompleteTextView控件尋找
AutoCompleteTextView nameText=(AutoCompleteTextView)this.findViewById(R.id.name);
3.創建適配器
ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,names);
R.layout.simple_dropdown_item_1line:是一個簡單的佈局
4.設置適配器
nameText.setAdapter(adapter);
5,main佈局中還要設置默認的匹配大小,就是輸入幾個以後開始提示:
android:completionThreshold="1"//指定幾個字開始提示,一般默認是2個字
多次輸入內容自動完成文本框(就是說想要多次提示,在輸入字符用","豆號分隔)
MultiAutocompleteTextView
ViewFlipper的控件使用:多個圖層之間的相與切換
1.控件ViewFlipper定義
2.activity裏找到ViewFlipper的控件
3.添加顯示條目
vf.addView()
4.創建一些TextView加入到ViewFlipper中
5.經過第3步跟第4步就創建了一個圖層,可以循環3跟4去創建更多的圖層
6.顯示條目
vf.showNext();//顯示下一個
vf.showPrevious()//顯示上一個
手勢識別器:GestureDeteCtor類
1.新建GestureDetector類,在這個方法中有一個參數是android.view.GestureDetector.OnGestureListener是一個識別的監聽器,我們new這個接口的時候發現有好多需要實現的方法,一般google工程師都給我們創建了一個簡單的識別監聽器類(GestureDetecotr.SimpleOnGestureListener())
2.接口中用onFling()方法,這個方法是手指在屏幕上滑動的時候調用的方法
onFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY)
e1:手指第一次接觸屏幕的事件,e1.getX()得到x的座標位置,e1.getY()得到y的座標位置
e2:手指離開屏幕的事件
velocityX:水平移動速度(像素)
velocityY:垂直移動速度(像素)
android中座標左上角是(0,0)
3.然後重寫當前activity的onTouchEvent(MotionEventevent)事件,裏面的實現代碼:
mGesturcDetector.onTouchEvent(event);//使用手勢識別器,,識別當前的手勢
在main.xml佈局文件中android:visibility="gone"有三個選擇:
visible:可見
invisible:不可見但還佔用着佈局的位置
gone:不可見也不佔用佈局的位置
android下的動畫:
在api的devGuide的Animation(動畫條目中)看到有三種,DrawableAnimation就是楨動畫
楨動畫:
1.創建xml配置文件:
在android的資源文件res下創建一個anim的目錄,在這個目錄下新建一個xml文件,ResourceType:選擇Drawable,下面的RootElement根據元素選擇animation-list,然後在api中copy以下的xml配置信息
TheXMLfileconsistsofan<animation-list>elementastherootnodeandaseriesofchild<item>nodesthateachdefineaframe:adrawableresourcefortheframeandtheframeduration.Here'sanexampleXMLfileforaDrawableanimation:
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<itemandroid:drawable="@drawable/rocket_thrust1"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust3"android:duration="200"/>
</animation-list>
2.創建動畫的圖片資源,在android的資源文件Res下新建一個drawable目錄用於存放播放的圖片資源文件
3.修改從api中copy過來的配置信息
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
android:drawable=這裏寫資源文件,android:duration=這裏填的是播放的時長
4.activity中實現播放的功能
ImageViewrocketImage;
rocketImage.setBackgroundResource(R.drawable.anim)//引入動畫
AnimationDrawableanimationDrawable=(AnimationDrawable)rocketImage.getBackground();//獲取AnimationDrawable對象
然後就可以在點擊事件中調用animationDrawable.start()方法啓動了
上面的播放只能播放一次,如果配置文件中配置android:oneshot="false"就可以播放多次,上面的播放animationDrawable.start()一定要寫在點擊事件中,如果直接跟在前面的代碼後面是播放不出來的,因爲這也是要準備的.上面的準備寫在activity的onCreate方法中,所以一般我們不使用這個控件,可以自己開一個線程去實現這個控件的功能
view動畫:
api-->devGuide-->Animation-->viewanimatin中定義了創建的步驟
透明度變化的動畫:
1.在res資源文件夾下創建一個anim文件夾,然後建立一個xml配置文件在resourcetype中選擇TweenAnimation在RootElement中選擇alpha
2.在xml配置信息
android:fromAlpha="0.0"//這是完全透明
android:toAlpha="1.0"//這是完全不透明
android:duration="1000"//播放1秒鐘
3.把資源文件的動畫轉化成一個對象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:這是一個動畫資源文件
4.播放動畫
iv.startAnimation(a);
旋轉的動畫:
1.在res資源文件夾下創建一個anim文件夾,然後建立一個xml配置文件在resourcetype中選擇TweenAnimation在RootElement中選擇rotate
2.在xml配置信息
android:fromDegrees="0"//這是從零度開始
android:toDegrees="360"//這是旋轉的度數
android:pivotX:旋轉的X位置(旋轉圓心)
android:pivotY:旋轉的Y位置(旋轉圓心)
adnroid:duration="2000"2秒轉一圈
android:repeatCount="2"旋轉的圈數
android:repeatMode="restart"正的開始如果是reverse這是倒的開始
3.把資源文件的動畫轉化成一個對象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:這是一個動畫資源文件
4.播放動畫
iv.startAnimation(a);
縮放的動畫
1.在res資源文件夾下創建一個anim文件夾,然後建立一個xml配置文件在resourcetype中選擇TweenAnimation在RootElement中選擇scale
2.在xml配置信息
android:fromXScale="0.5"從水平二分之一開始
android:toXScale="2.0"到水平二倍結束
android:fromYScale="0.5"從垂直二分之一開始
android:toYScale="2.0"到垂直二倍結束
android:duration="2000"指定時長
3.把資源文件的動畫轉化成一個對象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:這是一個動畫資源文件
4.播放動畫
iv.startAnimation(a);
位移的動畫效果
1.在res資源文件夾下創建一個anim文件夾,然後建立一個xml配置文件在resourcetype中選擇TweenAnimation在RootElement中選擇translate
2.在xml配置信息
android:fromXDelta="0"//從那個x座標開始
android:toXDelta="50"//向右移動50個像素
android:fromXDelta="0"//從那個y座標開始
android:toXDelta="100"//向下移動100個像素
android:duration="2000"//播放2秒鐘
android:startOffset="2000"//延遲2秒播放
3.把資源文件的動畫轉化成一個對象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:這是一個動畫資源文件
4.播放動畫
iv.startAnimation(a);
上面移動量也可以不寫死,100%p寫這個參數相當於移動父窗體大小的距離
指定一組動畫集:
1.在res資源文件夾下創建一個anim文件夾,然後建立一個xml配置文件在resourcetype中選擇TweenAnimation在RootElement中選擇set,在裏面可以包含以上幾個動畫的xml文件內容
代碼的方式創建動畫
(例如遊戲的應用,如工具包,手機殺毒動態顯示手機殺毒文件條目)
可以根據xml文件的配置,創建相應的類,實現配置文件一樣的功能
9_patch圖片(後綴名爲9.png)
在android的tools的目錄下有一個draw9patch.bat的文件,這個是專門處理9patch圖片的,如果我們想讓一個圖片在拉伸的時候不畸形的話可以用這個工具在四個角上沒有圖形的空白界面上點上四個小黑點
android下屏幕適配
1,適配主流屏幕
ldpi小分辨率
mdpi中等
hdpi高
xhdpi超大(平板)
如果建立layout_480x320表示建立一個分辨是480x320的佈局
這樣手機會自動去匹配佈局界面,默認是layout,沒找到就用這個
儘量採用線性佈局和相對佈局,適配絕大數的屏幕,採用相對的像素單位dip,sp
也可以設置手機橫豎的佈局layout-land,在代碼裏面的單位都是像素的
android國際化
在android的系統源代碼中還有很多國際化的設置,可以在資源文件的res包中看到下面有很多包,如values-zh-rCN,這是中國,還有一個要注意的就要一定要創建一個values的文件夾還要在這下面創建一個strings.xml文件,這個默認的,中國也可以用values-zh,這裏的配置信息可以在html的語言裏查看前面是國家後面r加語言
文字國際化,圖片也能國際化
drawable-en-rUS這是存放給美國語言看的,但是也要有一個默認的drawable目錄存放默認的圖片
apk的安裝器
調用系統的組件:在android系統源代碼中找到apps文件夾-->PackageInstaller-->查看清單文件-->PackageInstallerActivity的activity下面找到他的intent配置-->根據配置創建一個安裝意圖,如果要發佈到app市場的話就要用eclipse的導出apk,這裏就可以指定我們的證書,如果直接用eclipse爲我們生成的apk那個是debug的證書
android手機的傳感器
方向傳感器指南針
1.得到傳感器服務
SensorMangersm=getSystemService(SENSOR_SERVICE);
2.註冊傳感器監聽器
sm.registerListener(listener,sensor,rate);
listener:SenseEventListener設置監聽的對象
sensor:註冊到那個對象上
rate:監聽的速率
上面第三個參數爲採樣率:最快、遊戲、普通、用戶界面。當應用程序請求特定的採樣率時,其實只是對傳感器子系統的一個建議,不保證特定的採樣率可用。
最快:SensorManager.SENSOR_DELAY_FASTEST
最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗,由於傳遞的爲原始數據,算法不處理好將會影響遊戲邏輯和UI的性能。
遊戲:SensorManager.SENSOR_DELAY_GAME
遊戲延遲,一般絕大多數的實時性較高的遊戲都使用該級別。
普通:SensorManager.SENSOR_DELAY_NORMAL
標準延遲,對於一般的益智類或EASY級別的遊戲可以使用,但過低的採樣率可能對一些賽車類遊戲有跳幀現象。
用戶界面:SensorManager.SENSOR_DELAY_UI
一般對於屏幕方向自動旋轉使用,相對節省電能和邏輯處理,一般遊戲開發中我們不使用。
3.得到系統默認傳感器,就可以得到傳到上面的方法裏了
Sensorsensor=sm.getDefaultSensor(Sensor.TYPE_ORIENTATION)//方向傳感器
4.實現SensorEventListener接口實現裏面的方法
onSensorChanged(SensorEventevent)//這是當傳感器的數據發生變化的時候調用的方法,event就包含有當前信息的變化.放在一個數據中
float[]arr=event.values;//看提示裏面根據數組的下標不同存放了不同的數據,具體看提示說明
現在我們只關心跟水平正方的偏移量就可以用arr[0]就行了0=North,90=East,180=South,270=West
在程序退出時要把傳感關裝,可以在activity的onDestroy()的方法中調用sm.unregisterListener(listener);把傳感器關閉
5.定義一個圖片,在onSersorChanged()方法中定義一個RotateAnimation的動畫,如果傳感器數據發生變化時我們旋轉圖片,偏移量即我們的偏移量
RotateAnimationra=newRotateAnimation(fromDegrees,toDegress,pivotXType,pivotXValue,pivotYType,pivotYValue);
fromDegrees:從那個角度開始
toDegress:正北偏移量,即我們得到的arr[0]的值
pivotXType:旋轉的參考物,Animation.RELATIVE_TO_SELF參考自身
pivotXValue:這裏指定0.5F,表示當前控件的中間
pivotYType:旋轉的參考物,Animation.RELATIVE_TO_SELF參考自身
pivotYValue:這裏指定0.5F,表示當前控件的中間
設置時長
ra.setDuration(200);
把圖片加到這個動畫效果
iv.startAnimation(ra);
6.在後面還要設置一下fromDegrees,因爲第一次移動的位置是0,偏移是toDegress,移完一次後,圖片位置發生了變化,如果第二次移他的位置0就不表示正北方向了,我們需要把圖片移回-toDegress,這們就又是正北了,然後再移動我們的偏移量所以代碼應該寫成
fromDegrees=-toDegress;
傳感器可以用Sensorsensor=sm.getDefaultSensor(Sensor.TYPE_XXX)得到某一傳感器
關閉應用程序:
如果一個activity調用了finish()的方法就會把activity關閉並移動任務棧
1.創建一個類繼承Application類,一個android的應用程序創建的時候,他首先會把自己的Application創建出來,所以會先執行我們創建的繼承Application的類,創建這個類時會先調用onCreate()方法,這個方法是當應用的進程被創建的時候調用的方法
2.創建一個ArrayList<Activity>的集合,存放的是所以被打開的actiivty.
3.在要打開的activity的onCreate()方法中調用getApplication()方法得到Application,然後調用定義的集合,使用add(this)的方法把當前的activity對象加入到application的創建的集合中
4.在銷燬一個activity的時候調用onDestroy(),在這個方法中調用如下代碼,就可以把當前的activity從application的集合中移除:
MyAppmyapp=(MyApp)getApplication();
if(myApp.activies.contains(this)){
myApp.actives.remove(this);}
5.繼承Application的對象需要在清單文件中去配置,才能加載成功
在AndroidManifest.xml清單文件中找到Application的結點,在name中添加應用程序的名稱
6.然後在程序中定義一個關閉應用程序的按鈕,接下來在代碼中用循環去關閉application中存在的activity對象,調用finish()方法關閉activity對象
別的關閉程序的做法:
就是註冊一個廣播接受者,自定義的廣播接受者,當播放發送一個close的路徑時,每個接收到的activity就會調用finish()方法關閉當前activity
採用html開發andorid程序
可以讓javascript跟android進行通訊,
1,在佈局文件中定義一個WebView組件,展現網頁的控件
2.找到WebView控件
3.webview.loadUrl(url);(這是代碼最後一步)
4.添加一個訪問網絡權限
5.在網頁超連接中有這麼一段代碼:
<aonClick="window,demo,callPhone()"href="">打電話</a>如果要用這段代碼去實現打電話
6.獲取webview的設置
WebSettingssetting=webview.getSettings();
7.允許javaScript執行代碼
setting.setJavaScriptEnabled(true);
8.webview中增加javascript的接口
webview.addjavascriptInterface(obj,interfaceName);
obj:對象,我們就new一個對象newObject(){
//定義方法,就是javascript中定義的方法
publicvoidcallPhone()
{這裏面實現撥打電話的動作}
}
interfaceName:接口名稱就是上面javascript中定義的demo
apache也提供一個工具讓javascript操作android手機,這樣的好處在於如果客戶端的頁面更改了不需要用戶去更新,只要在服務更新就可以了
java代碼調用javascript代碼,如調用javascript中的fillcontent()方法
1.webview.loadUrl(url);這裏的url是javascript方法的地址"javascript:fillcontent()"這個執行必須先執行上面的(在onCreate是運行)
獲取運營商信息
就是得到sim卡的信息,即是得到電話相關的系統服務
1.得到電話服務
TelephonyMangertm=(TelephonyManger)getSystemService(TELEPHONY_SERVICE);
2.可以用getNetworkType()獲取網絡類型,getNetworkOperator()獲取運營商信息
3.getNetworkOperatorName()得到運營商的信息,這個是需要運營商支持的
第一種方法:
獲取手機的IMSI碼,並判斷是中國移動\中國聯通\中國電信
TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
/**獲取SIM卡的IMSI碼
*SIM卡唯一標識:IMSI國際移動用戶識別碼(IMSI:InternationalMobileSubscriberIdentificationNumber)是區別移動用戶的標誌,
*儲存在SIM卡中,可用於區別移動用戶的有效信息。IMSI由MCC、MNC、MSIN組成,其中MCC爲移動國家號碼,由3位數字組成,
*唯一地識別移動客戶所屬的國家,我國爲460;MNC爲網絡id,由2位數字組成,
*用於識別移動客戶所歸屬的移動網絡,中國移動爲00,中國聯通爲01,中國電信爲03;MSIN爲移動客戶識別碼,採用等長11位數字構成。
*唯一地識別國內GSM移動通信網中移動客戶。所以要區分是移動還是聯通,只需取得SIM卡中的MNC字段即可
*/
Stringimsi=telManager.getSubscriberId();
if(imsi!=null){
if(imsi.startsWith("46000")||imsi.startsWith("46002")){//因爲移動網絡編號46000下的IMSI已經用完,所以虛擬了一個46002編號,134/159號段使用了此編號
//中國移動
}elseif(imsi.startsWith("46001")){
//中國聯通
}elseif(imsi.startsWith("46003")){
//中國電信
}
}
第二種方法
TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Stringoperator=telManager.getSimOperator();
if(operator!=null){
if(operator.equals("46000")||operator.equals("46002")){
//中國移動
}elseif(operator.equals("46001")){
//中國聯通
}elseif(operator.equals("46003")){
//中國電信
}
}
在手機data/data/com.android.providers.telephony/database下有一個mmssms.db(信息),telephony.db(手機)的數據庫
反編譯apk
1.apk文件可以重命名一下成rar文件,apk文件實際就是一個rar文件
2.解壓縮文件
3.裏面有一個dex的文件這個是java源代碼編譯成的class文件的打包生成的dex文件,可以用dex2jar-0.0.7.11-SNAPSHOT:的工具,把dex的文件copy在工具目錄中,然後在dos下執行dex2jar.batdex文件名就可以得到一個jar文件
4.jd-gui.exe這個去查看剛纔生成的jar文件的源代碼
5.清單文件跟佈局文件編譯用apktool,用這個工具去查看apk裏面的資源文件,這個apktool包含兩個壓縮包一個是apktool-install-windows-r04-brut1這個是爲windows用戶提供的工具,還有一個是apktool1.4.1這裏面有一個apktool.jar,這個是真正的反編譯的jar包,我們可以把apktool.jar這個jar包放在apktool-install-windows-r04-brut1的文件夾下,在把要反編譯的apk文件也放在這個文件夾下,最後在do的命令行下執行apktooldsms.apk這個d的意思就是反編譯,然後就可以看清單文件跟資源文件了
如果底層用c代碼的話那麼反編譯的難度會增加很多就是用jni,