如果您对使用AndroidStudio调试系统应用之TvSettings和一:移植感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解使用AndroidStudio调试系统应用之TvSettings
如果您对使用Android Studio调试系统应用之TvSettings和一:移植感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解使用Android Studio调试系统应用之TvSettings的各种细节,并对一:移植进行深入的分析,此外还有关于Android Stadio调试gradle 插件 || Android Stadio 远程调试 || Anroid APT调试、Android Studio & SDK & JDK & setting path、Android Studio 学习(一)、Android Studio 打不开Module Settings的解决办法的实用技巧。
本文目录一览:- 使用Android Studio调试系统应用之TvSettings(一):移植(android studio tv)
- Android Stadio调试gradle 插件 || Android Stadio 远程调试 || Anroid APT调试
- Android Studio & SDK & JDK & setting path
- Android Studio 学习(一)
- Android Studio 打不开Module Settings的解决办法
使用Android Studio调试系统应用之TvSettings(一):移植(android studio tv)
使用Android Studio调试系统应用之Settings(一):移植
前言
对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 aosp 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑!
备注:aosp 源码即android系统源码,当前最新版本为android 12.0(S)。
基本思路
- 获取Settings源码
- 分析App的Android.mk文件
- 使用AS新建一个同名项目
- 将src和res文件复制到项目中
- 添加依赖
- 解决编译错误
- 安装调试
- 大功告成
调试平台
- 软件版本:android P(9.0)
- 开发板:联发科9652(ARM)
- 产品:android智能电视
- 备注:你也可以使用自己的手机或者android模拟器,方法是一样的。
获取App源码
- aosp_tv\packages\apps\Settings (手机版本)
- aosp_tv\vendor\mediatek\pro
Android Stadio调试gradle 插件 || Android Stadio 远程调试 || Anroid APT调试
有时候,自己开发了gralde插件,想调试一下。毕竟打印log 成本太高。效率太低。怎么做呢?
第一种方法:
1。执行gradlew 命令的时候,加上几个参数:-Dorg.gradle.debug=true --no-daemon
比如:gradlew clean -Dorg.gradle.debug=true --no-daemon
这样就会出现下面这种情况:
他会等着你去调试。
然后
然后点击+号,新建一个remote,之后直接点击ok 就可以了。:
最后调试进程
就发现程序开始执行,然后你打的断点就可以调试了。
第二种:在系统环境变量里面添加:
GRADLE_OPTS
值为:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
然后你会发现,每次运行所有的gradle 都会执行调试,所以这种方法我不推荐。如果你设置了没生效,那么请重启的inteji。因为配置的环境变量没有生效。你可以打印出来看下:
比如我这里gradle.bat 里面,打印这个系统变量。没重启之前是空的字符串,重启之后就有了值。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
ok,学到了很多。gradlew.bat 文件我都改了。我都配置自己。加油,感谢下面的博客同志。
参考博客:
第三种:
如果你是windows ,那么直接把这个gradlew.bat文件copy 过去就可以了。
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no ''java'' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
::"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% -Dorg.gradle.debug=true --no-daemon
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
Android Studio & SDK & JDK & setting path
Android Studio & SDK & JDK & setting path
https://developer.android.com/studio/intro/update https://developer.android.com/studio/intro/studio-config
Android Studio 代理
https://developer.android.com/studio/intro/studio-config#proxy
JDK
https://developer.android.com/studio/intro/studio-config#jdk
method 1
Android Studio 3.3.2
Android Studio 3.3.2
Build #AI-182.5107.16.33.5314842, built on February 16, 2019
JRE: 1.8.0_152-release-1248-b01 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
https://stackoverflow.com/questions/16581752/android-studio-how-to-change-android-sdk-path
https://stackoverflow.com/a/18409923/5934465
method 2
method 3
Open JDK 8
jdk 8 下载, 为什么要登陆
https://developers.redhat.com/products/openjdk/overview/
https://www.v2ex.com/t/557159
Android Studio 学习(一)
##XML 给元素定义 ID
- 定义 id android:id="@+id/button_1"
- 引用 id
id/id_name
## 解决 Failed to load Appcompat Actionbar with unknown error
- 在 Project 中找到 \app\src\main\res\values\styles.xml
- 更改
<style name="AppTheme" parent="Theme.Appcompat.Light.DarkActionBar">
为<style name="AppTheme" parent="Base.Theme.Appcompat.Light.DarkActionBar">
## 在 AndroidManifest.xml 文件注册活动为主活动 <activity android:name=".FirstActivity" android:label="This is FirstActivity"//项目的标题> <intent -filter> <action android:name="android.intent.action.Main"/>//主活动 <category android:name="android.intent.category.LAUNCHER"/>//首先启动这个活动 <i/intent-filter> </activity>
## 在布局中添加按钮 <Button android:id="@+id/button_1"//代码中指定的名字 android:layout_width="match_parent" android:layout_height="wrap_content"//高度随内容而变 android:text="Button1" />
## 在主活动上 配置按钮的点击事件 Button button1=(Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener()) { @Override public void onClick(View v) { } }
##Toast 小提醒 Toast.makeText(FirstActivity.this,"text",Toast.LENGTH_SHORT/LENGTH_LONG).show();
## 菜单 `res->menu->main (Menu resource file)
<menu xmln:..> <item android:id="@+id/add_item" android:title="Add"/> // 菜单选项名字 </menu>`
ctrl+o 重写 onCreateOptionsMenu () 方法
public boolean onCreateOptionsMenu (Menu menu) { getMenuInflater().inflate(R.menu.main,menu); return true; }//显示菜单
重写 onOptinsItemSelected 方法 public boolean onOptionsItemSeleted { swith (item.getItemId()) { switch(item.getItemId()) { case R.id.add_item: Toast.makeText(this,"you clicked add",Toast.LENGTH_SHORT).show(); break; } return true; } }
## 摧毁一个活动 finish ();
## 使用 intent 切换活动
-
显式切换
Intent intent =new Intent(FirstActivity.this ,SecondActivity.class); startActivity(intent);
-
隐式切换
-
Intent intent =new Intent ("com.example.activitytest.ACTION_START");
-
intent.addCategory("com.example.activitytest.MY_CATEGORY");
-
stratActivity (intent);// 默认 category <intent -filter> <action android:name="com/example.activity.ACTION_START"> <category android:name="android.intent.category.DEFAULT">
</intent-filter>
## 向下一个活动传递数据
-
Intent intent=new Intent(FirstActivity.this ,SecondActivity.class);
-
intent.putExtra("extra_data",data)
-
Intent intent=getIntent();
-
String data=intent.getStringExtra(''extar_data'');
## 返回数据给上一个活动
#### 在第一个活动中
-
Intent intent =new Intent (FirstActivity.this,SecondActivity.class);
-
startActivityForResult (intent,1)//1 为请求码
-
switch (requestCode){// 重写 onActivityResult 方法 case 1: if (resultCode==RESULT_OK) { String returnedData=data.getStringExtra ("data_return"); } }
#### 在第二个活动中 按钮退出
- Intent intent=new intent();
- intent.putExtra("data_return","Hello Fiffff..")
- setResult (RESULT_OK,intent)// 对应上面的 forresult 方法 第一个参数两个值 RESULT_CANCELED
- finash();‘
back 退出 重写 onBackPressde()方法 内容与上面一样
## 按钮排列 bug
- The layout editor allows you to place widgets anywhere on the canvas, and it records the current position with designtime attributes (such as layout_editor_absoluteX.) These attributes are not applied at runtime。
- 点击这个 infer constraints
## 活动回收栈 保存临时数据
-
重写 onSaveInstanceState () 方法
-
outState.putString("data_key",tempData);
-
在 onCreate 方法中有
-
if (savedInstanceState!=null) { String tempData=savedInstanceState.getString("data_key"); }
## 活动的启动模式
- 四种 standard singleTop singleTask singleInstance
- 在 mainfest.xml 中注册 android:launchMode="singleTop"
- standard 每次启动都会创建一个新的活动
- singleTop 在栈顶时创建不会创建新的 而是直接用当前的 不在栈顶时创建新的
- singleTask 有活动时 这个活动之上的活动都出栈 没有活动时直接创建
- singleInstance 这个活动会创建新的栈
## 启动活动的最佳写法 p74
Android Studio 打不开Module Settings的解决办法
从eclipse切换到Android Studio时,将SDK也带过来了
Android Studio v1.3版本之后就打不开Module Settings,其原因是SDK之前已经下载过Google API了,和Android Studio的引入Google API的方式有冲突,所以导致报错
只要将SDK中Google API全部删除就可以了,解决如下
图中我的Google APIs已经全部删除,所以是Not Installed
删除后,确认下所有的Google APIs是否已经变成 Not Installed状态,检查是否有未删除干净的
关于使用Android Studio调试系统应用之TvSettings和一:移植的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android Stadio调试gradle 插件 || Android Stadio 远程调试 || Anroid APT调试、Android Studio & SDK & JDK & setting path、Android Studio 学习(一)、Android Studio 打不开Module Settings的解决办法等相关内容,可以在本站寻找。
本文标签: