① 如何使用android Studio开发/调试Android自带系统应用
开发调试环境: Ubuntu 14.10,openJdk 1.7,Android Studio 1.0.2,android-5.0.1_r1源码
由于AS是基于IntelliJ IDEA开发的,所以本文也适用于IntelliJ IDEA
一、修改Android Studio(以下简称AS)的内存配置
因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件
并将其作为要使用的SDK的java SDK。如下图
三、生成导入AS所需配置文件(*.ipr)
①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
②检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在,执行:
mmm development/tools/idegen/
在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。
我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。
③执行
development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件
Tips:
AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.
④在AS中打开源码根目录下新生成的android.ipr
如果在导入时AS出现
则建议按照其给定的解决方法来解决(网址:http://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit),具体内容如下图:
四、解决源码中跳转错误问题
①为当前工程设置正确的SDK和JDK
②设置'Moles'的依赖
先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.
如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)
点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:
其它版本的代码在添加frameworks时可能会显示成:
没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.
如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.
五、DEBUG源码
我们可以通过给刚导入的工程在'Moles'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.
可以按照上图中'1'和'2'来添加Android Framework支持.
在代码中加断点,然后选择'Run'->'Attach debugger to Android process'或者直接点击下图所示的图标
在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.
六、其它
代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.
我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。
也可以考虑使用build.gradle来解决该问题。
② android studio怎么新建tabhost
具体如下:以下通过TabHost实现android选项卡。
main.xml布局文件:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayoutandroid:id="@+id/tab01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageViewandroid:id="@+id/iv01"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/andy"/>
<TextViewandroid:id="@+id/tv01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24dip"
android:text="Android的创造者:AndyRubin"/>
</LinearLayout>
<LinearLayoutandroid:id="@+id/tab02"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageViewandroid:id="@+id/iv02"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bill"/>
<TextViewandroid:id="@+id/tv02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24dip"
android:text="Java创造者之一:BillJoy"/>
</LinearLayout>
<LinearLayoutandroid:id="@+id/tab03"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageViewandroid:id="@+id/iv03"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/torvalds"/>
<TextViewandroid:id="@+id/tv03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24dip"
android:text="Linux之父:LinusTorvalds"/>
</LinearLayout>
</LinearLayout>
TabHostActivity类:
packagecom.ljq.activity;
importandroid.app.TabActivity;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.widget.TabHost;
{
privateTabHosttab=null;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
tab=this.getTabHost();
LayoutInflater.from(this).inflate(R.layout.main,tab.getTabContentView(),true);
tab.addTab(tab.newTabSpec("选项卡一").setIndicator("选项卡一",
getResources().getDrawable(R.drawable.png1)).setContent(R.id.tab01));
tab.addTab(tab.newTabSpec("选项卡二").setIndicator("选项卡二",
getResources().getDrawable(R.drawable.png2)).setContent(R.id.tab02));
tab.addTab(tab.newTabSpec("选项卡三").setIndicator("选项卡三",
getResources().getDrawable(R.drawable.png3)).setContent(R.id.tab03));
}
}
现在都使用tablayout和viewpager的布局方式了,例子截图。
关于这个的用法请参考android学习手册,例子、源码、文档全部搞定,采用androidstudo的目录结构,360手机助手中下载。上面是截图。
③ Android studio涓璈TTP鍗忚浠g悊镐庝箞璁剧疆
Android studio镄勬槸璋锋瓕镄勪汉锻樿繘琛屽紑鍙戠殑宸ュ叿锛岄偅涔埚湪浣跨敤镄刟ndroid studio镄勪腑瑕佽繘琛屼笅杞界浉鍏崇殑鍐呭癸纴鏄涓嶈兘鐩存帴杩涜屼笅杞紸ndroid studio镄勫唴瀹癸纴鍙浠ラ氲繃瀵笰ndroid studio镄勪唬鐞呜剧疆涔嫔悗锛屽氨鍙浠ュ笰ndroid studio镄勫悇绉崭笂镄勬彃浠讹纴鐢ㄦ潵涓嬭浇鐩稿叧镄勫唴瀹广
1銆佸笰ndroid studio镄勭浉鍏崇殑浠g悊璁剧疆锛岃剧疆镄勫彲浠ラ氲繃澶氢釜鏂瑰纺杩涜岃剧疆锛屽彲浠ラ氲繃娆㈣繋镄勭晫闱涓璁剧疆锛屾垨钥呮墦寮Android studio涓寮鍙戠殑鐣岄溃涓锛岀劧钖庤繘琛岀偣鍑籄ndroid studio涓凿滃崟涓镄刦ile镄勯夐”銆
2銆佽繘琛岀偣鍑Android studio镄刦ile镄勮彍鍗曚箣钖锛屽氨浼氩脊鍑轰简涓涓涓嬫媺镄勮彍鍗曢夐”涓杩涜岄夋嫨setting镄勯夐”銆
3銆佽繘鍏ュ埌浜唖etting镄勮剧疆镄勭晫闱涓涔嫔悗锛岃繘琛岀偣鍑诲垪琛ㄤ腑镄appearance behavior镄勯夐”銆
4銆佺偣鍑appearance behavior瀹岋纴灏变细灞曞紑杩涜宻ystem setting镄勯夐”涔嫔悗阃夐”鍐呯殑HTTP proxy镄勯夐”銆
5銆佽繘鍏ュ埌浜咹TTP proxy镄勯夐”锛岀浉鍏崇殑榛樿ゆ槸鍏抽棴镄勶纴杩涜屽嬀阃変笂manual proxy configuration镄勯夐”銆
6銆佸浗鍐呯幇鍦ㄦ湁寰埚氱殑闀滃儚镄勭绣鍧镄勪俊鎭锛屽湪锏惧害涓鎼灭储Androiddevtools镄勪俊鎭锛屽彲浠ユ煡镓惧埌鐩稿叧镄勭绣鍧锛屽湪host name涓杈揿叆闀滃儚缃戝潃锛岀偣鍑籓K銆傝繖镙峰氨鍙浠ヨ繘琛屼娇鐢ˋndroid studio涓镟存柊鐩稿叧镄勪笢瑗夸简
④ Android studio TabHost添加了5个tab,每个tab下的EditText点击没有任何反应,不能获得输入焦点
1、安卓下输入框只要不是不可用状态,点击是一定能获得焦点的,你可以检查enable属性
2、可能是获得了焦点没弹输入法,你认为没获得焦点