1.目录结构
idea可以直接创建android项目
app目录内容:
app > src > main > java > com.example.myfirstapp > MainActivity
这是主 activity。它是应用的入口点。当您构建和运行应用时,系统会启动此 Activity 的实例并加载其布局。
app > src > main > java > androidTest
编写安卓测试
app > src > main > res > layout > activity_main.xml
此 XML 文件定义了 activity 界面 (UI) 的布局。它包含一个 TextView 元素,其中具有“Hello, World!”文本
app > manifests > AndroidManifest.xml
清单文件描述了应用的基本特性并定义了每个应用组件。
app > lib
导入外部jar包的目录
app > res
资源文件
drawable一般是放图片的
layout一般放布局文件
mipmap一般放图标
values:颜色,风格等
app > test
单元测试
gradle(构建器)目录:
wrapper下的内容是gradle的jar包
app > build.gradle(app的gradle构建脚本)
build.gradle(全局的gradle构建脚本):
有两个使用此名称的文件:一个针对项目“Project: My First App”,另一个针对应用模块“Module: My_First_App.app”。每个模块均有自己的 build.gradle 文件,但此项目当前仅有一个模块。使用每个模块的 build.gradle 文件控制 Gradle 插件构建应用的方式。如需详细了解此文件,请参阅配置 build。
gradle.properties:gradle配置文件
gradlew:运行的指令
local.properties:sdk路径
setting.gradle
2.控件
2.1 TestView(文字控件)(作用是打印文字)
MainActivity.java的内容:
1 | package com.example.myapplication2; |
R.layout.activity_main指向的是res > layout > activity_main.xml
修改这里就可以做到修改app的布局
1 |
其中LinearLayout是容器,TextView是控件
先从控件开始
全部属性:https://blog.csdn.net/xxlyzgt/article/details/80596980
其中比较重要的:
1 | android:id |
android:layout_width和android:layout_height控制的是控件的大小,可用参数:
1.fill_parent(弃用)
2.match_parent(value=-1):根据容器(LinearLayout)的宽(长)度来取宽(长)度
3.wrap_content(value=-2)
4.准确大小,例:200dp
android:id
让java代码可以获取控件
如设置android:id="@+id/tv_one"
那么MainActivity.java获取这个控件
1 | package com.example.myapplication2; |
android:text=””:设置文本内容(和setText的功能差不多)
运行时会先打印android:text,然后setText会将其覆盖
可以直接写内容,比如android:text="123"
或者写路径android:text="@string/tv_one"
,然后在values下的strings.xml中写<string name="app_name">123</string>
android:textColor:设置颜色
例:android:textColor=#FF000000
一共八位
FF:透明度(00是全透明,FF是不透明)
后面三位分别是rbg三色
android:textStyle:设置字体
android:textSize:设置字体大小
android:background:设置北京,可以是颜色或图片路径
android:grivity:设置放在整个app的哪里(中间:center,右:right,底:bottom等)
2.2 button控件(按钮)
Button常用属性
1 | android:drawable //放一个drawable资源 |
Button的状态
1 | android:state_pressed //是否按下,如一个按钮触摸或者点击。 |
在res > drawable下new一个btn_select.xml文件
1 | <?xml version="1.0" encoding="utf-8"?> |
按下是ic_android_black_24dp文件,松开是ic_android_black_24dp1文件
activity_main.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
事件处理:
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
按下事件是“松开”
长按就是“长按”
触摸事件包括鼠标“按下”,“移动”,“松开”
相当于是onClick()调用onLongClick()调用onTouch()
每次鼠标进行一个操作(“按下”,“移动”,“松开”),先判断是否执行onTouch(),若返回值为false则判断是否执行onLongClick(),返回值为true则onLongClick()直接不执行返回true,onLongClick()返回值为false则判断是否执行onTouch(),onLongClick()返回值为true则直接不执行onTouch()
2.3 EditText(输入框)
1 | android:hint 输入提示 |
结合按钮进行输入读取:
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
2.4 ImageView(图片)
1 | android:src 设置图片资源 |
在res > drawable创建scr.jpg
1 | <?xml version="1.0" encoding="utf-8"?> |
2.5 ProgressBar(进度条)
1 | android:max 显示进度条最大值 |
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
水平进度条:
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
事实证明那些进度条可能真的只是动画,前面慢放,检测到完成后直接改成100
2.6 Notification(通知)(相当于手机顶上的弹窗和提示)
channelID:android8.0引入的通知渠道,其允许为要显示的每种通知类型创建用户可自定义的渠道
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
2.7 Toolbar
原来的values > themes.xml
1 | <resources xmlns:tools="http://schemas.android.com/tools"> |
这种情况app上面会有一个名称栏
把parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge"
改成parent="Theme.MaterialComponents.DayNight.NoActionBar"
之后就没有了
然后可以用Toolbar自己设置一个
1 | <?xml version="1.0" encoding="utf-8"?> |
2.8 AlertDialog(相当于app内的弹窗功能)
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | package com.example.myapplication2; |
2.9 PopupWindow
数据存储:
1.内部存储和外部存储
(1)内部存储
路径:data > data下会生成一个包名(比如我的是com.example.myapplication2)
这个包就是这个应用的内部存储
相当于这个app本身
分为SP,SQLIte,Room
SP:配置信息
SQLIte,Room:数据库
(2)外部存储
路径:storage > emulated > 0 > Android > data > com.example.myapplication2
文件操作,例:
1 | 优先外部存贮 |
android:
1 | //外部: |
unity:(抽时间验证一下)
https://blog.csdn.net/ynnmnm/article/details/52253674
1 | Application.dataPath /data/app/package name-1/base.apk |
安卓解包:
1.纯android开发/unity导出包后由android进行整合
可以用jeb直接拆包,找到mainactivity.java(不一定叫这个名,看设置),然后主界面布局在layout下的xml文件,一般会被mainactivity.java引用
2.unity开发/android导出包由unity整合(后者不常见)
拆出来的java文件都是配置文件,看了没意义(放木马之类的时候有意义)
特点是(以下其中之一)
(1)assets文件下的bin文件下有Assembly-CSharp.dll文件,就是程序的主函数
(2)lib文件下有il2cpp.so和global-metadata.dat文件
如果是(2),就用il2cppdumper导出Assembly-CSharp.dll,然后用ILSky打开(或者直接用sublime开dump.cs,我更喜欢这种方法),但是这里的文件只有函数名和对应的地址,并没有函数的内容,所以用ida导入il2cpp.so,从ILSky上复制地址在ida里看内容