導航:首頁 > 編程語言 > androidjava源碼

androidjava源碼

發布時間:2022-10-02 08:58:13

android sdk下的java源碼與JDK的Java源碼的區別在哪

Android 使用的Java 庫是Apache的Harmony, 與官方Java庫介面相同,裡面實現不一樣。

就在06年的時候Sun公司宣布會將JDK開源,但是直到2009年4月才正式發布,而Android已經在2008年發布第一步部智能手機了。所以Google最早的時候使用了當時Apache的Java開源實現Harmony項目。


到這個Harmony可是大有來頭,2005年的時候Java並不是開源的,當是Apache搞了一個提案,就是Harmony項目,目標是開發出一個獨
立並且與現有 JDK 兼容的 Java SE 實現,它是開源的並且Apache授權對開發者友好,於是得到了飛速發展。

可惜Sun公司一直不承認Harmony,前不久Harmony那一幫人怒了,給Oracle放狠話說再不承認我我就抵制Java7,結果反倒把Google嚇壞了,於是就出現了google宣布切換到openjdk上這條新聞。

❷ 如何在Android源碼里查找Java中native方法對應的C++實現

在Android源碼里,有許多方法都是使用Jni機制調用底層的C++實現,比如大家都很熟悉的Binder.java里,就有

public static final native int getCallingPid();

public static final native int getCallingUid();

public static final native long clearCallingIdentity();

等方法都是直接調用C++里的實現。

通過下面命令可以很快找到對應的實現,

. build/envsetup

cgrep ./frameworks '"getCallingPid"'

這時會查找到如下結果:

./frameworks/base/core/jni/android_util_Binder.cpp:745: { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid },

這樣就可以知道對應的C++實現方法名字為android_os_Binder_getCallingPid, 在該文件中找這個方法的實現即可。

❸ ubuntu 編譯android源碼 java虛擬機嗎

通過參考網上的相關資料,我編譯Android源碼的步驟如下:
1 我的系統是Ubuntu 8.04
2 系統上必須安裝以下工具(摘自網上的資料):

sudo apt-get install build-essential
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libc6-dev

sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install patch
sudo apt-get install texinfo
sudo apt-get install libncurses-dev

sudo apt-get install git-core gnupg //(gnupg系統可能已自帶)
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
sudo apt-get install ncurses-dev
sudo apt-get install zlib1g-dev
sudo apt-get install valgrind(可選,有21M大,我覺得一般人是用不到的)
sudo apt-get install python2.5 (實際上不用裝,Ubuntu 8.04 已經自帶)
sudo apt-get install sun-java5-jdk

注意:
a. 不要用 sun-java6-jdk, 不然在make sdk, 具體來說是make doc這一步中, 遇到這個錯誤:
Docs droiddoc: out/target/common/docs/dx
javadoc: error - In doclet class DroidDoc, method start has thrown an
exception java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
sun.util.resources.OpenListResourceBundle not found
b. 網上資料說需要設置環境變數, 但我並沒有設置:
export ANDROID_JAVA_HOME=$JAVA_HOME

c. 網上並沒有提及要安裝ncurses-dev, 但安裝之前我編譯過程中會出現編譯錯誤.

3 建立android源碼的存放目錄
$ mkdir ~/open_src
$ mkdir ~/open_src/android
$ cd ~/open_src/android
$ mkdir bi
4 下載repo腳本,放到~/open_src/android/bin目錄下,加上可執行權
$ curl http://android.git.kernel.org/repo > repo
$ sudo mv repo ~/open_src/android/bin
$ sudo chmod a+x ~/open_src/android/bin/repo
5 在源碼存放目錄android中執行
$ ~/open_src/android/bin/repo init -u git://android.git.kernel.org/platform/manifest.git
//中間會提示輸入電子郵件什麼的,如果你打算要提交patch的話,用google accounts注冊過的郵箱

6 在android目錄中執行repo sync就可以開始下載源碼了.
我們也可以從其他地方把源碼復制到android目錄, 而我正是這么做的.
7 編譯源碼, 並得到~/open_src/android/out 目錄
在命令行執行make命令:
$make
這是一個很漫長的過程, 等吧......
8 測試運行
8.1 先設置環境變數:
打開~/.bashrc文件, 並在最後添加下面兩行:
export PATH=$PATH:~/open_src/android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/open_src/android/out/target/proct/generic

8.2 運行模擬器:
emulator --debug-init -skin QVGA-L //可能會提示unknown option: --debug-init, 去掉--debug-init即可
或者直接執行emulator, 這樣使用的是默認的皮膚

如果最後能進入到系統並看到一個大時鍾, 說明就大功告成了.

9 後續編譯:
先在android目錄下執行
$ . build/envsetup.sh
然後你就會多出幾個可用的命令。在改了Contacts聯系人項目後,可以簡單的執行一下命令來單獨編譯這個部分:
$mmm packages/apps/Contacts/
為了可以直接測試改動,需要生成新的system.img,在android目錄下執行:
$ make snod
當然,如果你改動的是emulator或者其它外圍相關的,而非系統內部的東西,就不只是要重新生成system.img了

❹ android源碼放在什麼目錄下面

源碼一般指Java文件,src文件下的.java就是,其他布局代碼在res下的layout文件中

❺ android怎麼修改源碼

1、通過 ubuntu 軟體中心安裝 wine;
2、通過 ubuntu 軟體中心安裝 winetricks;
3、通過 winetricks 在 shell中輸入: winetricks mfc42

1、通過 wine windows 的方式啟動代理伺服器
2、設置瀏覽器代理伺服器
3、設置shell代理伺服器:
在shell中輸入 sudo gedit /etc/bash.bashrc
在文件 /etc/bash.bashrc 中添加

通過shell安裝如下的組件:
1、sudo apt-get install bison g++-multilib git gperf libxml2-utils
2、新建一個存放源碼的目錄,如:mkdir ~/andorid/source
3、在源碼目錄中輸入命令:repo init -u -b android-4.0.1_r1
其中: android-4.0.1_r1是android源碼的版本,更多的版本可以通過下面的方式查詢:

4、修改source/.repo/manifest/default.xml 文件中的 fetch 的值為:
git://Android.git.linaro.org/

通過如下的指令來設置郵箱和用戶名
git config --global user.name "<your name>" ----修改用戶名git config --global user.email "<your email>" ----修改email
5、在source目錄下輸入指令:repo sync
便開始了代碼的下載
方便他人亦是方便自己,如果覺得還行就點下下邊的投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!

❻ 如何閱讀Android應用層源代碼

當閱讀Android原生的應用層源代碼時,當遇到不理解的API時,如果僅憑將API函數放到google的官方API網頁中去搜索的話,不一定合適,可以用eclipse先搜到該函數的定義處,看屬於哪個類,然後再在google的官方API網頁中搜該類,然後找到這個方法,如果該方法還是沒在該類中,那麼可以用eclipse找找該方法是不是繼承與其子類,再從子類中搜搜。

構建開發環境
1、 構建Android編譯環境:
Ubuntu11.10-64bit系統、一系列編譯庫、JDK、Android SDK、Eclipse +ADT。

2、 Android官方原生Android代碼。

3、 源代碼根目錄下:

source build/envsetup.sh
lunch full-eng
make –j4
1、2、3相關內容在http://source.android.com/source/index.html都有相關說明。

4、 編譯Android源碼的同時,可以建立Android源代碼Java工程
(1)將源碼目錄\development\ide\eclipse 中的.classpath復制到源碼根目錄下。
(2)更改eclipse緩存設置
在eclipse安裝根目錄下修改eclipse.ini
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
(3)將 源碼目錄\development\ide\eclipse 中的android-formatting.xml和android.importorder導入eclipse。
android-formatting.xml用來配置eclipse編輯器的代碼風格;android.importorder用來配置eclipse的import的順序和結構。

❼ 如何在Android源碼中加入Java層系統服務

1. 在android/app/目錄下創建介面文件IServiceTest.aidl
package android.app;
oneway interface IServiceTest
{
void show();
}
2. 在Android.mk文件中的變數LOCAL_SRC_FILES中加入core/java/android/app/IServiceTest.aidl
如果要在sdk中發布這個服務就在變數aidl_files中加入一樣的路徑。
3. 通過aidl編譯器編譯IServiceTest.aidl,會生成一個IServiceTest.java文件。
4. 創建服務類ServiceTestSerice
class ServiceTestSerice extends IServiceTest.Stub{
private static final String TAG = 「ServiceTestSerice」;
Context mContext;
public ServiceTestSerice(Context context){
mContext = context;
}
public void show() throws RemoteException {
System.out.println(「My ServiceTestSerice」);
}
}
.5. 注冊服務
Java系統服務在ServerThread類的run()方法中生成並注冊到android平台,生成ServiceTestSerice實例對象,通過ServiceManager的addService方法將服務注冊到系統中。
try{
serviceTestSerice = new ServiceTestSerice(context);
ServiceManager.addService(Context.SERVICE_TEST, serviceTestSerice);
} catch (Throwable t) {

}

ServiceTestSerice serviceTestSerice;
以上代碼在ServerThread類的run()方法中。
在Context類中加入:
public static final StringSERVICE_TEST = 「servicetest」
ServiceTestManager sServiceTestManager;
6. 使用系統服務
編寫一個ServiceTestManager類,為包裝類。
public class ServiceTestManager{
private final IServiceTest mService;

ServiceTestManager(IServiceTest service){
mService = service;
}

public void test(){
try{
mService. show()
} catch (RemoteException ex){

}
}
}
7 提供應用層開發介面
在ContextImpl類中的getSystemService()方法中加入如下代碼:
else if (SERVICE_TEST.equals(name)){
return getServiceTestManager();
}
private ServiceTestManager getServiceTestManager(){
synchronized(sSync) {
if (sServiceTestManager == null){
IBinder b = ServiceManager.getService(SERVICE_TEST);
IServiceTest service = IServiceTest.Stub.asInterface(b);
sServiceTestManager = new ServiceTestManager(service);
}
}
調用過程如下:
ServiceTestManager manager= (ServiceTestManager) getSystemService(Context. SERVICE_TEST);
manager.show();
8. 測試
make
make update-api 更新current.xml文件
生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目錄下,
adb shell
service list

❽ 如何在Android源碼里查找Java中native方法對應的C++實現

知道方法名就知道C++里的函數名了,native方法的函數名是
Java_包名_類名_函數名
開頭的,包名要把.換成_。比如com.xxx.yyy.ClassA.methodB在C++那邊找Java_com_xxx_yyy_ClassA_methodB就行了

❾ 如何編譯android手機源碼

編譯android系統源碼准備工作:
下載android源碼
在windows上用gitbash ,git clone 下載代碼
在linux上這樣下載
創建~/bin目錄,用來存放repo程序,如下:

$ cd ~
$ mkdir bin
初始化repo
repo是android對git的一個封裝,簡化了一些git的操作。
創建工程目錄:
$ mkdir android
$ cd android
下載repo腳本並使其可執行:
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此過程中需要輸入名字和email地址。初始化成功後,會顯示:
repo initialized in /android
在~/android下會有一個.repo的隱藏目錄。
5)同步源代碼
$ repo sync
這一步要很久很久。
安裝linux系統,推薦ubuntu,圖形界面
安裝編譯需要的支持包
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
安裝java6.0
$ sudo apt-get install sun-java6-jdk
配置java環境
sudo gedit ~/.bashrc

末尾加上

JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
sudo source ~/.bashrc
是環境變數生效

編譯android源碼,並得到~/android/out目錄

$ cd ~/andoird
$ make
這一過程很久。
這就編譯結束了

❿ 如何在Android源碼里查找Java中native方法對應的C++實現

android源碼只包含android app java的客戶端代碼。
native部分可能有可能沒有,先全局搜索.c或者.cpp文件,有這些文件才可能有。
如果是標準的android native support 工程,那麼eclipse裡面打開之後,在工程目錄/jni下面就是 native的C++代碼。
Android源碼中很多關鍵代碼都是C++實現的,java通過jni來調用,經常會看到java中這樣的代碼:
static native Thread currentThread();

如何根據方法名找到其對應的C++實現,有兩個方法。
先來個java代碼的示例VMThread.java:

package java.lang;

class VMThread {
Thread thread;
int vmData;

VMThread(Thread t) {
thread = t;
}

native static void create(Thread t, long stackSize);

static native Thread currentThread();
static native boolean interrupted();
static native void sleep (long msec, int nsec) throws InterruptedException;
static native void yield();

native void interrupt();

native boolean isInterrupted();

......
}

我們要查找currentThread方法的實現。
方法一:
由於Android源碼中對每個native實現都會寫一個java方法名和C++方法名映射的列表,所以我們直接搜索這個列表內容即可。
zkw@zkw $ grep -rns '"currentThread"' ./*
./art/compiler/dex/quick/dex_file_method_inliner.cc:108: "currentThread", // kNameCacheCurrentThread
匹配到二進制文件 ./dalvik/vm/native/.java_lang_VMThread.cpp.swp
./dalvik/vm/native/java_lang_VMThread.cpp:241: { "currentThread", "()Ljava/lang/Thread;",
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:407: Method method = Thread.class.getMethod("currentThread");

可以看到,在文件./dalvik/vm/native/java_lang_VMThread.cpp中找到currentThread方法相關的信息,後面()Ljava/lang/Thread代表這個方法的返回值。
進入java_lang_VMThread.cpp這個文件可以看到:

17 /*
18 * java.lang.VMThread
19 */
20 #include "Dalvik.h"
21 #include "native/InternalNativePriv.h"
22
23
24 /*
25 * static void create(Thread t, long stacksize)
26 *
27 * This is eventually called as a result of Thread.start().
28 *
29 * Throws an exception on failure.
30 */
31 static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
32 {
33 Object* threadObj = (Object*) args[0];
34 s8 stackSize = GET_ARG_LONG(args, 1);
35
36 /* ing collector will pin threadObj for us since it was an argument */
37 dvmCreateInterpThread(threadObj, (int) stackSize);
38 RETURN_VOID();
39 }
40
41 /*
42 * static Thread currentThread()
43 */
44 static void Dalvik_java_lang_VMThread_currentThread(const u4* args,
45 JValue* pResult)
46 {
47 UNUSED_PARAMETER(args);
48
49 RETURN_PTR(dvmThreadSelf()->threadObj);
50 }
51

......
237
238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {
239 { "create", "(Ljava/lang/Thread;J)V",
240 Dalvik_java_lang_VMThread_create },
241 { "currentThread", "()Ljava/lang/Thread;",
242 Dalvik_java_lang_VMThread_currentThread },
243 { "getStatus", "()I",
244 Dalvik_java_lang_VMThread_getStatus },
245 { "holdsLock", "(Ljava/lang/Object;)Z",
246 Dalvik_java_lang_VMThread_holdsLock },
247 { "interrupt", "()V",
248 Dalvik_java_lang_VMThread_interrupt },
249 { "interrupted", "()Z",
250 Dalvik_java_lang_VMThread_interrupted },
251 { "isInterrupted", "()Z",
252 Dalvik_java_lang_VMThread_isInterrupted },
253 { "nameChanged", "(Ljava/lang/String;)V",
254 Dalvik_java_lang_VMThread_nameChanged },
255 { "setPriority", "(I)V",
256 Dalvik_java_lang_VMThread_setPriority },
257 { "sleep", "(JI)V",
258 Dalvik_java_lang_VMThread_sleep },
259 { "yield", "()V",
260 Dalvik_java_lang_VMThread_yield },
261 { NULL, NULL, NULL },
262 };

源碼中第242行找到對應的名字,用紅色標出,其實現就在第44行。
這個方法不是很准確,要靠經驗來判斷搜出來的代碼是否是自己要找的,下一個方法可以較准確的查找。
方法二:
還是找VMThread.java的currentThread函數,找多了會發現,C++的名字一般都是包名+類名+方法名,比如currentThread的C++名字就肯定包含「java_lang_VMThread_currentThread」,所以直接搜索即可。
如何在Android源碼里查找Java中native方法對應的C++參考:http://e.51cto.com/course/course_id-4377.html

閱讀全文

與androidjava源碼相關的資料

熱點內容
新電腦管家下載好怎麼解壓 瀏覽:528
php獲取介面數據 瀏覽:763
最後的命令 瀏覽:921
如何添加手機app桌面快捷圖標 瀏覽:427
ui設計師與程序員 瀏覽:417
壽司pdf 瀏覽:828
pythonbg是什麼 瀏覽:248
c數值演算法程序大全 瀏覽:785
android整點報時 瀏覽:221
稀土pdf 瀏覽:536
單片機電子鎖 瀏覽:596
通達信機智資金流指標公式源碼 瀏覽:216
php安裝xsl擴展 瀏覽:842
python如何使用help 瀏覽:367
上汽榮威app在哪裡查詢 瀏覽:903
冰櫃壓縮機溫度108 瀏覽:720
阿里雲郵smtp伺服器地址 瀏覽:252
解壓館認知理解 瀏覽:239
為什麼使用非官方伺服器會封號 瀏覽:9
佛山加密文檔軟體 瀏覽:813