導航:首頁 > 源碼編譯 > action編譯apk

action編譯apk

發布時間:2023-01-21 23:48:28

⑴ 如何反編譯android應用並重新打包

一.看android的源代碼 1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件 2014/02/19 19:42 . 2014/02/19 19:42 .. 2014/02/19 15:35 1,656 AndroidManifest.xml 2014/02/19 15:35 687,024 classes.dex 2014/02/19 15:49 META-INF 2014/02/19 15:49 res 2014/02/19 15:35 2,200 resources.arsc 2)進入到dex2jar目錄中,運行情況如下: D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d ex" this cmd is deprecated, use the d2j-dex2jar if possible dex2jar version: translator-0.0.9.15 dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar Done. 在apk所在的目錄會出現 classes_dex2jar.jar 文件。 3) 用JD-GUI對jar包進行查看,可以查看源文件 二.反編譯apk 1.在下載APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令. 2012/12/06 11:44 854,016 aapt.exe 2014/02/19 17:15 277,372 Apkd.apk//示例用apk文件 2012/12/23 23:39 92 apktool.bat 2013/02/03 02:37 2,655,843 apktool.jar 2.進入到apktool.bat所在的目錄,運行: apktool d Apkd.apk decode_dir 反編譯後,decode_dir目錄下的內容如下: 2014/02/19 17:16 716 AndroidManifest.xml 2014/02/19 17:16 237 apktool.yml 2014/02/19 17:18 build 2014/02/19 17:16 res 2014/02/19 17:16 smali 此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。 三.APKTOOL的使用 1).decode 該命令用於進行反編譯apk文件,一般用法為 apktool d 代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk 代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer 如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令 apktool d –f 這樣就會強行覆蓋已經存在的文件 2).build 該命令用於編譯修改好的文件,一般用法為 apktool b 這里的 就是剛才你反編譯時輸入的 (如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。 3).install-framework 該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題 四.smali與java源碼對照,並做出相應的修改 java源代碼: import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView a = (TextView)this.findViewById(R.id.test) ; a.setText("raoliang"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 對應的smali源代碼: .class public Lali/text/apkd/MainActivity; .super Landroid/app/Activity; .source "MainActivity.java" # direct methods .method public constructor ()V .locals 0 .prologue .line 8 invoke-direct {p0}, Landroid/app/Activity;->()V return-void .end method # virtual methods .method protected onCreate(Landroid/os/Bundle;)V .locals 2 .parameter "savedInstanceState" .prologue .line 12 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 13 const/high16 v1, 0x7f03 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V .line 14 const/high16 v1, 0x7f08 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/TextView; .line 15 .local v0, a:Landroid/widget/TextView; const-string v1, "raoliang" invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V .line 16 return-void .end method .method public onCreateOptionsMenu(Landroid/view/Menu;)Z .locals 2 .parameter "menu" .prologue .line 21 invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater; move-result-object v0 const/high16 v1, 0x7f07 invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V .line 22 const/4 v0, 0x1 return v0 .end method 通過對比可以看到,常量是沒有必變的,可以根據的smali的語法,進行相應的修改 五.3、打包、簽名和安裝修改後的apk 修改完了,就可以打包回apk了。執行以下命令: apktool b decode_dir 在mygame目錄下的dist在會看到打包好的apk。 當然,現在一般是無法安裝的,因為apk還沒有簽名。下面就來簽名。簽名需要keystore文件,我已經有專用的keystore了,如果還沒有,請參閱這里進行生成。 執行以下命令為重新編譯的my_game.apk簽名: jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 最後,在安裝到手機前,需要把手機中的已有版本先卸載,因為如果簽名不同,是不能覆蓋安裝的,會提示「應用程序未安裝」錯誤。 完整的運行情況如下: D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore 輸入keystore密碼: 再次輸入新密碼: 您的名字與姓氏是什麼? [Unknown]: rao 您的組織單位名稱是什麼? [Unknown]: rao 您的組織名稱是什麼? [Unknown]: 您所在的城市或區域名稱是什麼? [Unknown]: 您所在的州或省份名稱是什麼? [Unknown]: 該單位的兩字母國家代碼是什麼 [Unknown]: CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎? [否]: y 輸入的主密碼 (如果和 keystore 密碼相同,按回車): D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 輸入密鑰庫的口令短語: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/DEMO_KEY.SF 正在添加: META-INF/DEMO_KEY.RSA 正在簽名: res/drawable-hdpi/ic_launcher.png 正在簽名: res/drawable-mdpi/ic_launcher.png 正在簽名: res/drawable-xhdpi/ic_launcher.png 正在簽名: res/drawable-xxhdpi/ic_launcher.png 正在簽名: res/layout/activity_main.xml 正在簽名: res/menu/main.xml 正在簽名: AndroidManifest.xml 正在簽名: classes.dex 正在簽名: resources.arsc D:\developer\tools\test_apk\new\decode\dist> 到此為止,修改後的apk可以正常的安裝了,不過,在安裝之前,必須要先卸載以前的apk,不能直接替換(因為簽名不一樣)

⑵ unity 導出安卓工程怎麼編譯成apk

1.Android端代碼可以在Eclipse中開發(AndroidStudio沒有試,應該也可以)

2.Unity3D端代碼要在Unity中開發

3.Android和Unity3D端,兩邊都需要加入一些代碼從而可以使之關聯交互。

4.將Android端代碼編譯成jar文件以插件形式放入到Unity端中

5.在Unity中將整個項目Build成apk文件,然後安裝到手機或模擬器里運行

本文主要講解1,2,3。對於4,5建議大家去看雨松MOMO的Unity博客的第17篇和第18篇。

UnityPlay:

在編寫Android端和Unity3d端代碼前,有必要先了解一下可以使兩部分交互的類UnityPlay。

個人理解UnityPlay是個Unity提供給外部交互的一個介面類。

為什麼是「個人理解」?這我不得不爆粗口了,TMD官網根本就沒有相關的API和文檔(如果大家有誰找到一定給我來一份,就當我罵自己了)。

在關聯Android時,想拿到UnityPlay以及相關類的jar包可以從下面的地址找到:Unity安裝路徑\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夾下有一個classes.jar的jar文件,它就是我們想要的。

而在bin同目錄下有一個src文件,點擊到最後有3個類,分別是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前兩個打開個後只有一行代碼,說的是UnityPlayerActivity和UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity。而打開UnityPlayerNativeActivity中居然有代碼,而且我估計這應該是UnityPlayerNativeActivity的源碼。

由於關於UnityPlay的資料我只找到這么一個,所以我把UnityPlayerNativeActivity中的代碼都貼出來,如果我註解有不對的地方希望大家指正。

/**
* UnityPlayerActivity,UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity繼承自NativeActivity
* 在該類里定義了一些和ANDROID生命周期相同的回調方法,留給自定義的Activity子類重寫。
*/
public class UnityPlayerNativeActivity extends NativeActivity
{
//UnityPlayer的引用,並且我們不能改變這個引用變數的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;

protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 設置顯示窗口參數
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);

// 創建一個UnityPlayer對象,並賦值給全局的引用變數
mUnityPlayer = new UnityPlayer(this);
//為UnityPlayer設置一些參數
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在將view附加到layout之前調用。它將會調用native code
mUnityPlayer.init(glesMode, trueColor8888);

// 從UnityPlayer中獲取到Unity的View視圖
View playerView = mUnityPlayer.getView();
// 將Unity視圖載入到根視圖上
setContentView(playerView);
// 使Unity視圖獲取焦點
playerView.requestFocus();
}
protected void onDestroy ()
{
// 當Activity結束的時候調用UnityPlayer.quit()方法,它會卸載之前調用的native code
mUnityPlayer.quit();
super.onDestroy();
}

// 下面幾個方法都是ANDROID相關回調方法,確保在ANDROID執行相應方法時UnityPlayer也需調用相應方法
protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}

public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
}
}

⑶ 如何編譯android launcher

注意前提條件是具備下面事項,需要系統級別的許可權

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rtkj.switchlauncher"
android:sharedUserId="android.uid.systemui"

<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />

可以導出Apk文件放到系統的system/app目錄下面去編譯

第一種方式 : 清理Launcher的默認設置的 默認值相當於在設置->應用程序->管理應用程序->所有應用程序列表,找到之前設置的
默認Launcher,並取消了默認值,系統會重新彈出launcher選擇框。

private void clearDefaultValues(String packageName) {
getPackageManager().(packageName);

}

第二種方式: 通過pm進行 清理 後添加 或者是替換當前的 ,這里顯示的是兩個Launcher的替換

view plain

private void setDefaultHome(String packeageName ,String className,String oldPackage,String oldName) {
PackageManager pm = getPackageManager();
IntentFilter f = new IntentFilter();
f.addAction(Intent.ACTION_MAIN);
f.addCategory(Intent.CATEGORY_HOME);
f.addCategory(Intent.CATEGORY_DEFAULT);
ComponentName component = new ComponentName(packeageName,className );
ComponentName[] components = new ComponentName[] {new ComponentName(oldPackage,oldName),component};

<span style="color:#FF0000;">pm.(oldPackage);</span>// 清理配置的默認信息
pm.addPreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, components, component);//添加
<span style="color:#FF0000;">//pm.replacePreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, components, component);</span> //替換

}

view plain

//存在多個以上的Launcher的時候
private void setDefaultLauncher() {
// remove this activity from the package manager.
PackageManager pm = getPackageManager();

String examplePackageName = "com.jeejen.family"; //請修改為需要設置的 package name
String exampleActivityName = "com.jeejen.home.launcher.Launcher"; //請修改為需要設置的 launcher activity name

ComponentName defaultLauncher = null;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);

List<ResolveInfo> resolveInfoList =
pm.queryIntentActivities(intent, 0);
if (resolveInfoList != null) {
int size = resolveInfoList.size();
for (int j = 0; j < size; ) {
final ResolveInfo r = resolveInfoList.get(j);
if (!r.activityInfo.packageName.equals(examplePackageName)) {
resolveInfoList.remove(j);
size -= 1;
} else {
j++;
}
}
ComponentName[] set = new ComponentName[size];
defaultLauncher = new ComponentName(examplePackageName, exampleActivityName);
int defaultMatch = 0;
for (int i = 0; i < size; i++) {
final ResolveInfo resolveInfo =
resolveInfoList.get(i);
set[i] = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
if (defaultLauncher.getClassName().equals(resolveInfo.activityInfo.name)) {
defaultMatch = resolveInfo.match;
}
}
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

pm.(defaultLauncher.getPackageName());
pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
}
}

切換後啟動當前的Launcher,
view plain

public void startMainLauncher(){
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
}

⑷ 怎樣把反編譯的apk文件在eclipse中打開

那要看你反編譯的程度了。apk反編譯有兩部分,一部分是res等xml資源文件。用android 的apktool就可以了。這些xml文件都可以在eclipse中直接打開。
dex文件(源代碼)需要使用dex2jar工具轉化成jar文件。jar文件可以在eclipse查看其結構。對.class文件,eclipse可以查看方法,內部類等信息。
如果對Jar也進行了反編譯,那麼得到的就是Java文件。在eclipse中,可以像你new 的class一樣查看。

⑸ APK包名修改 請問如何修改APK包名

基本過程如下:
1、將apk解包成一個文件夾
2、修改AndroidManifest.xml中對應的包名
3、修改smali目錄下中的包
4、將文件夾打包成apk
5、將apk重新簽名
6、驗證apk的簽名
7、優化apk
8、安裝apk,並測試
基本前提條件:
1、java的環境
2、Eclipse及android的開發環境(這個主要是用來進行調試)
3、text文本編輯器,本人用的是UEdit,也可以用類似的,主要是利用其查找及替換功能
這篇文章主要用來反編譯apk得到源碼,但google進行了反制,只能得到一些可讀性不高的源碼,這里主要是利用反編譯apk生成程序的源代碼和圖片、XML配置、語言資源等文件.
參考文獻里提到的apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip均可以從http//code.google.com/p/android-apktool/上下載,下載好之後,將涉及的命令行目錄及exe目錄添加到電腦的path路徑中,這樣就便於操作了,如檢測apktool是否可以,可以在命令行中輸入apktool,如果可以識別就表示OK了。
參考了國內的技術文章後,有人發帖以上面的思路進行操作,但沒有發技術文章,所以筆者只能去國外論壇中逛逛了,在Stack Overflow中,找到了相關的帖子,有老外留言"you can't do this",這個的確有違技術道德,但這里只做學習參考或交流。找到了一片帖子http://stackoverflow.com/questions/9218641/renaming-the-package-name-inside-an-apk,這篇帖子的回答給了比較詳細的步驟(如上),他的情況比這個還稍微復雜點,簡化後就是我要的結果,我就是按照這個基本步驟來的,回答的英文比較好懂(很有可能是國人)。
下面就按照上面的步驟一步步操作:我是已QQ瀏覽器4.0版的apk來操作的。
1、我的apktool安裝到了E盤下的apktool目錄下,所以的操作也在這個目錄下進行 E:\apkTool
將apk復制到E:\apkTool目錄下,重命名為qq4.0.apk(這個沒有要求,隨意就好)
將apk解包 命令行下cd到E:\apkTool這個目錄 apktool d qq4.o.apk qq4 將apk解包到qq4(這個也可以隨意)這個目錄
E:\apkTool\qq4這個目錄下內容如下:

2、修改AndroidManifest.xml中的包名,
將package後面的包名com.tencent.qbx改為你想要的新包名,我改為了com.tianxiao.tencentweb
將涉及原包名的com.tencent.qbx的相關activity的聲明中的包名均改為新包名com.tianxiao.tencentweb
至於intent-filter裡面的action名中包含原包名的,則可以不改,如果改的話,代碼中也要相應的改變
另外,如果有provider,provider的authorities也得改,這個在同一手機上必須唯一,否則安裝會失敗
3、在E:\apkTool\qq4\smali目錄下,有很多子目錄,子目錄下的文件多以smali結尾,這中文件的語法有點類似於匯編語言,具體原理就不深究了。
將smali目錄下的所有文件中的原包名的聲明形式com/tencent/qbx改為新包名com/tianxiao/tencentweb
具體如下,用UEdit在文件中替換即可,將目標目錄指向E:\apkTool\qq4\smali,這個將近1000條左右
如果之前改為action裡面的包名,也要將字元串形式的包名com.tencent.qbx改為com.tianxiao.tencentweb
如果有provider也要講原來的authorities值改為在AndroidManifest.xml中新改的authorities值。
4、將E:\apkTool\qq4重新打包為apk
apktool b qq4 newqq.apk
5、將新的newqq.apk 重新簽名
簽名的方法很多,一主要是手動生成簽名,用命令行簽名
我採用的現成的,下載了一個Auto-sign的文件夾,進行了簽名,這個比較簡單,網上帖子很多,就不贅述。
新簽名後的apk名為 newqq4signed.apk
6、驗證簽名 是否正確
jarsigner -verify -verbose -certs newqq4signed.apk
一般來說,沒問題,略過
7、優化apk
zipalign -v 4 newqq4signed.apk latestqq.apk 優化過的apk名為latestqq.apk
8、安裝新的apk,驗證是否成功
這個最好把Eclipse打開,手機連上,查看logcat的安裝信息。
我嘗試了3次才成功,主要是忘了 provider的authorities的處理,
出錯信息如下: Can't install because provider name qbx_bookmarks (in package com.tianxiao.tencentweb) is already used by com.tencent.qbx
原因很清楚,所以debug還是相當給力的,原來不喜歡debug,看debug過程可以更好的了解執行過程。

⑹ 如何在android 源碼提取一個完整的apk

一、工具准備:apktool , dex2jar , jd-gui
二、使用dex2jar + jd-gui 得到apk的java源碼
1.用解壓工具從 apk包中取出 classes.dex 文件
用命令(dex2jar.bat classes.dex)得到一個 jar文件
2.用jd-gui反編譯工具將得到.jar文件反編譯成.java文件
三、使用apktool得到apk的xml文件
1.用命令(apktool d xxx.apk xxx_xml)反編譯xxx.apk包
2.從 xxx_xml 文件夾得到xml文件
四、第二步 得到的程序源代碼 和 第三步 得到的xml文件組合下,即可得到完整的apk源碼。
五、應用: 漢化/去廣告,加 values-zh-rCN, values-zh-rTW, values-de, values-fr
1.在步驟三的文件夾xxx_xml/res/ 下, 建文件夾: values-zh-rCN,values-zh-rTW
2.1復制values\strings.xml 到 values-zh-rCN 並翻譯.
2.2 去廣告見;
3.重建APK,用命令(apktool b xxx) ,輸出到ABC/dist/out.apk
或命令( apktool b xxx out.apk)
六、重新打包 和 簽名

⑺ apk入口在哪裡

android應用程序(apk)沒有固定的入口點,系統會根據各個程序的manifest設定,在發生指定事件的時候調用程序的指定位置。
如果你說的入口點是傳統上認為的main函數,那麼在android應用程序裡面,相對應的就是在manifest裡面用intent-filter設定了會處理main action的那個activity。
(7)action編譯apk擴展閱讀:
APK(全稱:Android application package,Android應用程序包)是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是「APK」。 一個APK文件內包含被編譯的代碼文件(.dex 文件),文件資源(resources), 原生資源文件(assets),證書(certificates),和清單文件(manifest file)。
APK 文件基於 ZIP 文件格式,它與JAR文件的構造方式相似,互聯網媒體類型是:application/vnd.android.package-archive。
介紹
APK是Android application package的縮寫,即Android安裝包(apk)。APK是類似SymbianSis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。[2]
apk文件和sis一樣,把androidsdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但後綴名被修改為apk,通過UnZip解壓後,可以看到Dex文件,Dex是DalvikVM executes的簡稱,即Android Dalvik執行程序,並非Java ME的位元組碼而是Dalvik位元組碼。Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接,但不同於Windows mobile中的PE文件,程序的保密性和可靠性不是很高,通過dexmp命令可以反編譯它,但這種架構符合發展規律,微軟的WindowsGadgets(WPF)也採用了這種架構方式。在Android平台中,dalvikvm的執行文件被打包為apk格式,最終運行時載入器會先解壓,然後獲取編譯後的androidmanifest.xml文件中的permission聲明對安全訪問的限制,要知道仍然存在很多安全限制,但將apk文件傳到/system/app文件夾下會發現執行是不受限制的。也許我們平時安裝都不會選用這個文件夾,但在androidrom中,系統的apk文件默認會放入這個文件夾,它們擁有root許可權。

閱讀全文

與action編譯apk相關的資料

熱點內容
打開其它app微信怎麼收不到 瀏覽:443
安卓游戲耳機怎麼戴 瀏覽:14
不越獄怎麼去除app廣告 瀏覽:174
ipadminipdf閱讀 瀏覽:504
文件夾無限制壓縮會不會降低內存 瀏覽:410
榮耀怎樣創建文件夾 瀏覽:629
如何用本機登陸遠程伺服器地址 瀏覽:680
黃小鴨解壓文具盒 瀏覽:670
女程序員的轉行方法 瀏覽:881
東風啟辰車聯網安裝文件夾 瀏覽:524
華為怎麼設置app時間鎖 瀏覽:660
後宮app視頻怎麼下載 瀏覽:525
如何把圖片轉換從PDF格式 瀏覽:259
重寫和重載的區別java 瀏覽:234
expressvpnandroid 瀏覽:84
儲存卡被加密怎麼解除 瀏覽:169
地球怎麼壓縮直徑 瀏覽:780
金鏟鏟之戰伺服器爆滿怎麼進 瀏覽:160
同仁堂pdf 瀏覽:935
如何編譯原理課程教材 瀏覽:730