GVKun编程网logo

使用Android Studio调试系统应用之TvSettings(一):移植(android studio tv)

36

如果您对使用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 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调试

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

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 学习(一)

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的解决办法

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的解决办法等相关内容,可以在本站寻找。

本文标签: