androidstudioclass
‘壹’ Android Studio 3.5导入AOSP编译的classes.jar
一、适用场景
我们在写应用时可能会需要调用系统隐藏的API,这些API是我们无法直接访问的,报如下错误:
此时,我们需要将系统AOSP的out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar导入到Android Studio中,使app能够访问这些接口。
二、实现步骤
Step1 . 在app目录下建立libs文件夹,并将classes.jar包放入该路径
Step2 .在app目录上右键【Open Mole Settings】,点击左侧【Dependencies】,选择app,点击【+】选择【2 Jar Dependency】,添加
选择我们的libs/classes.jar,点击【OK】
Step3 .在Mole的build.gradle中,dependencies自动增加依赖配置,注释掉下面一行
implementation fileTree(dir: 'libs', include: ['*.jar'])
并将implementation files('libs/classes.jar')改为
compileOnly files('libs/classes.jar')
最终如下图所示
Step4 .修改Project的build.gradle,在allProjects中增加如下语句
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\classes.jar')
}
}
Step5 .修改jar包优先级,在Moels的app.iml文件中找到我们的classes.jar包所在行,
<orderEntry type="library" name="Gradle: __local_aars__:/Users/mrwong/AndroidStudioProjects/uart_daemon/app/libs/classes.jar:unspecified@jar" level="project" />
将其移动到
<orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
这一行之上,最终如下图所示:
至此,app可以优先访问我们自己的jar包 。
‘贰’ android studio 怎么创建一个新的类
例我原AndroidGraphics2DTutorial改名AndroidGra
1
phics2DTutorial1重新创建类AndroidGraphics2DTutorial显示示例列表打算使用三View显示列表项图标(例随机使用些图
标)文本框显示示例Activity名称另文本框显示示例具体信息res\layout目录创建
activitylist.xml内容:
图" class="illustration_alink">
我AndroidManifest.xml读取Activity列表使用String
Array资源res\value\string.xml 添加列Array资源:
<string-array name=activity_name> <item>Bezier</item> <item>Brush</item> <item>Colors</item> <item>Font</item> <item>Image</item> <item>Path</item> <item>Pen</item> <item>Shape</item> <item>Transform</item> </string-array> <string-array name=activity_info> <item>Bezier</item> <item>Pattern ,Gradients</item> <item>Colors</item> <item>FontDemo, FontTypes</item> <item>DrawMap, JumbleImage, SeeThroughImage</item> <item>Polys, Paths</item> <item>Lines, Dashes, LineCap,LineJoin</item> <item>Oval ,Pear ,Shape2DDemo</item> <item>Transform</item> </string-array>
定义些资源程序使用自定义Adapter显示列表:
class ActivityInfo{ int iconIndex; String activityName; String activityInfo; } class ActivityInfoAdapter extends ArrayAdapter<ActivityInfo>{ int resource; public ActivityInfoAdapter(Context context, int resourceId, List<ActivityInfo> objects) { super(context, resourceId, objects); resource=resourceId; } @Override public View getView(int position,View ConvertView,ViewGroup parent){ LinearLayout activityInfoView; ActivityInfo activityInfo=getItem(position); String activity_Name=activityInfo.activityName; String activity_Info=activityInfo.activityInfo; int iconIndex=activityInfo.iconIndex; if(ConvertView==null){ activityInfoView=new LinearLayout(getContext()); String inflater=Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi; vi=(LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, activityInfoView,true); }else{ activityInfoView=(LinearLayout)ConvertView; } TextView activity_NameView =(TextView)activityInfoView.findViewById(R.id.activityName); TextView activity_InfoView =(TextView)activityInfoView.findViewById(R.id.activityInfo); ImageView iconView =(ImageView)activityInfoView.findViewById(R.id.iconImage); activity_NameView.setText(activity_Name); activity_InfoView.setText(activity_Info); iconView.setImageResource(iconIndex); return activityInfoView; } } public class AndroidGraphics2DTutorial extends ListActivity { private ArrayList<ActivityInfo> activityInfos =new ArrayList<ActivityInfo>(); private ActivityInfoAdapter aa; private final static String packgeName="com.pstreets.graphics2d"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Resources res = getResources(); String[] activity_Names = res.getStringArray(R.array.activity_name); String[] activity_Infos = res.getStringArray(R.array.activity_info); for(int i=0;i<activity_Names.length;i++){ ActivityInfo activityInfo=new ActivityInfo(); activityInfo.activityName=activity_Names[i]; activityInfo.activityInfo=activity_Infos[i]; activityInfo.iconIndex=R.drawable.icon1+i; activityInfos.add(activityInfo); } aa=new ActivityInfoAdapter(this,R.layout.activitylist,activityInfos); setListAdapter(aa); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { ActivityInfo activityInfo = (ActivityInfo) l.getItemAtPosition(position); Intent intent = new Intent(); intent.setClassName(this, packgeName+".example." +activityInfo.activityName); startActivity(intent); } }
类ActivityInfo定义列表每元素Data ModelActivityIcon资源IDActivity Name及Activity
Info.
类ActivityInfoAdapter自定义Adapter关键public View getView(int position,View
ConvertView,ViewGroup parent)函数返用显示没类别元素View示例
‘叁’ Android studio .class文件手动生成dex
注:写这篇文章是为了让那些学习android 热修复的童鞋了解下,当然如果是大牛可以略过。
点击Build -->Rebuild project,点击完成后需要打包成jar 的class文件会在下面所示的目录中显示,指出的就是我们需要打包的class文件,生成的class文件在app/build/intermediates/classes中
先做个例子:这边取个.class文件,例如Test.class,用来生成dex
.class生成dex 需要用到androidstudio 支持的dx.bat ,我们找到android SDK 目录下的
build-tools文件目录。
打开cmd 运行 命令:
dx --dex --output 需要生成dex的目录和名称 class文件所在的目录
例如:我需要生成dex文件在C盘的一个文件夹目录下,而class 文件在C盘的一个目录中
这时候只要在--dex 后面加上--no-strict 就可以了。
让编译器监测不那么严格。
如下:dx --dex --no-strict --output
编译通过,成功生成dex文件。